2009-08-20 11 views
46

Ich versuche, eine Liste von alle Benutzer und alle Gruppen auf Mac OS X 10.5 + zu erhalten. Wie kann ich das machen?Liste aller Benutzer und Gruppen

Zum Beispiel sollte die Liste aller Benutzer auf meinem Computer zurückgeben: _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 (das wurde mühsam manuell kompiliert).

Wie kann ich diese Liste (und die entsprechende Liste aller Gruppen) programmatisch erhalten? Ich bin offen für alternative (nicht-c basiert) Lösungen, wie Applescript, Kommandozeilen usw.


-Update eine lange Zeit später

TALlama's answer mich aufgefordert, die API zu untersuchen Open Directory und ich fand, dass diese Liste leicht programmatisch erworben werden:

#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]); 
} 

, dass die Benutzernamen der einzelnen Benutzer auf dem System anmelden. Durch das Ersetzen in kODRecordTypeGroups erhalten Sie die Liste aller Gruppen.

Die -[ODQuery resultsAllowingPartial:error:] Methode ist ein Anrufblockierung, so würden Sie entweder diesen Code auf einem Hintergrund-Thread ausgeführt werden soll, oder eine <ODQueryDelegate> verwenden, um die Ergebnisse zu aggregieren.

+0

Leider konnte die Tatsache, dass Sie diese erschöpfende Liste manuell erstellen konnten, darauf hindeuten, dass Sie bereits eine Möglichkeit hatten, sie zu automatisieren. Sie lesen vermutlich eine Liste von Verzeichnisnamen oder etwas? Eine gute Frage, die man stellen sollte. Google hat die Antwort in ungefähr 15 Sekunden angezeigt. – TheJacobTaylor

+0

Ich habe es von einem anderen Programm. –

+0

Klarstellung: das andere Programm hatte die Liste in einer Popup-Taste, und ich habe es kopiert. Ich möchte eine ähnliche Popup-Schaltfläche. =) Wie bei Google habe ich eine Weile nach Variationen auf "Mac Get Liste aller Benutzer" gesucht und konnte nichts relevantes finden. –

Antwort

86

Das Werkzeug, das Sie wollen, ist fast sicher dscl. Der kürzeste Weg zu tun, zeigte es schon aus:

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

Wenn Sie über jeden Benutzer zur Ausgabe von Informationen wollen, obwohl, verwenden readall:

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

Und wenn Sie brauchen, um programmatisch sagte zu analysieren Informationen, Verwenden Sie -plist, um Ihr Leben einfacher zu machen:

+0

Aus irgendeinem Grund listet dies nicht alle Benutzer auf, auch wenn ich mit sudo laufe. Es zeigt keinen der "echten" Benutzer, nur die systemeigenen. – cheshirekow

+0

Funktioniert auf meinem Lion installieren; Mit welchem ​​Betriebssystem versagst du es? – TALlama

+0

1.5.8. Ich habe es herausgefunden. Ich wusste nicht, dass es verschiedene Möglichkeiten gibt, wie osx authentifizieren kann. Es stellte sich heraus, dass ich Jacob Taylor's "Open Directory" -Ansatz brauchte. – cheshirekow

12

Open Directory Ansatz (aus: http://rickcogley.blogspot.com/2008/11/listing-open-directory-users-on-os-x.html):

dscacheutil -q user 
dscacheutil -q group 

jede Zeile von dem jeweiligen Ausgang nehmen, die mit "Name:" startet den "Name:" abzustreifen und Sie haben Ihre Liste. Wenn Sie nicht dscacheutil haben, können Sie die manuellen Befehle zur Verfügung:

root# dscl localhost list /Local/Default/Users 
root# dscl localhost list /LDAPv3/127.0.0.1/Users 

Alte Schule Ansatz für vor Open Directory .... (seufz): Für Liste der Benutzer:

  • Schnappen die Datei/etc/passwd vom System.
  • es Split durch Linien aus
  • Split aus jeder Zeile basierend auf ":"
  • Nehmen Sie das erste Symbol für jede Zeile

Für Liste der Gruppen:

  • Ergreifen Sie die/etc/group-Datei aus dem System.
  • es Split durch Linien aus
  • aus Split jede Zeile basierend auf ":"
  • das erste Symbol für jede
  • Linie Nehmen
+1

Ich glaube nicht, dass das funktioniert - grepping '/ etc/passwd' auf meinem Mac ergibt nicht meinen Benutzernamen. – Peter

+0

+1 gleich hier, aber es scheint, als hätte es alles andere. Vielen Dank! Ich werde das offen halten, falls es einen besseren Weg gibt. –

+3

Ich glaube, dass Directory Services '/ etc/passwd' ersetzt. Die Datei ist wahrscheinlich nur aus Legacy-Gründen da. –

1

Check-out, zum Beispiel dsexport.

Hier sind einige Beispiele:

dsexport /tmp/export.out /Local/Default dsRecTypeStandard:Groups 

dsexport /tmp/export.out /Local/Default dsRecTypeStandard:Users 

die Ausgänge sind ein bisschen Müll, aber so etwas wie sed könnte sie für Sie aufzuräumen.

+0

Ausgezeichnet! Nur ein einfacher Pass mit einem regulären Ausdruck hat sie aufgeräumt! Vielen Dank! –

+1

Hinweis: 'dsexport' ist auf 256 Ergebnisse beschränkt, daher wird nicht garantiert, dass alle Benutzerkonten aufgelistet werden. – smokris

8

Nicht garbbled/no-tempfile Befehle:

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

Wow, noch besser! Ich liebe diese Seite! =) –

+1

Hinweis: 'dscl -list' ist auf 256 Ergebnisse beschränkt, daher wird nicht garantiert, dass alle Benutzerkonten aufgelistet werden. – smokris

1

Zurück in den alten Tagen, wir diesen trivialen mit dem NetInfo Kit tun würden, aber heute gibt es keine ordentliche Objective-C Art und Weise, es zu tun. Sie müssen sich in die OpenDirectory API einarbeiten.

Verwandte Themen