63

我正在尝试获取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,我发现这个列表可以很容易地以编程方式获取:

#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:]方法是一个阻塞调用,因此您要么希望在后台线程上执行此代码,要么使用 an<ODQueryDelegate>来聚合结果。

4

5 回答 5

114

你想要的工具几乎肯定是 dscl。已经指出了最短的方法:

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

但是,如果要输出有关每个用户的信息,请使用readall

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

如果您需要以编程方式解析所述信息,请使用 -plist 让您的生活更轻松:

$ dscl -plist . readall /users
$ dscl -plist . readall /groups
于 2009-08-20T18:40:39.513 回答
12

开放目录方法(来自: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 文件。
  • 按行拆分
  • 根据“:”拆分每一行
  • 取每行的第一个符号
于 2009-08-20T01:58:06.453 回答
10

非乱码/无临时文件命令:

# dscl . list /users
# dscl . list /groups
于 2009-08-20T02:16:32.047 回答
2

回到过去,我们会用 NetInfo Kit 轻松地做到这一点,但今天没有整洁的 Objective-C 方法可以做到这一点。您必须深入研究 OpenDirectory API。

于 2009-08-20T08:51:40.360 回答
1

例如,查看 dsexport

这里有些例子:

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

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

输出有点垃圾,但像 sed 这样的东西可以为你清理它们。

于 2009-08-20T02:02:57.087 回答