web-dev-qa-db-fra.com

Liste de tous les utilisateurs et groupes

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.

53
Dave DeLong

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
99
TALlama

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:

  • Récupérez le fichier/etc/passwd sur le système.
  • Séparez-le par lignes
  • Répartissez chaque ligne en fonction de ":"
  • Prenez le premier symbole pour chaque ligne

Pour la liste des groupes:

  • Récupérez le fichier/etc/group sur le système.
  • Séparez-le par lignes
  • Répartissez chaque ligne en fonction de ":"
  • Prenez le premier symbole pour chaque ligne
12
TheJacobTaylor

Commandes non brouillées/sans fichier temporaire:

# dscl . list /users
# dscl . list /groups
8
eduffy

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.

1
Peter

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.

1
NSResponder