我正在尝试获取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>
来聚合结果。