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>
結果を集計します。
必要なツールはほぼ確実にdsclです。最短の方法はすでに指摘されています。
$ dscl . list /users
$ dscl . list /groups
ただし、各ユーザーに関する情報を出力する場合は、readall
を使用します。
$ dscl . readall /users
$ dscl . readall /groups
また、前述の情報をプログラムで解析する必要がある場合は、-plistを使用して生活を楽にします。
$ dscl -plist . readall /users
$ dscl -plist . readall /groups
オープンディレクトリアプローチ(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の前の古い学校のアプローチ....(ため息):ユーザーのリスト:
グループのリストの場合:
非文字化け/一時ファイルなしのコマンド:
# dscl . list /users
# dscl . list /groups
たとえば、 dsexport をチェックアウトします。
ここではいくつかの例を示します。
dsexport /tmp/export.out /Local/Default dsRecTypeStandard:Groups
dsexport /tmp/export.out /Local/Default dsRecTypeStandard:Users
出力は少しゴミですが、sedのようなものがそれらをクリーンアップできます。
昔は、NetInfo Kitを使用してこれを簡単に実行していましたが、今日では、Objective-Cを使用してそれを行うきちんとした方法はありません。 OpenDirectory APIを詳しく調べる必要があります。