Ответов (2)2
Решение
0
Только что нашел IsUserAnAdmin () в shlobj.h, который выполняет эту работу за меня.
0
Вам может понадобиться больше, чтобы справиться с высотой и тому подобным ...
Я так делаю ....
bool CProcessToken::IsUserAnAdmin() const
{
#if _WIN32_WINNT >= 0x0600
bool isAdmin = false;
DWORD bytesUsed = 0;
TOKEN_ELEVATION_TYPE tokenElevationType;
if (!::GetTokenInformation(m_hToken, TokenElevationType, &tokenElevationType, sizeof(tokenElevationType), &bytesUsed))
{
const DWORD lastError = ::GetLastError();
throw CWin32Exception(_T("CProcessToken::IsUserAnAdmin() - GetTokenInformation - TokenElevationType"), lastError);
}
if (tokenElevationType == TokenElevationTypeLimited)
{
CSmartHandle hUnfilteredToken;
if (!::GetTokenInformation(m_hToken, TokenLinkedToken, reinterpret_cast<void *>(hUnfilteredToken.GetHandle()), sizeof(HANDLE), &bytesUsed))
{
const DWORD lastError = ::GetLastError();
throw CWin32Exception(_T("CProcessToken::IsUserAnAdmin() - GetTokenInformation - TokenLinkedToken"), lastError);
}
BYTE adminSID[SECURITY_MAX_SID_SIZE];
DWORD sidSize = sizeof(adminSID);
if (!::CreateWellKnownSid(WinBuiltinAdministratorsSid, 0, &adminSID, &sidSize))
{
const DWORD lastError = ::GetLastError();
throw CWin32Exception(_T("CProcessToken::IsUserAnAdmin() - CreateWellKnownSid"), lastError);
}
BOOL isMember = FALSE;
if (::CheckTokenMembership(hUnfilteredToken, &adminSID, &isMember))
{
const DWORD lastError = ::GetLastError();
throw CWin32Exception(_T("CProcessToken::IsUserAnAdmin() - CheckTokenMembership"), lastError);
}
isAdmin = (isMember != FALSE);
}
else
{
isAdmin = ToBool(::IsUserAnAdmin());
}
return isAdmin;
#else
return ToBool(::IsUserAnAdmin());
#endif
}
Я не могу вспомнить, откуда я взял информацию, чтобы написать этот фрагмент кода ...