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));
我想检测用户的角色(管理员/标准)。我必须根据该角色在 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));