4

これを使用dsconfigad -showすると、出力を解析して、コンピューターがActiveDirectoryドメインにバインドされているかどうかを判断できます。

問題は、ユーザーがローカルユーザーアカウントとしてログオンしている場合でも、ActiveDirectoryドメインが返されることです。

注:理想的には、10.5でも機能するソリューションが必要です。

質問に答えない同様の投稿:

ActiveDirectory経由でMacにログインしているユーザーのドメイン名を取得するにはどうすればよいですか。

4

1 に答える 1

4

ユーザーがローカルアカウントまたは任意のネットワークディレクトリアカウント(ActiveDirまたはOpenDir)を持っているかどうかを検出する方法を探していました。したがって、OpenDirectoryフレームワークを使用して行ったことは次のようになります。

  1. デフォルトのODSessionセッションを取得する
  2. ローカルノードの取得– kODNodeTypeLocalNodes(サーバーに常にクエリを送信したくない)
  3. クエリ値が現在のユーザーのホームディレクトリに設定されているkODAttributeTypeNFSHomeDirectoryのクエリノード
  4. 見つかった場合、それはユーザーがローカルであることを意味します(ローカルノードにクエリを実行するため)–ユーザーはネットワークアカウントを持っています

だからこのようなもの:

static BOOL  isLocalUser = NO;
static BOOL shouldKeepRunning = YES;        // global

-(BOOL)isLocalUser
{
    isLocalUser = NO;   // set default to NO here
    NSError* err;
    ODSession *mySession = [ODSession defaultSession];
    ODNode *myNode = [ODNode nodeWithSession:mySession type:kODNodeTypeLocalNodes error:&err];
    ODQuery *myQuery = [ODQuery  queryWithNode: myNode
                                forRecordTypes: kODRecordTypeUsers
                                     attribute: kODAttributeTypeNFSHomeDirectory
                                     matchType: kODMatchEqualTo
                                   queryValues: NSHomeDirectory()
                              returnAttributes: kODAttributeTypeStandardOnly
                                maximumResults: 0
                                         error: &err];

    [myQuery retain];
    [myQuery setDelegate: self];
    [myQuery scheduleInRunLoop: [NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

    NSRunLoop *theRunLoop = [NSRunLoop currentRunLoop];
    while (shouldKeepRunning && [theRunLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]);

    return isLocalUser;
}

- (void)query:(ODQuery *)inSearch foundResults:(NSArray *)inResults error:(NSError *)inError
{

     if (!inResults && !inError)
     {
        [inSearch removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
        [inSearch release];
        shouldKeepRunning = NO;  // end of search
     }

     ...
     // check what you found here
     // if found any nodes, user is local so
     isLocalUser = YES;
}

もう1つのアイデアは、IDサービスを使用することです。

  1. 現在のユーザーのIDを取得します(CSIdentityQueryCreateForCurrentUser)
  2. そこから権限を取得します(CSIdentityGetAuthority)
  3. 地方自治体かどうかを確認する(CSGetLocalIdentityAuthority)

お役に立てれば。

于 2013-03-08T00:21:42.603 に答える