我的windows應用程序可能需要某些部分的管理權限。 對於這些情況,我想要求用戶輸入管理員憑據,並使用下面的代碼來冒充管理員:窗戶的奇怪行爲冒充
BOOL impersonate(LPTSTR lpszUsername, LPTSTR lpszDomain, LPTSTR lpszPassword) {
BOOL ret = LogonUser(lpszUsername,
lpszDomain,
lpszPassword,
LOGON32_LOGON_INTERACTIVE,
LOGON32_PROVIDER_DEFAULT,
&hToken);
if (ret != TRUE) return FALSE;
OutputDebugString (L"step 1");
ret = ImpersonateLoggedOnUser(hToken);
if (ret != TRUE) return FALSE;
OutputDebugString(L"step 2");
return IsUserAdmin()
}
其中函數IsUserAdmin()
has been taken from MSDN,並進入如下:
BOOL IsUserAdmin(VOID) {
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:
從管理員帳戶運行應用程序。
調用IsUserAdmin()=>返回
TRUE
(好)電話冒充( 「非管理員用戶」, 「域」, 「密碼」)=>返回
FALSE
(好!)
方案2:
運行從非管理員帳戶的應用程序,使用從runas.exe
管理員帳戶。
調用IsUserAdmin()=>返回
FALSE
(好)電話冒充( 「管理員」, 「域名」, 「密碼」)=>返回
FALSE
(不太好!)
方案3:
運行從非管理員accou應用直接 NT。
調用IsUserAdmin()=>返回
FALSE
(好)電話冒充( 「管理員」, 「域名」, 「密碼」)=>返回
FALSE
(不太好!)
所有情況都打印step 1
和step 2
。
據我所知,上面應該有保證模擬,鑑於合法憑證。我在這裏錯過了什麼?
你說的'假冒()'返回FALSE,但你沒有指明究竟是失敗的。如果'LogonUser()'失敗,'ImpersonateLoggedOnUser()'失敗,'AllocateAndInitializeSid()'失敗,或者'CheckTokenMembership()'失敗,''impersonate()'有4個失敗點可以返回FALSE。您需要調試您的代碼並準確找出實際失敗的內容。 –