Pergunta

Eu estou tentando obter uma lista de todas usuários e todos os grupos no Mac OS X 10.5+. Como posso fazer isso?

Por exemplo, a lista de todos os usuários na minha máquina deve retornar: _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 foi cuidadosamente compilado manualmente).

Como posso obter essa lista (ea lista correspondente de todos os grupos) de programação? Estou aberto a soluções alternativas (não-c base), como AppleScript, comando, etc.


Atualizar um longo tempo depois

de TALlama me levou a investigar a API para Open Directory, e eu achei que esta lista pode ser facilmente adquiridos por meio de programação :

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

Isso irá registrar os nomes de usuário de cada usuário no sistema. Substituindo em kODRecordTypeGroups você vai ter a lista de todos os grupos.

O método -[ODQuery resultsAllowingPartial:error:] é uma bloqueando chamada, assim que você quer quer executar este código em um segmento de segundo plano, ou usar um <ODQueryDelegate> para agregar os resultados.

Foi útil?

Solução

A ferramenta que você quer é quase certamente dscl. O caminho mais curto para fazê-lo já foi apontado:

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

Se você quiser informações de saída sobre cada usuário, no entanto, o uso readall:

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

E se você precisa para programaticamente disse parse informações, use -plist para tornar sua vida mais fácil:

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

Outras dicas

abordagem 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

Tome cada linha a partir da respectiva saída que começa com "name:" retirar o "nome:" e você tem sua lista. Se você não tem dscacheutil, você pode usar os comandos manuais:

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

abordagem da velha escola para antes Open Directory .... (suspiro): Para a lista de usuários:

  • Grab o arquivo / etc / passwd do sistema.
  • Split-lo por linhas
  • Split cada linha baseada no ":"
  • Dê o primeiro símbolo para cada linha

Para lista de grupos:

  • Grab arquivo / etc / grupo do sistema.
  • Split-lo por linhas
  • Split cada linha baseada no ":"
  • Dê o primeiro símbolo para cada linha

comandos não-garbbled / não-ficheiro temporário:

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

check-out, por exemplo, dsexport .

Aqui estão alguns exemplos:

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

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

as saídas são um pouco lixo, mas algo como sed poderia limpá-los para você.

De volta aos velhos dias, faríamos isso trivialmente com o Kit NetInfo, mas hoje não há nenhuma maneira arrumado Objective-C para fazê-lo. Você vai ter que cavar para a API OpenDirectory.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top