我看到了IsInRole方法,但找不到有關如何將它與C++一起使用的信息。我如何檢查我的程序是否以用戶身份作爲管理員運行(Vista/Win7,C++)
6
A
回答
2
從CodePlex上的UACHelpers項目取得的this old answer中有一個C++代碼片段。
-1
你可以試試這段代碼。它給出了需要做什麼樣的草圖:
const HANDLE hProcess = GetCurrentProcess();
if (hProcess==NULL)
return FAILURE;
HANDLE hToken;
const BOOL lR = OpenProcessToken(hProcess, TOKEN_QUERY, &hToken);
if (lR == NULL)
return FAILURE;
PSID psidAdministrators;
SID_IDENTIFIER_AUTHORITY x = SECURITY_NT_AUTHORITY;
if (!AllocateAndInitializeSid(
&x, 2,
SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0,
&psidAdministrators))
return FAILURE;
bool isAdmin = false; //dummy init
DWORD size;
GetTokenInformation(hToken, TokenGroups, NULL, 0, &size);
char* buffer = new char[size];
DWORD notUsed;
if (!GetTokenInformation(hToken, TokenGroups, (void*)buffer, size, ¬Used))
return FAILURE;
TOKEN_GROUPS* ptgGroups = (TOKEN_GROUPS*)buffer;
isAdmin = false; //until proven otherwise
for (UINT32 i=0; i<ptgGroups->GroupCount; ++i)
{
if (EqualSid(psidAdministrators, ptgGroups->Groups[i].Sid))
{
isAdmin = true;
break;
}
}
FreeSid(psidAdministrators);
return isAdmin;
1
的IsUSerAnAdmin
文檔解釋了它,因爲Vista的過時,但您指出CheckTokenMembership
。這應該爲你做好這份工作。
2
此代碼可解決您的問題。隨意使用它。它適用於SE_GROUP_USE_FOR_DENY_ONLY。
/**
IsGroupMember determines if the current thread or process has a token that contais a given and enabled user group.
Parameters
dwRelativeID: Defines a relative ID (par of a SID) of a user group (e.g. Administrators DOMAIN_ALIAS_RID_ADMINS (544) = S-1-5-32-544)
bProcessRelative: Defines whether to use the process token (TRUE) instead of the thread token (FALSE). If FALSE and no thread token is present
the process token will be used though.
bIsMember: Returns the result of the function. The value returns TRUE if the user is an enabled member of the group; otherwise FALSE.
Return Value
If the function succeeds, the return value is TRUE; otherwise FALSE. Call GetLastError for more information.
*/
BOOL IsGroupMember(DWORD dwRelativeID, BOOL bProcessRelative, BOOL* pIsMember)
{
HANDLE hToken, hDupToken;
PSID pSid = NULL;
SID_IDENTIFIER_AUTHORITY SidAuthority = SECURITY_NT_AUTHORITY;
if (!pIsMember)
{
SetLastError(ERROR_INVALID_USER_BUFFER);
return FALSE;
}
if (bProcessRelative || !OpenThreadToken(GetCurrentThread(), TOKEN_QUERY | TOKEN_DUPLICATE, TRUE, &hToken))
{
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_DUPLICATE, &hToken))
{
return FALSE;
}
}
if (!DuplicateToken(hToken, SecurityIdentification, &hDupToken))
{
CloseHandle(hToken);
return FALSE;
}
CloseHandle(hToken);
hToken = hDupToken;
if (!AllocateAndInitializeSid(&SidAuthority, 2,
SECURITY_BUILTIN_DOMAIN_RID, dwRelativeID, 0, 0, 0, 0, 0, 0,
&pSid))
{
CloseHandle(hToken);
return FALSE;
}
if (!CheckTokenMembership(hToken, pSid, pIsMember))
{
CloseHandle(hToken);
FreeSid(pSid);
*pIsMember = FALSE;
return FALSE;
}
CloseHandle(hToken);
FreeSid(pSid);
return TRUE;
}
BOOL IsUserAdministrator(BOOL* pIsAdmin)
{
return IsGroupMember(DOMAIN_ALIAS_RID_ADMINS, FALSE, pIsAdmin);
}
相關問題
- 1. 我的應用程序將以管理員身份運行嗎?
- 2. 以管理員身份運行程序
- 3. 如何判斷我的進程是否以管理員身份運行?
- 4. C++控制檯應用程序提示「以管理員身份運行」以管理員身份運行?
- 5. 管理權限(要檢查我的Outlook是否以管理員身份打開)
- 6. C#以管理員身份運行CMD
- 7. 如何以管理員身份運行?
- 8. 如何以管理員身份運行?
- 9. VB6是以管理員身份運行的應用程序
- 10. C#檢查以管理員身份運行
- 11. 以管理員身份運行VB.NET程序應用程序
- 12. C++:以管理員身份運行程序
- 13. 如何使安裝程序以管理員身份運行
- 14. 如何檢查是否應用程序作爲管理員VB.NET
- 15. 檢測另一個進程是否以「以管理員身份運行」啓動
- 16. 檢查用戶是否以共享點用戶或管理員身份登錄
- 17. 如何從以管理員身份運行的C#應用程序打開PDF
- 18. 當用戶已經是管理員時,通過C++激活管理員[以管理員身份運行]
- 19. 以管理員身份運行的dotnet核心應用程序
- 20. 我想讓我的.exe應用程序以管理員身份在任何用戶計算機上運行
- 21. 在java中簡單檢查是否以管理員身份運行
- 22. 獲取當前腳本Powershell是否以管理員身份執行(以管理員身份運行)
- 23. 我可以在Windows上以管理員身份運行PyCharm嗎?
- 24. 以用戶身份從Visual Studios進行調試,以管理員身份運行
- 25. 在Windows上以管理員身份運行Qt應用程序
- 26. 以管理員身份運行.NET應用程序
- 27. 以管理員身份運行Javafx應用程序
- 28. 以管理員身份運行Android應用程序
- 29. VB6應用程序'以管理員身份運行'問題
- 30. 在Windows上以管理員身份運行Java應用程序
此代碼是檢查SID是否是用戶令牌的一部分的NT4方法,它在新系統上無法正常工作,因此不應使用。請參閱Rup的SO鏈接以獲取我的答案以及調用哪個函數... – Anders 2010-08-23 16:38:14
@Anders:當然,它可以在Windows XP,Windows Vista和Windows 7上運行。這些代碼在這三個系統上進行了相當廣泛的測試。你爲什麼認爲這行不通? – 2010-08-24 06:17:12
我知道它壞了,所以你只是沒有正確測試。有一種叫做拒絕SID的東西,而你當前的代碼並不處理這些,你應該使用CheckTokenMembership。 – Anders 2010-08-24 11:50:17