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

Mac OS-如何以编程方式检测Mac用户(登录用户)是否使用Objective-C进行管理?,objective-c,macos,cocoa,admin,appkit,Objective C,Macos,Cocoa,Admin,Appkit,我想检测用户的角色(管理员/标准)。我必须根据这个角色在Mac应用程序上显示一个弹出窗口 Objective-C中是否有可可原料药来识别这一点 我们可以在下面的用户和组下查看Systerm首选项中的角色 标准用户 管理员用户 我可以使用中的getuid()获得root权限。 但是这对我没有帮助。一种可能的方法是使用CoreServices框架及其工具 您可以通过CSIdentityQueryCreateForCurrentUser获取对当前用户身份的引用: CSIdentityRef cur

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

Objective-C中是否有可可原料药来识别这一点

我们可以在下面的用户和组下查看Systerm首选项中的角色

标准用户

管理员用户

我可以使用
中的
getuid()
获得root权限。
但是这对我没有帮助。

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

您可以通过
CSIdentityQueryCreateForCurrentUser
获取对当前用户身份的引用:

CSIdentityRef currentUserIdentity(CFErrorRef*error){
CSIdentityQueryRef const query=CSIdentityQueryCreateForCurrentUser(NULL);
如果(!CSIdentityQueryExecute(查询,0/*标志,无需*/,错误)){
返回NULL;
}
CFArrayRef const users=CSIdentityQueryCopyResults(查询);
if(CFArrayGetCount(用户)!=1){
//TODO:设置“*”错误`
返回NULL;
}
返回(CSIdentityRef)CFArrayGetValueAtIndex(用户,0);
}
类似地,您可以为“admin”组创建查询(注意所有小写):

CSIdentityRef adminGroupIdentity(CFErrorRef*错误){
CSIdentityQueryRef const query=CSIdentityQueryCreateForName(NULL,CFSTR(“admin”),kCSIdentityQueryStringEquals,kCSIdentityClassGroup,CSGetDefaultIdentityAuthority());
如果(!CSIdentityQueryExecute(查询,0/*标志,无需*/,错误)){
返回NULL;
}
CFArrayRef const groups=CSIdentityQueryCopyResults(查询);
如果(CFArrayGetCount(组)!=1){
//TODO:设置“*”错误`
返回NULL;
}
返回(CSIdentityRef)CFArrayGetValueAtIndex(组,0);
}
然后,检查身份成员身份就像检查组的身份成员一样简单:

CFErrorRef error=nil;
CSIdentityRef const currentUser=currentUserIdentity(&error);
如果(!currentUser){
NSLog(@“无法获取当前用户:%@”,错误);
返回退出失败;
}
CSIdentityRef const adminGroup=adminGroupIdentity(&error);
如果(!adminGroup){
NSLog(@“无法获取管理员组:%@”,错误);
返回退出失败;
}
NSLog(@“%@是%@:%hhu”、CSIdentityGetPosixName(当前用户)、CSIdentityGetPosixName(adminGroup)、CSIdentityIsMemberOfGroup(当前用户、adminGroup));

谢谢。这是一个非常好的API。这到底是什么I@ShanmugarajaG请注意,我在编写上述示例时考虑了ARC——如果您在代码中进行手动引用计数,则需要修改上述内容以避免内存泄漏。