获取OS X上的所有用户

时间:2010-09-10 02:18:53

标签: cocoa nstableview

所以我想在我的应用程序中为每个用户实现家长控制,但我需要一种方法来获取所有用户并将它们添加到NSTableView。这些用户应该与登录窗口显示的相同,不包括其他用户和系统用户。

关于如何做到这一点的任何想法?此外,我希望能够在该表视图上进行选择,当然也可以更改显示的设置。

3 个答案:

答案 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
    }