【问题标题】:List of all users and groups所有用户和组的列表
【发布时间】: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:] 方法是一个阻塞 调用,因此您要么希望在后台线程上执行此代码,要么使用&lt;ODQueryDelegate&gt; 来聚合结果。

【问题讨论】:

  • 可悲的是,您能够手动制作详尽的列表这一事实表明您已经有办法将其自动化。您大概阅读了目录名称列表或其他内容?很好的问题要问。 Google 在大约 15 秒内找到了答案。
  • 我是从另一个程序得到的。
  • 澄清:另一个程序在弹出按钮中有列表,我将其复制了出来。我想要一个类似的弹出按钮。 =) 至于谷歌,我花了一段时间搜索“mac 获取所有用户列表”的变体,但找不到任何相关内容。
  • 有没有纯obj-c方式(不调用命令行工具)?
  • @AP。 (很久以后)前几天我在玩这个,想出了一些代码来做到这一点。

标签: c objective-c cocoa macos macos-carbon


【解决方案1】:

Open Directory 方法(来自: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

Open Directory 之前的老派方法......(叹气): 对于用户列表:

  • 从系统中获取 /etc/passwd 文件。
  • 按行拆分
  • 根据“:”拆分每一行
  • 每行取第一个符号

对于组列表:

  • 从系统中获取 /etc/group 文件。
  • 按行拆分
  • 根据“:”拆分每一行
  • 每行取第一个符号

【讨论】:

  • 我认为这行不通 - 在我的 Mac 上 grepping /etc/passwd 不会产生我的用户名。
  • +1 在这里相同,但它似乎拥有其他一切。谢谢!如果有更好的方法,我会保持打开状态。
  • 我相信目录服务取代了/etc/passwd。该文件可能只是出于遗留原因。
  • 注意:dscacheutil -q userdscl -list 限制为 256 个结果,因此不能保证列出所有用户帐户。
  • Here too (MacOS 10.15.7) - 通过“用户和组”UI(在系统偏好设置中)创建的“普通”Mac 用户不会出现在 /etc/passwd 文件中。也许还有另一个这样的文件(相同格式)可以为“Mac 用户”扩展它?
【解决方案2】:

签出,例如dsexport

这里有一些例子:

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

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

输出有点垃圾,但是像 sed 这样的东西可以为你清理它们。

【讨论】:

  • 太棒了!只需一个带有正则表达式的简单通道就可以将它们清理干净!谢谢!
  • 注意:dsexport 仅限于 256 个结果,因此不能保证列出所有用户帐户。
【解决方案3】:

无乱码/无临时文件命令:

# dscl . list /users
# dscl . list /groups

【讨论】:

  • 哇,更好!我喜欢这个网站! =)
  • 注意:dscl -list 限制为 256 个结果,因此不能保证列出所有用户帐户。
  • 是否有实现相同功能的编程 API?我不希望通过 NSTask 创建一个外部进程,每次我的 Cocoa 应用程序需要用户列表时收集并解析它的文本输出......也许这对于 Unix 风格的编程来说是正常的,但对于 Mac 编程来说却不是。
【解决方案4】:

在过去,我们可以使用 NetInfo Kit 轻松完成这项工作,但今天没有整洁的 Objective-C 方法可以做到这一点。您必须深入研究 OpenDirectory API。

【讨论】:

    【解决方案5】:

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

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

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

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

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

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

    【讨论】:

    • 由于某种原因,这并没有列出所有用户,即使我使用 sudo 运行。它不显示任何“真实”用户,只显示系统用户。
    • 适用于我的 Lion 安装;您看到它失败的操作系统是什么?
    • 1.5.8.我想到了。我没有意识到 osx 可以通过多种不同的方式进行身份验证。原来我需要 JacobTaylor 的“开放目录”方法。
    • 注意:dscl -list 限制为 256 个结果,因此不能保证列出所有用户帐户。
    • 这几乎不是我的应用程序的编程方式。任何 API?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2010-10-22
    • 1970-01-01
    • 2019-06-12
    • 2016-03-23
    相关资源
    最近更新 更多