【问题标题】:How do you deal with UAC when creating a process as a different user?在以不同用户身份创建进程时如何处理 UAC?
【发布时间】:2010-03-26 13:32:22
【问题描述】:

我在使用 UAC 时遇到问题,并以其他用户身份执行非交互式进程(API,例如 CreateProcessAsUser 或 CreateProcessWithLogonW)。

我的程序旨在执行以下操作:

1) 创建一个新的 windows 用户帐户(检查,工作正常)

2) 创建一个非交互式子进程作为新用户帐户(启用 UAC 时失败)

我的应用程序包含一个管理员清单,并在启用 UAC 以完成第 1 步时正确提升。

但第 2 步未能正确执行。我怀疑这是因为作为另一个用户执行的子进程没有继承我的主进程(作为交互式用户执行)的提升权限。

我想知道如何解决这个问题。当 UAC 关闭时,我的程序可以正常工作。在这种情况下,我该如何处理 UAC 或需要提升的权限?

如果有帮助,子进程需要以另一个用户身份运行,以便为新用户帐户设置文件加密。

【问题讨论】:

  • 根据您的特定需求和情况,this answer 可能会有所帮助。

标签: uac


【解决方案1】:

在这篇博文中解释了使用 CreateProcessWithLogon 和 CreateProcessAsUser 时生成的进程没有管理员权限的原因:

http://blogs.msdn.com/cjacks/archive/2010/02/01/why-can-t-i-elevate-my-application-to-run-as-administrator-while-using-createprocesswithlogonw.aspx

长话短说:CreateProcess 是 Windows 中的一个低层,它不知道海拔。 ShellExecute(Ex) 可以。因此,您必须使用 CreateProcessWithLogon/CreateProcessAsUser 创建并启动一个引导程序应用程序,然后(现在充当其他用户)使用 ShellExecute(Ex) 启动您的最终应用程序,这将要求管理员权限(如果您将“runas”指定为 lpVerb 或为您的应用提供清单)。而且因为这是一项如此简单有趣的任务,所以 Windows 没有提供 ShellExecuteWithLogon 函数。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    刚刚在最大 UAC 下的 Windows 7 上遇到了类似的问题。

    当 UAC 开启时,CreateProcessWithLogon 会创建一个受限令牌,就像带有 LOGON32_LOGON_INTERACTIVE 的 LogonUser 所做的那样。此令牌可防止提升。

    解决方案是首先使用 LOGON32_LOGON_BATCH 调用 LogonUser,它会返回一个完全访问令牌。一旦获得,只需调用 CreateProcessWithToken。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-05
      • 1970-01-01
      • 1970-01-01
      • 2013-11-24
      • 1970-01-01
      • 2010-10-03
      相关资源
      最近更新 更多