Domanda

Sto cercando di ottenere un elenco di tutti gli gli utenti e tutti i gruppi su Mac OS X 10.5 e versioni successive. Come posso fare questo?

Ad esempio, l'elenco di tutti gli utenti sulla mia macchina deve restituire: _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 (che è stato faticosamente compilato manualmente).

Come posso ottenere quella lista (e la corrispondente lista di tutti i gruppi) di programmazione? Sono aperto a soluzioni alternative (non c based), come Applescript, a riga di comando, ecc.


Aggiornamento di un lungo periodo di tempo più tardi

di TALlama risposta mi ha spinto a indagare l'API per Open Directory, e ho scoperto che questa lista può essere facilmente acquisito a livello di codice :

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

Che registrare i nomi utente di tutti gli utenti del sistema. Sostituendo in kODRecordTypeGroups otterrà l'elenco di tutti i gruppi.

Il metodo -[ODQuery resultsAllowingPartial:error:] è un blocco di chiamata, in modo che ci sia desidera eseguire questo codice su un thread in background, o utilizzare un <ODQueryDelegate> per aggregare i risultati.

È stato utile?

Soluzione

Lo strumento che si desidera è quasi certamente dscl. La via più breve per farlo è stato già sottolineato:

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

Se si desidera informazioni in uscita su ogni utente, però, utilizzare readall:

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

E se avete bisogno di analizzare programatically tali informazioni, utilizzare -plist per rendere la vita più facile:

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

Altri suggerimenti

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

dscacheutil -q user
dscacheutil -q group

Prendere ogni linea dalla rispettiva uscita che inizia con "Nome:" strip off il "nome:" e avete la vostra lista. Se non si dispone di dscacheutil, è possibile utilizzare i comandi manuali:

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

Old approccio scuola per prima Open Directory .... (sigh): Per la lista di utenti:

  • Afferra il file / etc / passwd dal sistema.
  • Split fuori dalle linee
  • Dividi ogni riga sulla base di ":"
  • Prendere il primo simbolo per ogni linea

Per la lista dei gruppi:

  • Afferra il file / etc / gruppo dal sistema.
  • Split fuori dalle linee
  • Dividi ogni riga sulla base di ":"
  • Prendere il primo simbolo per ogni linea

comandi non garbbled / no-File Temporanei:

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

controllare, ad esempio, dsexport .

Ecco alcuni esempi:

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

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

le uscite sono un po 'spazzatura, ma qualcosa di simile sed potevano pulire per voi.

Torna ai vecchi tempi, avremmo fatto questo banalmente con il kit NetInfo, ma oggi non c'è alcun ordine modo Objective-C per farlo. Dovrete scavare dentro alle API OpenDirectory.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top