Lista wszystkich użytkowników i grup
Próbuję zdobyć listę wszystkich użytkowników i wszystkich grup na Mac OS X 10.5+. Jak mogę to zrobić?
Na przykład lista wszystkich użytkowników na moim komputerze powinna powrócić:
_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
(został starannie skompilowany ręcznie).
Jak mogę programowo uzyskać tę listę (i odpowiadającą jej listę wszystkich grup)? Jestem otwarty na alternatywne (Nie oparte na c) rozwiązania, takie jak Applescript, wiersz poleceń, itp.
Aktualizuj przez długi czas później
Odpowiedź TALlama skłoniła mnie do zbadania API do Open Directory i odkryłem, że listę tę można łatwo zdobyć programowo:
#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]);
}
, który zarejestruje nazwy użytkowników każdego użytkownika w systemie. Podstawianie w kODRecordTypeGroups
spowoduje wyświetlenie listy wszystkich grup.
Metoda -[ODQuery resultsAllowingPartial:error:]
jest wywołaniem blokującym, więc albo chcesz wykonać ten kod w wątku tła, albo użyć <ODQueryDelegate>
do zagregowania wyników.
5 answers
Narzędzie, które chcesz, to prawie na pewno dscl. Najkrótsza droga do tego była już wskazana:
$ dscl . list /users
$ dscl . list /groups
Jeśli chcesz wyświetlać informacje o każdym użytkowniku, użyj readall
:
$ dscl . readall /users
$ dscl . readall /groups
I jeśli chcesz programowo przeanalizować wspomniane informacje, użyj -plist, aby ułatwić sobie życie:
$ dscl -plist . readall /users
$ dscl -plist . readall /groups
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-20 18:40:39
Open Directory approach (from: http://rickcogley.blogspot.com/2008/11/listing-open-directory-users-on-os-x.html):
dscacheutil -q user
dscacheutil -q group
Weź każdą linię z odpowiedniego wyjścia, które zaczyna się od " name: "Usuń" name: "i masz swoją listę. Jeśli nie masz dscacheutil, możesz użyć poleceń ręcznych:
root# dscl localhost list /Local/Default/Users
root# dscl localhost list /LDAPv3/127.0.0.1/Users
Old school approach for before Open Directory....(westchnienie): Dla listy użytkowników:
- Pobierz plik / etc / passwd z system.
- Podziel to na linie
- podziel każdy wiersz na podstawie": "
- weź pierwszy symbol dla każdej linii
Dla listy grup:
- Pobierz plik / etc / group z systemu.
- Podziel to na linie
- podziel każdy wiersz na podstawie": "
- weź pierwszy symbol dla każdej linii
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-20 03:17:00
Polecenia Non-garbbled/no-tempfile:
# dscl . list /users
# dscl . list /groups
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-20 02:16:32
Sprawdź, na przykład, dsexport .
Oto kilka przykładów:
dsexport /tmp/export.out /Local/Default dsRecTypeStandard:Groups
dsexport /tmp/export.out /Local/Default dsRecTypeStandard:Users
Wyjścia są trochę beznadziejne, ale coś takiego jak sed może je wyczyścić za Ciebie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-20 02:02:57
W dawnych czasach robiliśmy to trywialnie z zestawem NetInfo, ale dziś nie ma na to porządnego Objective-C. Będziesz musiał przekopać się do API OpenDirectory.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-20 08:51:40