c - 所有用户和组的列表

标签 c objective-c cocoa macos macos-carbon

我正在尝试获取 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>汇总结果。

最佳答案

您想要的工具几乎肯定是 dscl。已经指出了最短的方法:

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

如果您想输出每个用户的信息,请使用 readall:

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

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

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

关于c - 所有用户和组的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1303561/

相关文章:

c - 使用 HAL 库的 STM32l100rc USB 驱动程序

ios - RestKit 附加数据响应

objective-c - 在 iOS 中高效绘制边框文本

cocoa - 带有小滚动条的 WebView - 如何?

macos - Cocoa:模拟 Macbook 上键和多媒体键

java - 程序怎么可能超过 2^16 字节?

c - 从C读取Excel文件

c - 如何从字符数组中逐字读取?

javascript - iframe 中的 WKWebView 本地文件

objective-c - 是否可以以编程方式生成触摸板手势事件?