所以我想在我的应用程序中为每个用户实现家长控制,但我需要一种方法来获取所有用户并将它们添加到NSTableView。这些用户应该与登录窗口显示的相同,不包括其他用户和系统用户。
关于如何做到这一点的任何想法?此外,我希望能够在该表视图上进行选择,当然也可以更改显示的设置。
答案 0 :(得分:11)
我是这样做的:
#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
对象使用起来更方便,但它们确实需要导入Collaboration框架。
答案 1 :(得分:1)
从命令行,您可以运行
dscl localhost -list /Local/Default/Users
有许多用户以下划线字符开头,可以被您的应用忽略。这个命令当然可以在cocoa和输出读取中运行,但也可以更直接地访问它。
您也可以使用Apple框架,但使用包装器可能更容易。我现在找不到最近的一个,但是搜索这样的东西:
http://www.martinkahr.com/2006/10/15/cocoa-directory-services-wrapper/index.html
答案 2 :(得分:0)
这是一个Swift版本,注意在Xcode 7.2.1&#34; &#39;初始化(CSIdentity:)&#39;在Swift中不可用:Swift中没有CSIdentity。&#34;
相反,我们可以使用:
CBIdentity(uniqueIdentifier 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
}