2009-08-20 7 views
46

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?Elenco di tutti gli utenti e gruppi

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 accuratamente compilato manualmente).

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


aggiornamento molto tempo dopo

TALlama's answer mi ha spinto a indagare l'API per aprire la directory e ho scoperto che questa lista può essere facilmente acquisita 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 registrerà i nomi utente di tutti gli utenti del sistema. Sostituendo in kODRecordTypeGroups otterrai l'elenco di tutti i gruppi.

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

+0

Purtroppo, il fatto che sei stato in grado di fare manualmente quella lista esaustiva suggerisce che hai già un modo per automatizzarlo. Presumi presumibilmente un elenco di nomi di directory o qualcosa del genere? Grande domanda da pormi però. Google ha risposto alla domanda in circa 15 secondi. – TheJacobTaylor

+0

L'ho preso da un altro programma. –

+0

Chiarimento: l'altro programma aveva la lista in un pulsante popup, e l'ho copiato. Voglio un popup popup simile. =) Per quanto riguarda google, ho passato un po 'di tempo a cercare varianti su "mac get list di tutti gli utenti" e non ho trovato nulla di rilevante. –

risposta

86

Lo strumento che si desidera è quasi certamente dscl. La via più breve per farlo era 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 dette informazioni, usa -plist per semplificarti la vita:

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

Per qualche motivo, questo non elenca tutti gli utenti, anche se corro con sudo. Non mostra nessuno degli utenti "reali", solo quelli di sistema. – cheshirekow

+0

Funziona sull'installazione di Lion; con quale sistema operativo vedi che fallisce? – TALlama

+0

1.5.8. L'avevo capito. Non mi rendevo conto che c'erano diversi modi in cui osx può autenticarsi. Ho scoperto che avevo bisogno dell'approccio "Open Directory" di JacobTaylor. – cheshirekow

12

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:" togliere 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 

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

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

Per la lista dei gruppi:

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

Non penso che funzioni: grepping '/ etc/passwd' sul mio Mac non fornisce il mio nome utente. – Peter

+0

+1 qui, ma sembra che abbia tutto il resto. Grazie! Lo terrò aperto nel caso ci sia un modo migliore. –

+3

Credo che Directory Services sostituisca '/ etc/passwd'. Il file è probabilmente solo lì per motivi legacy. –

1

check-out, per 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 loro potrebbe pulire per voi.

+0

Eccellente! Basta un semplice passaggio con un'espressione regolare per ripulirli subito! Grazie! –

+1

Nota: 'dsexport' è limitato a 256 risultati, quindi non è garantito l'elenco di tutti gli account utente. – smokris

8

non garbbled/comandi no-tempfile:

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

Wow, ancora meglio! Adoro questo sito! =) –

+1

Nota: 'dscl -list' è limitato a 256 risultati, quindi non è garantito l'elenco di tutti gli account utente. – smokris

1

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