以下是我正在使用的代碼(從msdn複製),但即使當用戶不是本地管理員,它返回就好像它是任何想法?使用checkTokenMemberShip返回總是正確的,即使進程用戶不是管理員
BOOL IsUserAdmin(VOID)
/*++
Routine Description: This routine returns TRUE if the caller's
process is a member of the Administrators local group. Caller is NOT
expected to be impersonating anyone and is expected to be able to
open its own process and process token.
Arguments: None.
Return Value:
TRUE - Caller has Administrators local group.
FALSE - Caller does not have Administrators local group. --
*/
{
BOOL b;
SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
PSID AdministratorsGroup;
b = AllocateAndInitializeSid(
&NtAuthority,
2,
SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS,
0, 0, 0, 0, 0, 0,
&AdministratorsGroup);
if(b)
{
if (!CheckTokenMembership(NULL, AdministratorsGroup, &b))
{
b = FALSE;
}
FreeSid(AdministratorsGroup);
}
return(b);
}
+1 ......換句話說,Vista的UAC的,管理員帳戶仍然是管理員的成員但是在沒有UAC提示的情況下,有些(無效)努力阻止流程在該SID下行使權利。 我會做的唯一的其他評論是,具有NULL第一個參數的CheckTokenMembership會檢查當前的_thread模擬_或_thread primary_標記,而不是MSDN示例代碼錯誤暗示的流程標記。 – 2009-07-30 00:23:15