列表中的所有用户和群组
-
19-09-2019 - |
题
我试图获得一个名单 所有 用户和所有团体在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。