我有一个非pipe理员用户(没有SeImpersonatePrivilege),需要暂时模仿另一个用户。 根据MSDN文章ImpersonateLoggedOnUser ( 重点是我的):
如果满足以下条件之一,则所有模拟函数(包括ImpersonateLoggedOnUser)都会允许请求的模拟:
•令牌的请求的模拟级别小于SecurityImpersonation, 如SecurityIdentification或SecurityAnonymous。 •调用者具有SeImpersonatePrivilege特权。 进程(或调用者的login会话中的另一个进程)创build该令牌 通过LogonUser或LsaLogonUser函数使用显式凭据。 •身份validation的身份与主叫方相同。
我试图使用斜体的方法。 我可以使用LogonUserW创build令牌:
HANDLE token = NULL; if (::LogonUserW(user, L".", password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &token)) { if (::ImpersonateLoggedOnUser(token)) { DoOtherUserStuff(); } }
这叫成功; 我到达了DoOtherUserStuff函数。 但是,当我尝试使用刚刚创build的令牌来执行任何需要特权检查的操作时,它都会失败。 GetLastError返回1346,这是
未提供所需的模拟级别,或提供的模拟级别无效。
如果尝试使用通过其他方法(OpenThreadToken等)获取的令牌来模拟另一个用户,并且没有SeImpersonatePrivilege,则会出现此错误。 但是,我正在使用具有显式凭据的LogonUser创build令牌。 为什么它不工作? MSDN文档是错误的吗?
我试过使用不同的logintypes和不同的login提供程序,无济于事。 正如预期的那样, LOGON32_LOGON_NETWORK
会生成一个模拟令牌,但其他方式会以完全相同的方式失败。
系统是Windows 8.0企业版。 调用者是一个Microsoft帐户,但用户login和模拟是一个本地帐户。