Lista de todos os usuários e grupos
-
19-09-2019 - |
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.
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.