2

我编写了一个 c++ windows 应用程序 (A),它使用 LogonUser、LoadUserProfile 和 ImpersonateLoggedOnUser 来获得另一个用户 (Y) 的权限。这意味着 A 开始使用在工作站 (X) 上登录的用户。如果用户想要提升他的权限,他只需按一个按钮并以另一个用户身份登录,而无需将自己从 Windows 中注销并重新登录。

现在的情况是(根据函数的返回值):LogonUser 有效,LoadUserProfile 有效,ImpersonateLoggedOnUser 也有效。

模仿之后,我开始另一个过程。此进程是需要 OCX 控件的应用程序 (B)。这失败了,应用程序告诉我 .oxc 文件没有正确安装。

问题是,如果我直接以登录到机器 (X) 的用户身份启动 B,它就可以工作。如果我直接启动 B 作为我想使用 A 提升我的权限的用户 (Y),它会起作用。

如果我以 (X) 身份登录并在资源管理器中选择“运行身份”(Y),它就可以工作!

您知道我需要执行哪些步骤来执行与 Windows 中的“运行方式”对话框相同的操作吗?

4

2 回答 2

1

我不确定,但看起来模拟是不够的 - 模拟仅与进程 (A) 有关,而是尝试使用 CreateProcess 将 ProcessAttributes/ThreadAttributes 显式设置为来自 Windows 的 ACL 的模拟用户

于 2009-09-01T07:27:33.807 回答
0

感谢大家的帮助。以下能够为我解决问题:我使用CreateProcessWithLogonW()
启动所需的过程。为了使该功能正常工作,我必须在调用它之前RevertToSelf()并在之后再次进行模拟。

所以现在的顺序是:

LogonUser()
LoadUserProfile()
ImpersonateLoggedOnUser()
// work with the app
RevertToSelf()
CreateProcessWithLogonW()
// do the impersonation stuff again
于 2009-09-02T10:55:49.417 回答