我试图获得一个名单 所有 用户和所有团体在Mac OS X10.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 to Open Directory,我发现,这个列表中可以容易获取的编程方式:

#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> 到聚合的结果。

有帮助吗?

解决方案

你想要的工具,几乎可以肯定是DSCL。做到这一点的最简单的办法已经指出:

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

如果您想了解每个用户的输出信息,不过,使用readall

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

如果您需要以编程方式分析所述信息,使用-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 /非临时文件命令:

# 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的套件做这个平凡的,但今天没有整齐的Objective-C的方式来做到这一点。你必须在挖掘到OpenDirectory API。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top