Cocoa 在OSX上获取所有用户
因此,我想在我的应用程序中对每个用户实施家长控制,但我需要一种获取所有用户并将其添加到NSTableView的方法。这些用户应与登录窗口显示的用户相同,不包括其他用户。。。一个是系统用户Cocoa 在OSX上获取所有用户,cocoa,nstableview,Cocoa,Nstableview,因此,我想在我的应用程序中对每个用户实施家长控制,但我需要一种获取所有用户并将其添加到NSTableView的方法。这些用户应与登录窗口显示的用户相同,不包括其他用户。。。一个是系统用户 有什么办法吗?另外,我希望能够获得该表视图上的选择,当然也可以根据该选择更改显示的设置。您可以从命令行运行 dscl localhost -list /Local/Default/Users 有很多用户以下划线字符开头,你的应用程序可以忽略这些字符。当然,这个命令可以从cocoa内部运行并读取输出,但也可以更
有什么办法吗?另外,我希望能够获得该表视图上的选择,当然也可以根据该选择更改显示的设置。您可以从命令行运行
dscl localhost -list /Local/Default/Users
有很多用户以下划线字符开头,你的应用程序可以忽略这些字符。当然,这个命令可以从cocoa内部运行并读取输出,但也可以更直接地访问它
您也可以使用Apple框架,但使用包装器可能更容易。我现在找不到最新的,但请搜索以下内容:
我是这样做的:
#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.
#导入
#进口
CSIdentityAuthorityRef defaultAuthority=CSGetLocationIdentityAuthority();
CSIdentityClass identityClass=kcsidentityclass用户;
CSIdentityQueryRef query=CSIdentityQueryCreate(NULL,identityClass,defaultAuthority);
CFErrorRef error=NULL;
CSIdentityQueryExecute(查询,0,&错误);
CFArrayRef results=CSIdentityQueryCopyResults(查询);
int numResults=CFArrayGetCount(结果);
NSMutableArray*用户=[NSMutableArray];
对于(int i=0;i
CBIdentity
对象比CSIdentityRef
对象更便于使用,但它们确实需要导入协作框架。这里是一个Swift版本,请注意,在Xcode 7.2.1中,“init(CSIdentity:)”在Swift中不可用:CSIdentity在Swift中不可用。”
相反,我们可以使用:
CBIdentity(唯一标识符uuid:NSUID,权限:
CBIdentityAuthority)
func getSystemUsers()->[CBIdentity]{
让defaultAuthority=CsgetLocalidentialAuthority().takeUnrepainedValue()
让identityClass=kCSIdentityClassUser
let query=CSIdentityQueryCreate(nil,identityClass,defaultAuthority)
变量错误:非托管?=nil
CSIdentityQueryExecute(查询、0和错误)
let results=CSIdentityQueryCopyResults(query).takeRetainedValue()
让ResultCount=CFArrayGetCount(结果)
var allUsersArray=[CBIdentity]()
对于0中的idx…结果计数-1{
let identity=unsafeBitCast(CFArrayGetValueAtIndex(results,idx),CSIdentityRef.self)
让uuidString=CFUUIDCreateString(nil,CSIdentityGetUUID(identity).takeUnrepainedValue())
如果让uuidNS=nsuid(UUIDString:UUIDString作为字符串),则让identityObject=CBIdentity(uniqueIdentifier:uuidNS,authority:CBIdentityAuthority.defaultIdentityAuthority()){
allUsersArray.append(identityObject)
}
}
返回allUsersArray
}
登录窗口中会显示是否应显示用户的标准,或者是否仅显示UID高于500且外壳未设置为/bin/false的用户。您可以将此作为标准(而不是“如果用户名不以下划线开头”)。
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
}