Frage

Ich versuche, eine Liste von bekommen alle Benutzer und alle Gruppen auf Mac OS X 10.5 und höher. Wie kann ich das tun?

Zum Beispiel sollte die Liste aller Benutzer auf meiner Maschine zurück: _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 sorgfältig zusammengestellt manuell).

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


Aktualisieren Sie eine lange Zeit später

TALlama Antwort mich dazu veranlasst, 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]);
}

Das wird die Benutzernamen der einzelnen Benutzer auf dem System anmelden. Setzt man in kODRecordTypeGroups erhalten Sie die Liste aller Gruppen.

Die -[ODQuery resultsAllowingPartial:error:] Methode ist ein Sperrung Anruf, so dass Sie entweder wollen würden auf einem Hintergrund-Thread diesen Code auszuführen, oder eine <ODQueryDelegate> verwenden, um die Ergebnisse zu aggregieren.

War es hilfreich?

Lösung

Das Werkzeug, das Sie wollen, ist mit ziemlicher Sicherheit dscl. Der kürzeste Weg, es zu tun, wurde bereits darauf hingewiesen:

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

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

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

Und wenn Sie brauchen, um programmatisch die Informationen zu analysieren, verwenden -plist Sie das Leben leichter zu machen:

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

Andere Tipps

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

dscacheutil -q user
dscacheutil -q group

Nehmen Sie jede Zeile von dem jeweiligen Ausgang, die mit „Name:“ Streifen aus dem „Name:“ 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:

  • Besorgen Sie sich die Datei / etc / passwd-Datei aus dem System.
  • Es spaltete sich aus durch Linien
  • Split aus jeder Zeile auf ":"
  • Nehmen Sie das erste Symbol für jede Zeile

Für Liste der Gruppen:

  • Besorgen Sie sich die / etc / group-Datei aus dem System.
  • Es spaltete sich aus durch Linien
  • Split aus jeder Zeile auf ":"
  • Nehmen Sie das erste Symbol für jede Zeile

Nicht-garbbled / Nein-tempfile Befehle:

# dscl . list /users
# dscl . list /groups
scroll top