【问题标题】:Install program that has to be run as administrator安装必须以管理员身份运行的程序
【发布时间】:2010-02-10 14:28:02
【问题描述】:

背景:我绝不是 Windows 安全/用户权限专家。我有一个应用程序(用 C# 编写),它必须能够在其根目录中写入/删除文件和文件夹,在磁盘上的其他位置写入/删除文件,在系统注册表(本地计算机)中写入/修改值并启动 &停止其他应用程序服务。我认为我至少需要管理员权限才能执行其中一些操作。

我尝试在关闭 UAC 的计算机上运行此程序,无需任何其他设置即可正常运行。但是,在打开 UAC 的计算机上(在 Windows 7 中高于“从不通知”的任何级别)它会崩溃。我需要它在所有计算机上工作。

到目前为止,我只是手动选中“以管理员身份运行此程序”复选框,一切都会好起来的。但是现在我们决定允许客户自行安装此软件,并且它需要“开箱即用”运行。

我在 Visual Studio 2008 中有一个部署项目,它会安装所有内容并在注册表中写入必要的启动数据。我现在需要做的是设置“以管理员身份运行此程序”标志。我猜这并不像我想的那么简单。

那么,这样做的正确方法是什么?该程序在启动时启动,如果我们的客户每次重新启动计算机时都会弹出 UAC(并且可能使屏幕变暗),那会很烦人。

感谢您的帮助。

编辑:感谢您的回复。我意识到围绕 UAC 工作会不受欢迎,而且我可以看到 Microsoft 不支持“白名单”,因此它只会请求一次许可。很好,我可以尊重这一点,但是我确实有一些后续问题:

  • 您能否提供一个链接,告诉我如何正确提升程序以纠正提升状态?是否有任何关于选项的文献等...基本上我喜欢 UAC 101 指南。

  • 有没有办法在我需要额外权限时提升安全状态(然后才使用 UAC 提示)。基本上,这个应用程序在后台运行,大部分时间几乎什么都不做。它会时不时地检查一些文件(此时我需要能够写入磁盘并读取注册表(此时只读很好),但是由于它是一个临时文件夹,所以我在哪里并不重要'会说的。如果有一个应用程序可以在没有任何权限的情况下写入的位置,那将是完美的。)

    但是在某些时候,我需要执行所有其余的任务(无论如何用户都需要确认此操作),因此如果 UAC 在此时提示,那将没有问题。有没有办法在此时提升它,然后将其恢复为默认权限?

  • 这样的解决方案是否适用于旧版本的 Windows,包括 Vista 和 Xp(可能还有更旧的版本?)需要什么才能使其工作?

【问题讨论】:

标签: c# deployment uac setup-deployment


【解决方案1】:

正确的方法是在程序启动时提升,使用 UAC 提示符(您可以通过程序的清单设置) - 试图聪明并绕过它是不受欢迎的。

想一想 - 如果您可以安装一些在没有 UAC 提示的情况下自动提升的东西...... UAC 的意义何在?

要将 UAC 清单添加到程序中,您只需将清单添加到项目中并进行编辑。 UAC 的示例清单是 here。如果您想在最后一刻提升,那么您需要一个单独的进程 - 您无法提升现有进程。所以把那一点分开,然后使用

Process.StartInfo.UseShellExecute = true;
Process.StartInfo.Verb = "runas";

【讨论】:

  • 是的,我可以看到。我真正想要的是 UAC 只提示一次(程序第一次运行时?可能在安装期间或之后)。
  • 您能否提供一个关于如何正确提升程序的演练链接?谢谢。
  • 但是,如果您认为 UAC 应该是一次提示,那么您就错过了 UAC 的意义。它不是那样工作的,它应该出现在每次需要特权之前。这是提升的“正确”方式。为此,只需在 VS2008 中右键单击您的项目并添加清单文件,然后根据需要在清单中编辑 UAC 选项。
  • 谢谢。我只剩下一个问题,然后我会接受你的回答。如何在启动时运行提升的进程?目前我在 LocalMachine\Software\microsoft\windows\currentversion\run 中有一个注册表项,但是在添加 UAC 清单后,程序不再在启动时启动。我该如何解决?
  • 你没有。如果您需要在机器启动时提升程序,那么您编写一个 Windows 服务并将其配置为适当的机器帐户。
【解决方案2】:

您需要重新考虑您的应用程序是如何工作的。您说得很对,在登录时显示提升提示会很烦人。所以不要这样做。另一方面,您很可能有需要使用管理权限执行的任务。

所以你有两个选择:

  • 更改您的任务,使其不再需要管理提升(例如,将您的文件写入其他位置)。
  • 将您的应用程序分解为一个 Windows 服务组件和一个用户界面组件。服务组件可以在提升的帐户下运行(希望是执行您需要执行的任务所必需的最低提升的帐户)。用户界面组件可以在必要时与服务通信(通过命名管道或类似方式)。

【讨论】:

    【解决方案3】:

    你可以把你的程序分成两个部分:

    • 在没有提升的情况下运行的用户应用程序
    • 负责需要提升的任务的 Windows 服务

    由于您使用的是 .NET,因此组件之间的通信可能最容易使用 WCF 完成。

    附带说明:以编程方式修改 C:\Program Files 下的文件不是好的做法,可能会导致许多其他问题。 Windows 有专门的地方来存储配置设置和其他程序数据。

    【讨论】:

      猜你喜欢
      • 2012-03-13
      • 1970-01-01
      • 2011-09-01
      • 1970-01-01
      • 2012-02-07
      • 2012-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多