4

使用dsconfigad -show它可以解析输出并确定计算机是否绑定到 Active Directory 域。

问题是即使用户作为本地用户帐户登录,也会返回 Active Directory 域。

注意:理想情况下,我需要一个同样适用于 10.5 的解决方案。

不回答问题的类似帖子:

如何获取通过 Active Directory 登录 Mac 的用户的域名

4

1 回答 1

4

我正在寻找如何检测用户是否有本地帐户或任何网络目录帐户(ActiveDir 或 OpenDir)。所以我使用 Open Directory 框架所做的事情是这样的:

  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. 获取当前用户的身份(CSIdentityQueryCreateForCurrentUser)
  2. 从中获取权限 (CSIdentityGetAuthority)
  3. 看看它是否是本地权威(CSGetLocalIdentityAuthority)

希望这可以帮助。

于 2013-03-08T00:21:42.603 回答