我正在尝试在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's answer提示我调查打开目录的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>
来聚合结果。
答案 0 :(得分:95)
你想要的工具几乎肯定是dscl。最简单的方法已经指出:
$ dscl . list /users
$ dscl . list /groups
但是,如果要输出有关每个用户的信息,请使用readall
:
$ dscl . readall /users
$ dscl . readall /groups
如果您需要以编程方式解析所述信息,请使用-plist让您的生活更轻松:
$ dscl -plist . readall /users
$ dscl -plist . readall /groups
答案 1 :(得分: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
开放目录之前的旧学校方法....(叹气): 对于用户列表:
对于群组列表:
答案 2 :(得分:8)
非garbbled / no-tempfile命令:
# dscl . list /users
# dscl . list /groups
答案 3 :(得分:1)
退房,例如dsexport。
以下是一些例子:
dsexport /tmp/export.out /Local/Default dsRecTypeStandard:Groups
dsexport /tmp/export.out /Local/Default dsRecTypeStandard:Users
输出有点垃圾,但像sed这样的东西可以为你清理它们。
答案 4 :(得分:1)
回到过去,我们会用NetInfo Kit做这件事,但今天没有干净的Objective-C方法。您必须深入了解OpenDirectory API。