如何解决Mac OS-如何使用Objective-C以编程方式检测Mac用户已登录用户是否是admin?
我想检测用户的角色(管理员/标准)。我必须在基于该角色的Mac应用程序上显示一个弹出窗口。
Objective-C中是否有可可API对此进行识别?
我们可以在“用户和组”下的“ Systerm首选项”中检查角色,如下所示。
我可以使用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,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));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。