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

时间:2013-02-15 22:55:07

标签: objective-c macos active-directory

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

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

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

类似不回答问题的帖子:

How can I get the domain name for a user logged into a Mac via Active Directory

1 个答案:

答案 0 :(得分:3)

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

  1. 获取默认的ODSession会话
  2. 获取本地节点 - kODNodeTypeLocalNodes(我不想一直向服务器发送查询)
  3. kODAttributeTypeNFSHomeDirectory的查询节点,查询值设置为当前用户的主目录
  4. 如果找到则表示用户是本地用户(因为我们查询本地节点) - 用户有网络帐户
  5. 这样的事情:

    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)
    4. 希望这有帮助。