Список всех пользователей и групп - PullRequest
52 голосов
/ 20 августа 2009

Я пытаюсь получить список всех пользователей и всех групп в 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, командная строка и т. Д.


Обновление через долгое время

Ответ TALlama побудил меня изучить API для Open Directory, и я обнаружил, что этот список можно легко получить программным путем:

#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> для агрегирования результатов.

Ответы [ 5 ]

97 голосов
/ 20 августа 2009

Инструмент, который вам нужен, почти наверняка dscl. Самый короткий способ сделать это уже был указан:

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

Если вы хотите вывести информацию о каждом пользователе, используйте readall:

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

А если вам нужно программно проанализировать указанную информацию, используйте -plist, чтобы облегчить вашу жизнь:

$ dscl -plist . readall /users
$ dscl -plist . readall /groups
12 голосов
/ 20 августа 2009

Подход Open Directory (от: 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 из системы.
  • Разделить на строки
  • Разделить каждую строку на ":"
  • Взять первый символ для каждой строки
8 голосов
/ 20 августа 2009

Команды без искажений / без tempfile:

# dscl . list /users
# dscl . list /groups
1 голос
/ 20 августа 2009

В прежние времена мы делали это тривиально с помощью NetInfo Kit, но сегодня нет простого способа Objective-C. Вам нужно будет зайти в API OpenDirectory.

1 голос
/ 20 августа 2009

проверьте, например, dsexport .

Вот несколько примеров:

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

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

выходные данные немного мусор, но что-то вроде sed может очистить их для вас.

...