【问题标题】:How to launch program with user permissions instead of active permissions如何使用用户权限而不是活动权限启动程序
【发布时间】:2011-04-15 18:57:15
【问题描述】:

我有一个运行并显示托盘图标的 C# 应用程序。我的托盘应用程序有一个安装程序,它在安装后启动应用程序。安装程序需要管理员权限,而托盘图标必须以正常权限运行。我的安装程序目前破坏了这一点 - 当已安装的托盘应用程序启动时,它会从安装程序进程继承管理员权限。

作为我的安装程序的一部分,我将启动一个 C# 应用程序来执行一些自定义工作。这个小应用程序当前通过调用来启动托盘应用程序:

Process.Start(@"path/to/my/tray/app.exe"); 

有没有办法使用当前用户的权限而不是授予安装程序的提升权限来调用托盘应用程序?

我听说这样做的推荐方法是在安装程序周围有一个包装器 EXE,它启动安装程序,然后启动已安装的程序。如果可能的话,我想避免这种情况。

我正在使用 WiX 构建 MSI 安装程序,因此我也接受直接从 WiX/MSI 工作的解决方案。

【问题讨论】:

    标签: c# windows-7 permissions uac


    【解决方案1】:

    或者,您可以使用Windows API CreateProcessAsUser,这似乎可以完成这项工作。

    【讨论】:

    • 这对我来说是一种以服务登录用户身份运行计划任务的方式
    【解决方案2】:

    有两种方法。最简单的方法是使用一个 shell exe,它首先启动提升的管理任务(有很多方法可以做到这一点;我更喜欢清单),然后是另一个非提升的任务。如果您出于某种原因拒绝这样做,请查看我从我的博客文章中链接到的博客文章和 CodePlex 项目:http://www.gregcons.com/KateBlog/NonElevatedFromElevatedManagedThisTime.aspx

    【讨论】:

      【解决方案3】:

      非常好的问题。我发现表面上工作的答案都有些混乱。最优雅的整体是 EXE 包装器。

      看看这篇文章:http://www.codeproject.com/KB/vista-security/RunNonElevated.aspx。它描述了一种方法,您可以通过该方法获得一个 shell 窗口的本机挂钩,该窗口运行非提升,并要求 shell 为您启动代码。 C# 中的原生钩子需要非常高的 CAS 权限;要获得这些权限,您的安装程序必须具有强命名和签名,并且代码必须使用 SecurityPermissionFlag.UnmanagedCode 要求或断言 SecurityPermission。

      .NET Framework 的 ProcessStartInfo 类还包含一个 UseShellExecute 布尔属性,当设置该属性时,它会告诉 Process.Start() 将此调用提供给 shell,而不是直接从当前应用程序域启动进程。我不知道这是否能满足您的需要,但尝试起来肯定容易得多;您只需使用 Process.Start() 的 ProcessStartInfo 重载,声明的 ProcessStartInfo 设置了标志。

      请记住,您不能告诉 shell 以当前登录用户以外的用户身份启动 EXE(不能在 ProcessStartInfo 上设置用户名和密码)。您还必须使用 WorkingDirectory 属性指定 EXE 的路径。

      【讨论】:

      • UseShellExecute 显然默认为 true,所以看起来这无济于事,尽管我还没有尝试过。感谢您的回答,但我怀疑包装 exe 将是唯一的“整洁”解决方案。
      • 我现在已经对此进行了测试,但它不起作用。我还尝试了一个调用msdn.microsoft.com/en-us/library/aa446583%28v=vs.85%29.aspx 并使用新安全令牌启动的C++ dll。但是,这不能改变拥有已启动进程的用户 - 只能更改已启动进程拥有的权限。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-13
      • 2015-04-19
      • 1970-01-01
      • 2010-12-28
      • 1970-01-01
      相关资源
      最近更新 更多