2009-08-20 27 views
46

Estoy tratando de obtener una lista de todos los usuarios y todos los grupos en Mac OS X 10.5+. ¿Cómo puedo hacer esto?Lista de todos los usuarios y grupos

Por ejemplo, la lista de todos los usuarios en mi máquina debería devolver: _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 (que se compiló minuciosamente manualmente).

¿Cómo puedo obtener esa lista (y la lista correspondiente de todos los grupos) mediante programación? Estoy abierto a soluciones alternativas (no basados ​​en c), como Applescript, comandos, etc.


actualización de un largo tiempo después

TALlama's answer me llevó a investigar la API para abrir el directorio y me encontré con que esta lista puede ser fácilmente adquiridos mediante programación:

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

que registrará los nombres de usuario de cada usuario en el sistema. Sustituyendo en kODRecordTypeGroups obtendrá la lista de todos los grupos.

El método -[ODQuery resultsAllowingPartial:error:] es una bloqueo de llamadas, así que más bien desea ejecutar este código en un subproceso de fondo, o utilizar una <ODQueryDelegate> agregar los resultados.

+0

Lamentablemente, el hecho de que haya podido hacer esa lista exhaustiva de forma manual sugiere que ya tenía una forma de automatizarla. ¿Presumiblemente leíste una lista de nombres de directorios o algo así? Una gran pregunta para preguntar sin embargo. Google apareció la respuesta en aproximadamente 15 segundos. – TheJacobTaylor

+0

Lo obtuve de otro programa. –

+0

Aclaración: el otro programa tenía la lista en un botón emergente, y lo copié. Quiero un botón emergente similar. =) En cuanto a google, pasé un tiempo buscando variaciones en "mac get list of all users" y no pude encontrar nada relevante. –

Respuesta

86

La herramienta que desea es casi seguro dscl. El camino más corto para hacerlo era ya señaló:

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

Si desea información de salida acerca de cada usuario, sin embargo, utilizan readall:

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

y si es necesario para analizar programáticamente dicha información, use -plist para hacer su vida más fácil:

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

Por alguna razón, esto no muestra todos los usuarios, incluso si ejecuto sudo. No muestra ninguno de los usuarios "reales", solo los que son del sistema. – cheshirekow

+0

Funciona en mi instalación Lion; ¿con qué OS estás viendo que falla? – TALlama

+0

1.5.8. Me lo imaginé. No me di cuenta de que había varias maneras diferentes en que osx puede autenticarse. Resulta que necesitaba el enfoque de "Open Directory" de JacobTaylor. – cheshirekow

12

enfoque Open Directory (a partir de: http://rickcogley.blogspot.com/2008/11/listing-open-directory-users-on-os-x.html):

dscacheutil -q user 
dscacheutil -q group 

tomar cada línea de la salida correspondiente que empieza con "nombre:" quitarse el "nombre:" y usted tiene su lista. Si usted no tiene dscacheutil, puede utilizar los comandos manuales:

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

enfoque de la vieja escuela para antes de directorio abierto .... (suspiro): Para lista de usuarios:

  • Grab el archivo/etc/passwd del sistema.
  • dividirlo por líneas
  • Dividir a cabo cada línea basado en ":"
  • Tome el primer símbolo para cada línea

Para la lista de grupos:

  • Grab el/etc/archivo de grupo del sistema.
  • dividirlo por líneas
  • Dividir a cabo cada línea basado en ":"
  • Tome el primer símbolo para cada línea
+1

. No creo que esto funcione. Emparejar '/ etc/passwd' en mi mac no da mi nombre de usuario. – Peter

+0

+1 lo mismo aquí, pero parece que tiene todo lo demás. ¡Gracias! Lo mantendré abierto en caso de que haya una mejor manera. –

+3

Creo que Directory Services reemplaza '/ etc/passwd'. El archivo probablemente solo esté allí por razones heredadas. –

1

registro de salida, por ejemplo, dsexport.

Éstos son algunos ejemplos:

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

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

las salidas son un poco basura, sino algo así como sed podría limpiarlos para usted.

+0

¡Excelente! ¡Solo un simple pase con una expresión regular los ha limpiado! ¡Gracias! –

+1

Nota: 'dsexport' está limitado a 256 resultados, por lo que no está garantizado que se enumeren todas las cuentas de usuario. – smokris

8

para no garbbled/comandos no-tempfile:

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

¡Guau, aún mejor! Me encanta este sitio! =) –

+1

Nota: 'dscl -list' está limitado a 256 resultados, por lo que no está garantizado que se enumeren todas las cuentas de usuario. – smokris

1

En los viejos días, nos gustaría hacer este trivialmente con el Kit NetInfo, pero hoy en día no hay manera ordenada Objective-C para hacerlo. Tendrás que profundizar en la API de OpenDirectory.

Cuestiones relacionadas