2013-02-15 35 views

回答

3

我一直在寻找如何在用户的本地帐户或任何网络目录帐户(ActiveDir或执行opendir)检测。因此,我已经使用开放式目录框架做的是这样的:

  1. 获取缺省ODSession会议
  2. 获得本地节点 - kODNodeTypeLocalNodes(我不想查询发送到服务器的所有时间)
  3. 查询与如发现查询值设置为当前用户的主目录
  4. 节点kODAttributeTypeNFSHomeDirectory则意味着用户是本地的,如果不是(bacause我们查询本地节点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)

希望这可以帮助。

相关问题