Список всех пользователей и групп
Я пытаюсь получить список всех пользователей и всех групп в Mac OS X 10.5+. Как я могу это сделать?
Например, список всех пользователей моей машины должен возвращать:
_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
(это было тщательно скомпилировано вручную).
Как я могу получить этот список (и соответствующий список всех групп) программным путем? Я открыт для альтернативных решений (на основе не-c), таких как Applescript, commandline и т.д.
Обновление долгое время
Ответ TALlama побудил меня исследовать API для открытия каталога, и я обнаружил, что этот список можно легко получить программным путем:
#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]);
}
Это будет регистрировать имена пользователей каждого пользователя в системе. Подставляя в kODRecordTypeGroups
, вы получите список всех групп.
Метод -[ODQuery resultsAllowingPartial:error:]
- это блокирующий вызов, поэтому вы хотите либо выполнить этот код в фоновом потоке, либо использовать <ODQueryDelegate>
для агрегирования результатов.
Ответы
Ответ 1
Инструмент, который вы хотите, почти наверняка dscl. Уже был указан самый короткий способ сделать это:
$ dscl . list /users
$ dscl . list /groups
Если вы хотите выводить информацию о каждом пользователе, используйте readall
:
$ dscl . readall /users
$ dscl . readall /groups
И если вам нужно программно разобрать указанную информацию, используйте -plist, чтобы сделать вашу жизнь проще:
$ dscl -plist . readall /users
$ dscl -plist . readall /groups
Ответ 2
Открытый подход к каталогу (от: http://rickcogley.blogspot.com/2008/11/listing-open-directory-users-on-os-x.html):
dscacheutil -q user
dscacheutil -q group
Возьмите каждую строку из соответствующего выхода, начинающегося с "name:", отмените имя "name:", и у вас есть свой список.
Если у вас нет dscacheutil, вы можете использовать ручные команды:
root# dscl localhost list /Local/Default/Users
root# dscl localhost list /LDAPv3/127.0.0.1/Users
Старый школьный подход для Open Directory.... (вздох):
Список пользователей:
- Возьмите файл /etc/passwd из системы.
- Разделить его по строкам
- Разделите каждую строку на основе::
- Возьмите первый символ для каждой строки
Список групп:
- Возьмите файл /etc/group из системы.
- Разделить его по строкам
- Разделите каждую строку на основе::
- Возьмите первый символ для каждой строки
Ответ 3
Команды, не связанные с garbbled/no-tempfile:
# dscl . list /users
# dscl . list /groups
Ответ 4
проверьте, например, dsexport.
Вот несколько примеров:
dsexport /tmp/export.out /Local/Default dsRecTypeStandard:Groups
dsexport /tmp/export.out /Local/Default dsRecTypeStandard:Users
выходы немного мусор, но что-то вроде sed может их очистить.
Ответ 5
Вернемся к старым временам, мы сделали бы это тривиально с NetInfo Kit, но сегодня там нет опрятного Objective-C способа сделать это. Вам придется вникать в API OpenDirectory.