如何调用模拟另一个用户而不是SYSTEM的函数

How to invoke a function impersonating another user instead of SYSTEM

本文关键字:SYSTEM 函数 用户 另一个 何调用 调用 模拟      更新时间:2023-10-16

在我的DLL中调用了一个Win32 API,该API将由SYSTEM用户加载,并且该API根据当前用户返回不同的结果,因此我无法获得当前用户对应的结果,当DLL在SYSTEM上下文中运行时,如何在当前登录用户上下文下调用该API?

我做了一些研究并得出了以下结论(我不是Win32 API专家,但我对它很感兴趣):

您可以使用ImpersonateLoggedOnUser,它要求主令牌句柄或模拟令牌句柄(两者中至少有TOKEN_QUERY,主令牌上有TOKEN_DUPLICATE,模拟令牌上有TOKEN_IMPERSONATE)。

如果您拥有当前登录的用户令牌和正确的权限,那么这将非常容易,您只需使用ImpersonateLoggedOnUser,调用所需的API函数,然后调用RevertToSelf返回其原始所有者令牌。

但是获取当前登录的用户令牌并不是那么容易。您必须使用LogonUser指定用户名和密码(这似乎不正确),或者拥有一个具有足够权限的Windows服务来允许您调用WTSQueryUserToken,这可能与您正在开发的项目类型不同。

或者,如果你真的愿意用一个普通的过程来做这件事,你也可以探索身份验证功能,在那里你可以利用新的Windows UAC和安全上下文,这可能有点复杂。

还有一种方法我不确定它是否有效:模拟标准用户(在explorer.exe上使用OpenProcessToken获取令牌)。

我发现一些有用的链接:

  • MSDN-客户端模拟(Windows)
  • MSDN-访问令牌(Windows)
  • MSDN-LsaLogoUser函数(Windows)
  • 一个简单的模拟程序示例
  • CodeProject-用户模拟
  • CodeProject-Vista UAC:最终指南

我建议:在继续之前,请确保在调用您提到的API函数时确实需要模拟用户。看看是否有其他路径可以实现您想要的目标。

您还可以指定要使用的API函数,这可能会将您重定向到另一个更简单的问题。