【发布时间】:2013-12-27 03:20:58
【问题描述】:
我的 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(好)调用 impersonate ("non-admin-user" , "domain", "password" ) => 返回
FALSE(好!)
场景 2:
从非管理员帐户运行应用程序,使用管理员帐户的runas.exe。
调用 IsUserAdmin() => 返回
FALSE(好)调用 impersonate ("administrator" , "domain", "password" ) => 返回
FALSE(不好!)
场景 3:
从非管理员帐户直接运行应用程序。
调用 IsUserAdmin() => 返回
FALSE(好)调用 impersonate ("administrator" , "domain", "password" ) => 返回
FALSE(不好!)
所有场景都打印step 1 和step 2。
据我所知,鉴于合法凭据,上述内容应确保模拟。我在这里错过了什么?
【问题讨论】:
-
您说
impersonate()返回 FALSE,但您没有指出它到底在哪里失败。impersonate()有 4 个故障点可能导致它返回 FALSE - 如果LogonUser()失败,如果ImpersonateLoggedOnUser()失败,如果AllocateAndInitializeSid()失败,或者如果CheckTokenMembership()失败。你需要调试你的代码并找出到底是什么失败了。
标签: c++ windows winapi authentication impersonation