我的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。您需要调试您的代码并准确找出实际失败的内容。 –