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

Posted

技术标签:

【中文标题】如何调用模拟另一个用户而不是 SYSTEM 的函数【英文标题】:How to invoke a function impersonating another user instead of SYSTEM 【发布时间】:2012-11-22 01:51:20 【问题描述】:

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

【问题讨论】:

DLL 是否在 Windows 服务中?用普通流程模拟通常非常困难。您需要用户名和密码才能获取当前用户的令牌... 是的,事实证明设计不合适,如果我们想在用户上下文中调用一个API,我们应该把它变成一个用户服务。 【参考方案1】:

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

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

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

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

或者,如果您真的愿意使用普通进程执行此操作,您还可以探索Authentication Functions,您可以在其中利用新的 Windows UAC 和安全上下文,使用起来可能有点复杂.

还有一种方法我不确定它是否有效:Impersonate standard user(通过在explorer.exe 上使用OpenProcessToken 获取令牌)。

我发现一些有用的链接:

MSDN - Client Impersonation (Windows) MSDN - Access Tokens (Windows) MSDN - LsaLogonUser function (Windows) A Simple Impersonation Program Example CodeProject - User Impersonation CodeProject - Vista UAC: The Definitive Guide

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

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

【讨论】:

以上是关于如何调用模拟另一个用户而不是 SYSTEM 的函数的主要内容,如果未能解决你的问题,请参考以下文章

在 Excel 中,如何调用存储在另一个工作簿中的用户定义函数而无需打开另一个工作簿?

在另一个计算属性上调用 getter 不是测试中的函数

怎样在一个 C 程序中调用另一个程序 (独立可执行的程序, 或系统命令)?

重载时如何强制matlab调用常规函数而不是类方法?

当鼠标悬停而不是 pyFLTK 中的小部件时如何调用函数?

在路由内部模拟一个 api 函数调用而不实际调用它