Mac OSX:使用objective-c确定用户帐户是Active Directory用户还是本地用户



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

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

注意:理想情况下,我需要一个在10.5中也能工作的解决方案。

没有回答问题的类似帖子:

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

我想知道如何检测用户是否有本地帐户或ANY网络目录帐户(ActiveDir或OpenDir)。所以我使用开放目录框架所做的是这样的:

  1. 获取默认ODSession会话
  2. get local node–kODNodeTypeLocalNodes(我不想一直向服务器发送查询)
  3. kODAttributeTypeNFSHomeDirectory的查询节点,查询值设置为当前用户的主目录
  4. 如果找到,则意味着用户是本地的(因为我们查询本地节点ony)-用户有网络帐户

这样的东西:

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)

希望这能有所帮助。

最新更新