55 votes

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 cela ?

Par exemple, la liste de tous les utilisateurs de ma machine devrait retourner : _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é laborieusement compilé manuellement).

Comment puis-je obtenir cette liste (et la liste correspondante de tous les groupes) de manière programmatique ? Je suis ouvert à d'autres solutions (non basées sur le programme), comme Applescript, la ligne de commande, etc.


Mise à jour un long moment plus tard

La réponse de TALlama m'a incité à enquêter sur l'API de l'Open Directory, et j'ai découvert que cette liste peut être facilement acquise par programmation :

#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 permettra d'enregistrer les noms d'utilisateur de tous les utilisateurs du système. En remplaçant par kODRecordTypeGroups vous obtiendra la liste de tous les groupes.

En -[ODQuery resultsAllowingPartial:error:] est une méthode blocage il faut donc soit exécuter ce code sur un thread d'arrière-plan, soit utiliser un fichier <ODQueryDelegate> pour agréger les résultats.

102voto

TALlama Points 4652

L'outil que vous voulez est presque certainement dscl. La façon la plus courte de le faire a déjà été indiquée :

$ dscl . list /users
$ dscl . list /groups

Cependant, si vous voulez produire des informations sur chaque utilisateur, utilisez readall :

$ dscl . readall /users
$ dscl . readall /groups

Et si vous devez analyser ces informations de manière programmatique, utilisez -plist pour vous faciliter la vie :

$ dscl -plist . readall /users
$ dscl -plist . readall /groups

12voto

TheJacobTaylor Points 2982

Approche de l'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 :" enlevez 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 de la vieille école avant l'Open Directory.... (soupir) : Pour la liste des utilisateurs :

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

Pour la liste des groupes :

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

8voto

eduffy Points 17061

Commandes sans barbe ni fichier temporaire :

# dscl . list /users
# dscl . list /groups

1voto

Peter Points 38320

À la caisse, 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 merdiques, mais quelque chose comme sed pourrait les nettoyer pour vous.

1voto

NSResponder Points 14459

Autrefois, nous pouvions le faire de manière triviale avec le NetInfo Kit, mais aujourd'hui, il n'y a pas de moyen propre en Objective-C pour le faire. Vous devrez vous plonger dans l'API d'OpenDirectory.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X