Получить всех пользователей на OS X - PullRequest
2 голосов
/ 10 сентября 2010

Итак, я хочу реализовать родительский контроль для каждого пользователя в моем приложении, но мне нужен способ получить всех пользователей и добавить их в NSTableView.Эти пользователи должны отображаться в окне входа в систему одинаково, за исключением других пользователей и системных пользователей.

Есть идеи, как это сделать?Кроме того, я хочу получить возможность выбора в этом табличном представлении и, конечно, изменить отображаемые настройки в соответствии с этим.

Ответы [ 3 ]

11 голосов
/ 10 сентября 2010

Вот как я это делаю:

#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 голос
/ 10 сентября 2010

Из командной строки вы можете запустить

dscl localhost -list /Local/Default/Users

Многие пользователи начинают с символа подчеркивания, который может игнорироваться вашим приложением. Эту команду, конечно, можно запустить из какао и прочитать вывод, но к ней также можно получить более прямой доступ.

Вы также можете использовать каркас Apple, но, вероятно, проще использовать оболочку. Я не могу найти самую свежую прямо сейчас, но ищу что-то вроде этого:

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

0 голосов
/ 23 февраля 2016

Вот версия Swift, обратите внимание, что в Xcode 7.2.1 «init (CSIdentity :)» недоступен в Swift: CSIdentity недоступен в Swift. »

Вместо этого мы можем использовать:

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
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...