Elenco di tutti gli utenti e gruppi
-
19-09-2019 - |
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.
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.