所以我想在我的應用中爲每個用戶實現家長控制,但我需要一種獲取所有用戶並將其添加到NSTableView的方法。這些用戶應該與登錄窗口顯示的一樣,不包括其他...一個和系統用戶。獲取OS X上的所有用戶
有關如何做到這一點的任何想法?另外,我希望能夠在該表視圖上獲得選擇,當然也可以根據該選項更改所顯示的設置。
所以我想在我的應用中爲每個用戶實現家長控制,但我需要一種獲取所有用戶並將其添加到NSTableView的方法。這些用戶應該與登錄窗口顯示的一樣,不包括其他...一個和系統用戶。獲取OS X上的所有用戶
有關如何做到這一點的任何想法?另外,我希望能夠在該表視圖上獲得選擇,當然也可以根據該選項更改所顯示的設置。
這裏是我如何做到這一點:
#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
對象,但它們確實需要導入協作框架。
在命令行中,你可以運行
dscl localhost -list /Local/Default/Users
有很多與可通過您的應用程序被忽略下劃線開始的用戶。這個命令當然可以在可可內運行並且可以讀取輸出,但也可以更直接地訪問它。
您也可以使用Apple框架,但它可能更容易使用包裝。我無法找到一個非常最近的一個權利,但搜索是這樣的:
http://www.martinkahr.com/2006/10/15/cocoa-directory-services-wrapper/index.html
這是一個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
}
的標準,如果用戶要顯示或不與用戶才UID高於500,並且其shell未設置爲/ bin/false,將顯示在登錄窗口中。您可以將此用作條件(而不是「如果用戶名不以下劃線開頭」)。 – zneak 2010-09-10 02:53:17