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

Zhi*_*ang 5 c c++ windows dll

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

Tor*_*bio 6

我做了一些研究并得出结论(我不是 Win32 API 专家,但我对此非常感兴趣):

您可以使用ImpersonateLoggedOnUser,它要求主令牌句柄或模拟令牌句柄(至少TOKEN_QUERYTOKEN_DUPLICATE主令牌或TOKEN_IMPERSONATE模拟令牌上都有)。

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

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

或者,如果您确实愿意使用普通流程执行此操作,您还可以探索身份验证功能,您可以在其中利用新的 Windows UAC 和安全上下文,这可能有点复杂。

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

我发现一些有用的链接:

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

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