2009-08-20 78 views
46

我试图获得一列所有用户和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's answer促使我研究了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:]方法是阻塞调用,所以你要么需要在后台线程执行该代码,或使用<ODQueryDelegate>聚集的结果。

+0

不幸的是,你能够手动制作详尽的列表的事实表明你已经有一种方法来自动化它。你大概读了一个目录名称列表或什么?很好的问题,但问。谷歌在大约15秒内找到了答案。 – TheJacobTaylor 2009-08-20 03:28:17

+0

我从另一个程序中获得了它。 – 2009-08-20 03:34:37

+0

澄清:另一个程序有一个popupbutton列表,我把它复制出来。我想要一个类似的popupbutton。 =)至于谷歌,我花了一段时间搜索“mac获取所有用户列表”的变化,并找不到任何相关的。 – 2009-08-20 03:36:23

回答

86

你想要的工具几乎肯定是dscl。要做到这一点是最短的路已经指出:

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

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

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

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

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

出于某种原因,即使我使用sudo运行,也不会列出所有用户。它没有显示任何“真实”的用户,只是系统的用户。 – cheshirekow 2011-07-21 17:51:36

+0

适用于我的Lion安装;你看到它失败的操作系统是什么? – TALlama 2011-07-21 20:35:58

+0

1.5.8。我想到了。我没有意识到osx可以通过几种不同的方式进行身份验证。原来我需要JacobTaylor的“开放目录”方法。 – cheshirekow 2011-07-21 21:27:31

12

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

dscacheutil -q user 
dscacheutil -q group 

采取从以“名称:”启动各自的输出每行脱光“的名字:”你有你的清单。 如果你没有dscacheutil,您可以使用手动命令: 对于用户的列表:

  • root# dscl localhost list /Local/Default/Users 
    root# dscl localhost list /LDAPv3/127.0.0.1/Users 
    

    老学校的做法对于开放式目录...(叹气)前来自系统的/ etc/passwd文件。

  • 拆分出来的线
  • 拆出基于每行“:”
  • 在第一个符号的每一行

对于组的列表:

  • 抓住/ etc/group文件。
  • 拆分出来由线
  • 拆分出基于每行“:”
  • 以第一符号的每一行
+1

我不认为这有效 - 在我的Mac上刷新'/ etc/passwd'不会产生我的用户名。 – Peter 2009-08-20 02:01:59

+0

+1在这里相同,但它似乎有其他的一切。谢谢!如果有更好的方法,我会保持开放。 – 2009-08-20 02:06:14

+3

我认为目录服务取代了'/ etc/passwd'。该文件可能仅出于遗留原因。 – 2009-08-20 02:08:03

1

检出,例如,dsexport

下面是一些例子:

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

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

的输出是有点垃圾,但类似的sed可以清除它们给你的。

+0

非常好!只需用正则表达式的简单传球将他们清理干净!谢谢! – 2009-08-20 02:10:59

+1

注意:'dsexport'限于256个结果,因此不能保证列出所有用户帐户。 – smokris 2012-09-14 19:07:01

8

非garbbled /无临时文件命令:

# dscl . list /users 
# dscl . list /groups 
+0

哇,更好!我喜欢这个网站! =) – 2009-08-20 02:22:03

+1

注意:'dscl -list'限于256个结果,因此不能保证列出所有用户帐户。 – smokris 2012-09-14 19:04:31

1

早在过去,我们会与NetInfo的套件做这个平凡的,但今天没有整齐的Objective-C的方式来做到这一点。您将不得不深入到OpenDirectory API。

相关问题