문제

목록을 얻으려고 합니다. 모두 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 기반이 아닌) 솔루션에 열려 있습니다.


오랜만에 업데이트

탈라마의 답변 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

그리고 프로그램적으로 말한 정보를 구문 분석 해야하는 경우, 인생을 사용하여 인생을 더 편하게 만들 수 있습니다.

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

다른 팁

개방형 디렉토리 접근 방식(출처: 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 파일을 가져옵니다.
  • 선으로 나누세요.
  • ":"를 기준으로 각 줄을 분할합니다.
  • 각 줄의 첫 번째 기호를 가져옵니다.

비가구블/템플 룸 파일 명령 :

# 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 키트와 함께 사소 하게이 일을 할 것이지만, 오늘날에는 깔끔한 목표 C 방법이 없습니다. OpenDirectory API를 파헤쳐 야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top