2009-08-20 9 views
46

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 sur ma machine doit 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é minutieusement compilé manuellement).Liste de tous les utilisateurs et groupes

Comment puis-je obtenir cette liste (et la liste correspondante de tous les groupes) par programme? Je suis ouvert à d'autres (non-c) sur la base des solutions, comme AppleScript, commandline, etc.


mise à jour depuis longtemps plus tard

TALlama's answer m'a incité à enquêter sur l'API Open Directory et je trouve 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]); 
} 

qui se connectera les noms d'utilisateur de tous les utilisateurs du système. En remplaçant par kODRecordTypeGroups vous obtiendrez la liste de tous les groupes.

La méthode -[ODQuery resultsAllowingPartial:error:] est un blocage appel, de sorte que vous souhaitez soit à exécuter ce code sur un thread d'arrière-plan, ou d'utiliser un <ODQueryDelegate> pour agréger les résultats.

+0

Malheureusement, le fait que vous ayez pu faire cette liste exhaustive manuellement suggère que vous aviez déjà un moyen de l'automatiser. Vous avez probablement lu une liste de noms de répertoires ou quelque chose? Bonne question à poser cependant. Google a montré la réponse dans environ 15 secondes. – TheJacobTaylor

+0

Je l'ai eu d'un autre programme. –

+0

Clarification: l'autre programme avait la liste dans un popup, et je l'ai copié. Je veux un popup popup similaire. =) Quant à google, j'ai passé un moment à chercher des variations sur "mac get list de tous les utilisateurs" et je n'ai rien trouvé de pertinent. –

Répondre

86

L'outil que vous voulez est presque certainement dscl. Le chemin le plus court pour le faire était déjà signalé:

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

Si vous voulez des informations de sortie sur chaque utilisateur, bien que, utilisez readall:

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

Et si vous avez besoin pour analyser programatically lesdites informations, use -plist pour vous simplifier la vie:

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

Pour une raison quelconque, cela ne liste pas tous les utilisateurs, même si je cours avec sudo. Il ne montre aucun des "vrais" utilisateurs, seulement les utilisateurs du système. – cheshirekow

+0

Fonctionne sur mon installation Lion; quel OS voyez-vous échouer avec? – TALlama

+0

1.5.8. Je l'ai compris. Je ne me suis pas rendu compte qu'il y avait plusieurs façons différentes que l'osx peut authentifier. Il s'avère que j'avais besoin de l'approche "Open Directory" de JacobTaylor. – cheshirekow

12

approche Open Directory (à partir 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:" dépouiller le "nom:" et vous avez votre liste. Si vous ne disposez 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 Open Directory avant .... (soupir): Pour la liste des utilisateurs:

  • Grab le fichier/etc/passwd du système.
  • diviser par des lignes
  • fendus sur chaque ligne en fonction « : »
  • Prenez le premier symbole pour chaque ligne

Pour la liste des groupes:

  • Prenez le/fichier etc/group du système.
  • diviser par des lignes
  • fendus sur chaque ligne en fonction « : »
  • Prenez le premier symbole pour chaque ligne
+1

Je ne pense pas que cela fonctionne - grepping '/ etc/passwd' sur mon mac ne donne pas mon nom d'utilisateur. – Peter

+0

+1 même ici, mais il semble qu'il a tout le reste. Merci! Je garderai ça ouvert au cas où il y aurait un meilleur moyen. –

+3

Je crois que Directory Services remplace '/ etc/passwd'. Le fichier est probablement seulement là pour des raisons héritées. –

1

vérifier, 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 les ordures, mais quelque chose comme sed peut les nettoyer pour vous.

+0

Excellent! Juste un simple passage avec une expression régulière les a nettoyés tout de suite! Je vous remercie! –

+1

Note: 'dsexport' est limité à 256 résultats, donc ceci n'est pas garanti pour lister tous les comptes utilisateur. – smokris

8

non garbbled/non-tempfile commandes:

# dscl . list /users 
# dscl . list /groups 
+0

Wow, encore mieux! J'aime ce site! =) –

+1

Note: 'dscl -list' est limité à 256 résultats, il n'est donc pas garanti de lister tous les comptes utilisateurs. – smokris

1

Retour au bon vieux temps, nous ferions ce trivialement avec le kit NetInfo, mais aujourd'hui il n'y a aucun moyen Objective-C bien rangé pour le faire. Vous devrez vous plonger dans l'API OpenDirectory.

Questions connexes