web-dev-qa-db-ja.com

すべてのユーザーとグループのリスト

Mac OS X 10.5+でallユーザーとすべてのグループのリストを取得しようとしています。これどうやってするの?

たとえば、私のマシン上のすべてのユーザーのリストは以下を返します:_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(これは手作業で手作業でコンパイルされました)。

そのリスト(および対応するすべてのグループのリスト)をプログラムで取得するにはどうすればよいですか? Applescript、コマンドラインなどの代替(非cベース)ソリューションを受け入れています。


かなり後で更新します

TALlamaの答え 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:]メソッドはblocking呼び出しであるため、このコードをバックグラウンドスレッドで実行するか、<ODQueryDelegate>結果を集計します。

53
Dave DeLong

必要なツールはほぼ確実にdsclです。最短の方法はすでに指摘されています。

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

ただし、各ユーザーに関する情報を出力する場合は、readallを使用します。

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

また、前述の情報をプログラムで解析する必要がある場合は、-plistを使用して生活を楽にします。

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

オープンディレクトリアプローチ(from: 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ファイルを取得します。
  • 行ごとに分割する
  • 「:」に基づいて各行を分割します
  • 各行の最初のシンボルを取ります
12
TheJacobTaylor

非文字化け/一時ファイルなしのコマンド:

# dscl . list /users
# dscl . list /groups
8
eduffy

たとえば、 dsexport をチェックアウトします。

ここではいくつかの例を示します。

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

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

出力は少しゴミですが、sedのようなものがそれらをクリーンアップできます。

1
Peter

昔は、NetInfo Kitを使用してこれを簡単に実行していましたが、今日では、Objective-Cを使用してそれを行うきちんとした方法はありません。 OpenDirectory APIを詳しく調べる必要があります。

1
NSResponder