所有用户和组的列表

我正在尝试获取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)的解决scheme,如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]); } 

这将logging系统上每个用户的用户名。 用kODRecordTypeGroups将得到所有组的列表。

-[ODQuery resultsAllowingPartial:error:]方法是一个阻塞调用,所以你要么在后台线程上执行这个代码,要么使用<ODQueryDelegate>来聚合结果。

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

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

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

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

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

     $ dscl -plist . readall /users $ dscl -plist . readall /groups 

    开放目录方法(来自: 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 

    开放目录前的老派方法….(叹气):用户列表:

    • 从系统中获取/ etc / passwd文件。
    • 按行分割
    • 根据“:”分割出每一行
    • 取每行的第一个符号

    对于组列表:

    • 从系统中获取/ etc / group文件。
    • 按行分割
    • 根据“:”分割出每一行
    • 取每行的第一个符号

    非garbbled / no-tempfile命令:

     # dscl . list /users # dscl . list /groups 

    请查看,例如, dsexport 。

    这里有些例子:

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

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

    早在过去,我们会用NetInfo Kit来做这件事情,但是今天没有一个完整的Objective-C方法来做到这一点。 您将不得不深入到OpenDirectory API。