2010-09-10 85 views
1

所以我想在我的應用中爲每個用戶實現家長控制,但我需要一種獲取所有用戶並將其添加到NSTableView的方法。這些用戶應該與登錄窗口顯示的一樣,不包括其他...一個和系統用戶。獲取OS X上的所有用戶

有關如何做到這一點的任何想法?另外,我希望能夠在該表視圖上獲得選擇,當然也可以根據該選項更改所顯示的設置。

回答

9

這裏是我如何做到這一點:

#import <CoreServices/CoreServices.h> 
#import <Collaboration/Collaboration.h> 

CSIdentityAuthorityRef defaultAuthority = CSGetLocalIdentityAuthority(); 
CSIdentityClass identityClass = kCSIdentityClassUser; 

CSIdentityQueryRef query = CSIdentityQueryCreate(NULL, identityClass, defaultAuthority); 

CFErrorRef error = NULL; 
CSIdentityQueryExecute(query, 0, &error); 

CFArrayRef results = CSIdentityQueryCopyResults(query); 

int numResults = CFArrayGetCount(results); 

NSMutableArray * users = [NSMutableArray array]; 
for (int i = 0; i < numResults; ++i) { 
    CSIdentityRef identity = (CSIdentityRef)CFArrayGetValueAtIndex(results, i); 

    CBIdentity * identityObject = [CBIdentity identityWithCSIdentity:identity]; 
    [users addObject:identityObject]; 
} 

CFRelease(results); 
CFRelease(query); 

//users contains a list of known Aqua-style users. 

CBIdentity對象是更方便使用而不是CSIdentityRef對象,但它們確實需要導入協作框架。

1

在命令行中,你可以運行

dscl localhost -list /Local/Default/Users 

有很多與可通過您的應用程序被忽略下劃線開始的用戶。這個命令當然可以在可可內運行並且可以讀取輸出,但也可以更直接地訪問它。

您也可以使用Apple框架,但它可能更容易使用包裝。我無法找到一個非常最近的一個權利,但搜索是這樣的:

http://www.martinkahr.com/2006/10/15/cocoa-directory-services-wrapper/index.html

+2

的標準,如果用戶要顯示或不與用戶才UID高於500,並且其shell未設置爲/ bin/false,將顯示在登錄窗口中。您可以將此用作條件(而不是「如果用戶名不以下劃線開頭」)。 – zneak 2010-09-10 02:53:17

0

這是一個Swift版本,注意在Xcode 7.2.1中''init(CSIdentity :)'在Swift中不可用:CSIdentity在Swift中不可用。「

相反,我們可以使用:

CBIdentity(唯一標識符UUID:NSUUID,權威: CBIdentityAuthority)

func getSystemUsers()->[CBIdentity]{ 
     let defaultAuthority = CSGetLocalIdentityAuthority().takeUnretainedValue() 
     let identityClass  = kCSIdentityClassUser 

     let query = CSIdentityQueryCreate(nil, identityClass, defaultAuthority).takeRetainedValue() 

     var error : Unmanaged<CFErrorRef>? = nil 

     CSIdentityQueryExecute(query, 0, &error) 

     let results = CSIdentityQueryCopyResults(query).takeRetainedValue() 

     let resultsCount = CFArrayGetCount(results) 

     var allUsersArray = [CBIdentity]() 

     for idx in 0...resultsCount-1 { 

      let identity = unsafeBitCast(CFArrayGetValueAtIndex(results,idx),CSIdentityRef.self) 
      let uuidString = CFUUIDCreateString(nil, CSIdentityGetUUID(identity).takeUnretainedValue()) 

      if let uuidNS = NSUUID(UUIDString: uuidString as String), let identityObject = CBIdentity(uniqueIdentifier: uuidNS, authority: CBIdentityAuthority.defaultIdentityAuthority()){ 
       allUsersArray.append(identityObject) 
      } 
     } 

     return allUsersArray 
    }