我正在尝试获取Mac 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提示我研究打开目录的接口,我发现这个列表可以很容易地通过编程获得:
#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>来聚合结果。
发布于 2009-08-20 18:40:40
您想要的工具几乎肯定是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-20 01:58:06
开放目录方法(来自: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在打开目录之前的老方法...(叹息):用户列表:
有关组列表,请执行以下操作:
文件,逐行取出
发布于 2009-08-20 02:16:32
非乱码/无临时文件命令:
# dscl . list /users
# dscl . list /groupshttps://stackoverflow.com/questions/1303561
复制相似问题