programing

모든 사용자 및 그룹 목록

minecode 2021. 1. 18. 07:50
반응형

모든 사용자 및 그룹 목록


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(수작업으로 힘들게 컴파일되었습니다).

프로그래밍 방식으로 해당 목록 (및 모든 그룹의 해당 목록)을 얻으려면 어떻게해야합니까? 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:]메서드는 차단 호출이므로 백그라운드 스레드에서이 코드를 실행하거나를 사용 <ODQueryDelegate>하여 결과를 집계 할 수 있습니다.


원하는 도구는 거의 확실하게 dscl입니다. 이를 수행하는 가장 짧은 방법은 이미 지적되었습니다.

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

그러나 각 사용자에 대한 정보를 출력하려면 readall다음을 사용하십시오 .

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

프로그래밍 방식으로 해당 정보를 구문 분석해야하는 경우 -plist를 사용하여 삶을 더 쉽게 만듭니다.

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

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 파일을 가져옵니다.
  • 선으로 나누기
  • ":"을 기준으로 각 줄을 나눕니다.
  • 각 줄의 첫 번째 기호를 가져옵니다.

Garbbled / no-tempfile 명령 :

# 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를 파헤쳐 야합니다.

참조 URL : https://stackoverflow.com/questions/1303561/list-of-all-users-and-groups

반응형