如何调用模拟另一个用户而不是SYSTEM的函数
How to invoke a function impersonating another user instead of SYSTEM
在我的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函数,这可能会将您重定向到另一个更简单的问题。
- C++/CLI System.AccessViolation在托管类中调用非托管函数时出现异常
- C++ 合并字符串以'system'函数错误
- 使用 system() 函数在C++程序中运行 cmd 命令
- 导出 c++ 函数并使用 c# System.AccessViolationException 中的函数
- g++ 中的 system() 函数
- System.AccessViolationException 从 C# 调用 c++ 函数
- SetWindowsHookEx 回调函数在 SYSTEM 权限上不起作用
- 如何在 C++ 中使用带有 system() 函数的字符串变量
- 通过 system() 函数调用防止野卡扩展
- 如何在 c++ 代码中的函数中调用 System() 函数
- system.security.cryptography.openssl如何调用openssl函数
- 哪一个更好?使用C 代码中的System()函数或使用源代码
- 如何在 C++ 中使用一个 System() 函数运行 2 个命令
- 什么是 stdlib system() 函数的 Win32 API 等效项?
- 需要c++ system()函数的帮助
- 获取php system()函数的完整输出
- 如何使用c++中的system()函数打开应用程序
- c++ system()函数头文件
- 在c++中使用system()函数导致命令提示符窗口出现和消失
- 如何将连接的字符串参数传递给system()函数