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.

Author: Community, 2009-08-20

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
 90
Author: TALlama,
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
 12
Author: TheJacobTaylor,
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
 8
Author: eduffy,
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.

 1
Author: Peter,
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.

 1
Author: NSResponder,
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