代码之家  ›  专栏  ›  技术社区  ›  Tristan

获取OS X上的所有用户

  •  2
  • Tristan  · 技术社区  · 14 年前

    因此,我想在我的应用程序中实现每个用户的家长控制,但我需要一种获取所有用户并将其添加到NSTableView的方法。这些用户应该是相同的登录窗口显示,排除其他。。。一、系统用户。

    有什么办法吗?另外,我希望能够获得该表视图上的选择,当然也可以根据该选择更改显示的设置。

    3 回复  |  直到 14 年前
        1
  •  13
  •   Dave DeLong    14 年前

    我是这样做的:

    #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 对象,但它们确实需要导入协作框架。

        2
  •  1
  •   Peter DeWeese    14 年前

    从命令行,您可以运行

    dscl localhost -list /Local/Default/Users
    

    您也可以使用Apple框架,但使用包装器可能更容易。我现在找不到最新的,但请搜索以下内容:

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

        3
  •  0
  •   CryingHippo    9 年前

    相反,我们可以使用:

    CBIdentity(唯一标识符uuid:nsuid,权限:

    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
        }