【发布时间】:2010-11-21 04:09:29
【问题描述】:
我正在尝试获取 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 提示我调查 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]);
}
这将记录系统上每个用户的用户名。替换为kODRecordTypeGroups 将为您提供所有组的列表。
-[ODQuery resultsAllowingPartial:error:] 方法是一个阻塞 调用,因此您要么希望在后台线程上执行此代码,要么使用<ODQueryDelegate> 来聚合结果。
【问题讨论】:
-
可悲的是,您能够手动制作详尽的列表这一事实表明您已经有办法将其自动化。您大概阅读了目录名称列表或其他内容?很好的问题要问。 Google 在大约 15 秒内找到了答案。
-
我是从另一个程序得到的。
-
澄清:另一个程序在弹出按钮中有列表,我将其复制了出来。我想要一个类似的弹出按钮。 =) 至于谷歌,我花了一段时间搜索“mac 获取所有用户列表”的变体,但找不到任何相关内容。
-
有没有纯obj-c方式(不调用命令行工具)?
-
@AP。 (很久以后)前几天我在玩这个,想出了一些代码来做到这一点。
标签: c objective-c cocoa macos macos-carbon