【问题标题】:ImpersonateLoggedOnUser and starting a new process that uses ocx failsImpersonateLoggedOnUser 并启动使用 ocx 的新进程失败
【发布时间】:2009-09-01 07:11:09
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 可能是环境变量,特别是如果 com 注册使用 %CommonProgramFiles%\SomeDirHere\MyLib.OCX 作为 InProc 服务器位置。转储生成进程的环境。

标签: c++ winapi com ocx


【解决方案1】:

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

【讨论】:

  • 感谢您暗示模拟仅与 (A) 有关。现在我尝试使用 MSDN 告诉我的 CreateProcessWithLogonW() 比 CreateProcessAsUser() 更受欢迎。现在的顺序是: LogonAsUser() LoadUserProfile() ImpersonateLoggedOnUser() CreateProcessWithLogonW() 其中 CreateProcessWithLogonW() 失败,ErrorCode 5 (Access denied) 有什么想法可以从这里开始吗?
  • 尝试 sysinternal utils(FileMon 或 RegMon)以明确查看在“拒绝访问”拒绝之前究竟询问了什么。同样根据 msdn:“默认情况下,CreateProcessWithLogonW 不会将指定的用户配置文件加载到 HKEY_USERS 注册表项中。这意味着访问 HKEY_CURRENT_USER 注册表项中的信息可能不会产生与正常交互式登录一致的结果”。请注意,OCX 大量使用注册表。
  • @Dewfy:感谢您的提示。尤其是您提到的工具,将来也对我有用!通过在调用 CreateProcessWithLogonW() 之前调用 RevertToSelf() 解决访问被拒绝
【解决方案2】:

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

所以现在的顺序是:

LogonUser()
LoadUserProfile()
ImpersonateLoggedOnUser()
// work with the app
RevertToSelf()
CreateProcessWithLogonW()
// do the impersonation stuff again

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-16
    • 2020-08-08
    • 1970-01-01
    • 2017-12-27
    相关资源
    最近更新 更多