如何確定當前用戶(運行我的應用程序的用戶)是否具有管理權限(即,是管理員組的成員)?對於訪問受限的用戶,我需要以不同方式註冊一些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