在我的 DLL 中调用了一个 Win32 API,它将由 SYSTEM 用户加载,并且该 API 根据当前用户返回不同的结果,所以我无法获得与当前用户对应的结果,如何在当前登录用户下调用该 API DLL 在 SYSTEM 上下文中运行时的上下文?
1 回答
我做了一些研究并得出结论(我不是 Win32 API 专家,但我真的很感兴趣):
您可以使用ImpersonateLoggedOnUser
, 它要求提供主要或模拟令牌句柄(至少TOKEN_QUERY
在两者中,TOKEN_DUPLICATE
在主要令牌上或TOKEN_IMPERSONATE
在模拟令牌上)。
如果您拥有当前登录的用户令牌和正确的权限,这将非常容易,您只需使用ImpersonateLoggedOnUser
,调用您想要的 API 函数,然后调用RevertToSelf
以返回其原始所有者令牌。
但是获取当前登录的用户令牌并不容易。您必须使用LogonUser
指定用户名和密码(这似乎不正确),或者拥有一个具有足够权限的 Windows 服务来让您调用WTSQueryUserToken
,这可能与您正在开发的项目类型不同。
或者,如果您真的愿意使用普通流程执行此操作,您还可以探索Authentication Functions,您可以在其中利用新的 Windows UAC 和安全上下文,使用起来可能有点复杂。
还有一种方法,我不确定它是否有效:模拟标准用户(使用OpenProcessToken
on获取令牌explorer.exe
)。
我发现一些有用的链接:
- MSDN - 客户端模拟 (Windows)
- MSDN - 访问令牌 (Windows)
- MSDN - LsaLogonUser 函数 (Windows)
- 一个简单的模拟程序示例
- CodeProject - 用户模拟
- CodeProject - Vista UAC:权威指南
我建议:在继续之前,请确保在调用您提到的 API 函数时确实需要模拟用户。看看是否有另一种途径来完成你想要的。
您还可以指定您尝试使用的 API 函数,这可能会将您重定向到另一个更简单的问题。