Mac OS - 如何以编程方式检测 Mac 用户(登录用户)是管理员使用 Objective-C?

Mac OS - How to programmatically detect the Mac user (logged in user) is admin using Objective-C?

我想检测用户的角色(管理员/标准)。我必须根据该角色在 Mac 应用程序上显示一个弹出窗口。

Objective-C里面有没有CocoaAPI可以识别这个?

我们可以在用户和组下的系统偏好设置中查看角色,如下所示。

标准用户

管理员用户

我可以使用 getuid()<unistd> 获得 root 权限。 但这对我没有帮助。

一种可能的方法是使用 CoreServices 框架及其 Identity Services 工具。

您可以通过 CSIdentityQueryCreateForCurrentUser:

获取对当前用户身份的引用
CSIdentityRef currentUserIdentity(CFErrorRef *error) {
    CSIdentityQueryRef const query = CSIdentityQueryCreateForCurrentUser(NULL);
    if (!CSIdentityQueryExecute(query, 0 /* flags, none needed */, error)) {
        return NULL;
    }

    CFArrayRef const users = CSIdentityQueryCopyResults(query);
    if (CFArrayGetCount(users) != 1) {
        // TODO: set `*error`
        return NULL;
    }

    return (CSIdentityRef)CFArrayGetValueAtIndex(users, 0);
}

您可以类似地为“admin”组创建查询(注意全部小写):

CSIdentityRef adminGroupIdentity(CFErrorRef *error) {
    CSIdentityQueryRef const query = CSIdentityQueryCreateForName(NULL, CFSTR("admin"), kCSIdentityQueryStringEquals, kCSIdentityClassGroup, CSGetDefaultIdentityAuthority());
    if (!CSIdentityQueryExecute(query, 0 /* flags, none needed */, error)) {
        return NULL;
    }

    CFArrayRef const groups = CSIdentityQueryCopyResults(query);
    if (CFArrayGetCount(groups) != 1) {
        // TODO: Set `*error`
        return NULL;
    }

    return (CSIdentityRef)CFArrayGetValueAtIndex(groups, 0);
}

然后检查身份成员身份就像检查 CSIdentityIsMemberOfGroup:

一样简单
CFErrorRef error = nil;
CSIdentityRef const currentUser = currentUserIdentity(&error);
if (!currentUser) {
    NSLog(@"Failed to get current user: %@", error);
    return EXIT_FAILURE;
}

CSIdentityRef const adminGroup = adminGroupIdentity(&error);
if (!adminGroup) {
    NSLog(@"Failed to get admin group: %@", error);
    return EXIT_FAILURE;
}

NSLog(@"%@ is %@: %hhu", CSIdentityGetPosixName(currentUser), CSIdentityGetPosixName(adminGroup), CSIdentityIsMemberOfGroup(currentUser, adminGroup));