J'essaie d'obtenir une liste de tous les utilisateurs et tous les groupes sur Mac OS X 10.5+. Comment puis-je faire ceci?
Par exemple, la liste de tous les utilisateurs de ma machine doit renvoyer: _amavisd, _appowner, _appserver, _ard, _atsserver, _calendar, _carddav, _clamav, _coreaudiod, _cvmsroot, _cvs, _cyrus, _devdocs, _dovecot, _eppc, _installer, _Jabber, _lda, _locationd, _lp, _mailman, _mcxalr, _mdnsresponder, _mysql, _pcastagent, _pcastserver, _postfix, _qtss, _sandbox, _screensaver, _securityagent, _serialnumberd, _softwareupdate, _spotlight, _sshd, _svn, _teamsserver, _timezone, _tokend, _trustevaluationagent, _unknown, _update_sharing, _usbmuxd, _uucp, _windowserver, _www, _xgridagent, _xgridcontroller, daemon, dave, nobody, root
(qui a été minutieusement compilé manuellement).
Comment puis-je obtenir cette liste (et la liste correspondante de tous les groupes) par programme? Je suis ouvert à des solutions alternatives (non basées sur c), telles que Applescript, la ligne de commande, etc.
Mettre à jour longtemps après
réponse de TALlama m'a incité à enquêter sur l'API pour Open Directory, et j'ai trouvé que cette liste peut être facilement acquise par programme:
#import <OpenDirectory/OpenDirectory.h>
ODSession *s = [ODSession defaultSession];
ODNode *root = [ODNode nodeWithSession:s name:@"/Local/Default" error:nil];
ODQuery *q = [ODQuery queryWithNode:root forRecordTypes:kODRecordTypeUsers attribute:nil matchType:0 queryValues:nil returnAttributes:nil maximumResults:0 error:nil];
NSArray *results = [q resultsAllowingPartial:NO error:nil];
for (ODRecord *r in results) {
NSLog(@"%@", [r recordName]);
}
Cela enregistrera les noms d'utilisateur de chaque utilisateur du système. La substitution dans kODRecordTypeGroups
vous donnera la liste de tous les groupes.
Le -[ODQuery resultsAllowingPartial:error:]
la méthode est un appel bloquant, vous devez donc soit exécuter ce code sur un thread d'arrière-plan, soit utiliser un <ODQueryDelegate>
pour agréger les résultats.
L'outil que vous voulez est presque certainement dscl. Le moyen le plus court de le faire a déjà été indiqué:
$ dscl . list /users
$ dscl . list /groups
Cependant, si vous souhaitez générer des informations sur chaque utilisateur, utilisez readall
:
$ dscl . readall /users
$ dscl . readall /groups
Et si vous devez analyser ces informations par programme, utilisez -plist pour vous faciliter la vie:
$ dscl -plist . readall /users
$ dscl -plist . readall /groups
Approche Open Directory (de: http://rickcogley.blogspot.com/2008/11/listing-open-directory-users-on-os-x.html ):
dscacheutil -q user
dscacheutil -q group
Prenez chaque ligne de la sortie respective qui commence par "nom:" supprimez le "nom:" et vous avez votre liste. Si vous n'avez pas dscacheutil, vous pouvez utiliser les commandes manuelles:
root# dscl localhost list /Local/Default/Users
root# dscl localhost list /LDAPv3/127.0.0.1/Users
Approche old school pour avant Open Directory .... (soupir): Pour la liste des utilisateurs:
Pour la liste des groupes:
Commandes non brouillées/sans fichier temporaire:
# dscl . list /users
# dscl . list /groups
consultez, par exemple, dsexport .
Voici quelques exemples:
dsexport /tmp/export.out /Local/Default dsRecTypeStandard:Groups
dsexport /tmp/export.out /Local/Default dsRecTypeStandard:Users
les sorties sont un peu nulles, mais quelque chose comme sed pourrait les nettoyer pour vous.
Dans le passé, nous faisions cela trivialement avec le kit NetInfo, mais aujourd'hui, il n'y a pas de manière ordonnée d'Objective-C pour le faire. Vous devrez vous connecter à l'API OpenDirectory.