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:
- get séance default ODSession
- obtenir nœud local - kODNodeTypeLocalNodes (je ne veux pas envoyer des requêtes au serveur tout le temps)
- requête noeud pour kODAttributeTypeNFSHomeDirectory avec interrogation valeur définie sur le répertoire de l'utilisateur actuel
- 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é:
- obtenir l'identité de l'utilisateur actuel (CSIdentityQueryCreateForCurrentUser)
- obtenir l'autorité de ce (CSIdentityGetAuthority)
- voir si c'est l'autorité locale (CSGetLocalIdentityAuthority)
J'espère que cela aide.