2013-02-15 3 views
1

Il est possible d'analyser la sortie et de déterminer si l'ordinateur est lié à un domaine Active Directory.Mac OSX: Déterminer si le compte utilisateur est un utilisateur Active Directory ou un utilisateur local utilisant objectif-c

Le problème est que le domaine Active Directory est renvoyé même si l'utilisateur est connecté en tant que compte d'utilisateur local.

Note: Idéalement, j'ai besoin d'une solution qui fonctionne également en 10.5.

messages similaires qui ne sont pas répondre à la question:

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

Répondre

3

que je cherchais à la façon de détecter si l'utilisateur a un compte local ou un compte de répertoire réseau (ActiveDir ou OpenDir). Donc ce que je l'ai fait en utilisant le framework Open Directory est comme ceci:

  1. get séance default ODSession
  2. obtenir nœud local - kODNodeTypeLocalNodes (je ne veux pas envoyer des requêtes au serveur tout le temps)
  3. requête noeud pour kODAttributeTypeNFSHomeDirectory avec interrogation valeur définie sur le répertoire de l'utilisateur actuel
  4. se trouve alors cela signifie que l'utilisateur est local sinon (bacause nous interrogeons ony de nœud local) - utilisateur compte réseau

donc quelque chose comme ceci:

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; 
} 

Une autre idée est d'utiliser les services d'identité:

  1. obtenir l'identité de l'utilisateur actuel (CSIdentityQueryCreateForCurrentUser)
  2. obtenir l'autorité de ce (CSIdentityGetAuthority)
  3. voir si c'est l'autorité locale (CSGetLocalIdentityAuthority)

J'espère que cela aide.

Questions connexes