所有用户和组的列表

Dav*_*ong 53 c macos cocoa macos-carbon objective-c

我正在尝试获取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的回答促使我调查了Open Directory的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]);
}
Run Code Online (Sandbox Code Playgroud)

这将记录系统上每个用户的用户名.替换kODRecordTypeGroups将获得所有组的列表.

-[ODQuery resultsAllowingPartial:error:]方法是一个阻塞调用,因此您要么在后台线程上执行此代码,要么使用a <ODQueryDelegate>来聚合结果.

TAL*_*ama 100

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

$ dscl . list /users
$ dscl . list /groups
Run Code Online (Sandbox Code Playgroud)

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

$ dscl . readall /users
$ dscl . readall /groups
Run Code Online (Sandbox Code Playgroud)

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

$ dscl -plist . readall /users
$ dscl -plist . readall /groups
Run Code Online (Sandbox Code Playgroud)

  • 注意:`dscl -list`限制为256个结果,因此不保证列出所有用户帐户. (6认同)
  • 这几乎不是从我的应用程序中执行此操作的编程方式。有API吗? (2认同)

The*_*lor 12

开放目录方法(来自:http://rickcogley.blogspot.com/2008/11/listing-open-directory-users-on-os-x.html):

dscacheutil -q user
dscacheutil -q group
Run Code Online (Sandbox Code Playgroud)

从以"name:"开头的相应输出中取出每一行,除去"name:",然后列出你的列表.如果您没有dscacheutil,则可以使用手动命令:

root# dscl localhost list /Local/Default/Users
root# dscl localhost list /LDAPv3/127.0.0.1/Users
Run Code Online (Sandbox Code Playgroud)

在开放目录之前的旧学校方法....(叹气):对于用户列表:

  • 从系统中获取/ etc/passwd文件.
  • 用线分开
  • 根据":"拆分每一行
  • 取每行的第一个符号

对于组列表:

  • 从系统中获取/ etc/group文件.
  • 用线分开
  • 根据":"拆分每一行
  • 取每行的第一个符号

  • 我相信目录服务取代了`/ etc/passwd`.该文件可能仅用于遗留原因. (3认同)
  • 我认为这行不通 - 在我的 mac 上 grepping `/etc/passwd` 不会产生我的用户名。 (2认同)
  • 注意:`dscacheutil -q user`和`dscl -list`限制为256个结果,因此不保证列出所有用户帐户. (2认同)

edu*_*ffy 8

非garbbled/no-tempfile命令:

# dscl . list /users
# dscl . list /groups
Run Code Online (Sandbox Code Playgroud)