如何确定当前用户(运行我的应用程序的用户)是否具有管理权限(即,是管理员组的成员)?对于访问受限的用户,我需要以不同方式注册一些COM组件。我正在使用C++(WTL和Win32)。发现用户是否具有管理权限
2
A
回答
6
IsUserAnAdmin()是快速简便的方法,但MSDN警告说,它可能消失在未来,所以你可能想打电话给CheckTokenMembership()在你的线程/进程令牌,而不是(用well known sid为管理员组相比)
4
在工作中,我们使用了Anders的方式,但几个月前我们的系统因为该功能而失败。现在我们用这个:
bool IsUserAdmin()
{
struct Data
{
PACL pACL;
PSID psidAdmin;
HANDLE hToken;
HANDLE hImpersonationToken;
PSECURITY_DESCRIPTOR psdAdmin;
Data() : pACL(NULL), psidAdmin(NULL), hToken(NULL),
hImpersonationToken(NULL), psdAdmin(NULL)
{}
~Data()
{
if (pACL)
LocalFree(pACL);
if (psdAdmin)
LocalFree(psdAdmin);
if (psidAdmin)
FreeSid(psidAdmin);
if (hImpersonationToken)
CloseHandle (hImpersonationToken);
if (hToken)
CloseHandle (hToken);
}
} data;
BOOL fReturn = FALSE;
Dword dwStatus;
Dword dwAccessMask;
Dword dwAccessDesired;
Dword dwACLSize;
Dword dwStructureSize = sizeof(PRIVILEGE_SET);
PRIVILEGE_SET ps;
GENERIC_MAPPING GenericMapping;
SID_IDENTIFIER_AUTHORITY SystemSidAuthority = SECURITY_NT_AUTHORITY;
const DWORD ACCESS_READ = 1;
const DWORD ACCESS_WRITE = 2;
if (!OpenThreadToken (GetCurrentThread(), TOKEN_DUPLICATE|TOKEN_QUERY, TRUE, &data.hToken))
{
if (GetLastError() != ERROR_NO_TOKEN)
return false;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_DUPLICATE|TOKEN_QUERY, &data.hToken))
return false;
}
if (!DuplicateToken (data.hToken, SecurityImpersonation, &data.hImpersonationToken))
return false;
if (!AllocateAndInitializeSid(&SystemSidAuthority, 2,
SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS,
0, 0, 0, 0, 0, 0, &data.psidAdmin))
return false;
data.psdAdmin = LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH);
if (data.psdAdmin == NULL)
return false;
if (!InitializeSecurityDescriptor(data.psdAdmin, SECURITY_DESCRIPTOR_REVISION))
return false;
// Compute size needed for the ACL.
dwACLSize = sizeof(ACL) + sizeof(ACCESS_ALLOWED_ACE) + GetLengthSid(data.psidAdmin) - sizeof(DWORD);
data.pACL = (PACL)LocalAlloc(LPTR, dwACLSize);
if (data.pACL == NULL)
return false;
if (!InitializeAcl(data.pACL, dwACLSize, ACL_REVISION2))
return false;
dwAccessMask = ACCESS_READ | ACCESS_WRITE;
if (!AddAccessAllowedAce(data.pACL, ACL_REVISION2, dwAccessMask, data.psidAdmin))
return false;
if (!SetSecurityDescriptorDacl(data.psdAdmin, TRUE, data.pACL, FALSE))
return false;
// AccessCheck validates a security descriptor somewhat; set the group
// and owner so that enough of the security descriptor is filled out
// to make AccessCheck happy.
SetSecurityDescriptorGroup(data.psdAdmin, data.psidAdmin, FALSE);
SetSecurityDescriptorOwner(data.psdAdmin, data.psidAdmin, FALSE);
if (!IsValidSecurityDescriptor(data.psdAdmin))
return false;
dwAccessDesired = ACCESS_READ;
GenericMapping.GenericRead = ACCESS_READ;
GenericMapping.GenericWrite = ACCESS_WRITE;
GenericMapping.GenericExecute = 0;
GenericMapping.GenericAll = ACCESS_READ | ACCESS_WRITE;
if (!AccessCheck(data.psdAdmin, data.hImpersonationToken, dwAccessDesired,
&GenericMapping, &ps, &dwStructureSize, &dwStatus,
&fReturn))
{
return false;
}
return fReturn;
}
相关问题
- 1. Python - 检查用户是否具有管理员权限
- 2. 如何找出用户是否具有管理员权限?
- 3. 如何检查当前用户是否具有管理权限
- 4. 检查请求的用户是否具有管理员权限
- 5. runas管理员和具有管理权限的runas用户
- 6. 具有有限管理权限的MySQL用户
- 7. 使用AngularJS服务来检查用户是否具有管理员权限
- 8. 获取哪些用户具有管理员权限的帐户(具有OAuthV2访问权限)的API是什么?
- 9. VBScript:检查脚本是否具有管理权限
- 10. 如何知道我是否具有管理权限在Windows中?
- 11. 如何检查进程是否具有管理权限
- 12. Symfony2用户权限管理
- 13. 没有管理员权限的用户是否可以管理配置单元中的对象访问权限?
- 14. Jenkins - 创建具有管理权限的第一个用户?
- 15. 不允许具有管理权限的用户执行postgresql
- 16. 具有管理权限的Directory.SetCurrentDirectory。
- 17. 错误具有管理员权限
- 18. 具有管理员权限的QProcess
- 19. 防止启动具有管理权限
- 20. 如何管理用户访问权限和用户权限
- 21. Magento子管理用户帐户权限
- 22. 发布或管理权限不得具有读取权限请求
- 23. 想要了解我的应用程序是否具有管理权限?
- 24. 是否有意义使用动物园管理员来存储用户权限
- 25. 检查用户是否有权限
- 26. Laravel:检查用户是否有权限
- 27. 打开具有管理员权限的用户从特权命令提示符
- 28. 如何检查用户名和密码中的帐户是否具有管理员权限?
- 29. 管理员和在Windows上拥有“管理员权限”是否有区别?
- 30. 检查用户是否具有特定的Windows权限Powershell
什么类型的管理员权限? – 2009-09-21 08:59:13