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

我尝试运行这个,在关闭 UAC 的计算机上,它运行良好,无需任何其他设置。但是,在打开 UAC 的计算机上(Windows 7 中“从不通知”以上的任何级别),它将崩溃。我需要它在所有计算机上运行。

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

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

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

感谢您的帮助。

编辑: 谢谢您的回复。我意识到围绕 UAC 进行工作会让人皱眉,而且我可以看到 Microsoft 不支持“白名单”,因此它只会请求一次许可。没关系,我可以尊重这一点,但我确实有一些后续问题:

  • 您能否向我提供一个链接,向我展示如何正确提升程序以纠正提升状态?有没有关于选项等的文献?基本上我想要一份 UAC 101 指南。

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

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

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

有帮助吗?

解决方案

正确的方法是在程序启动时使用 UAC 提示(您可以通过程序的清单设置)进行提升 - 试图聪明地绕过它是不被允许的。

想一想 - 如果您可以安装一些无需 UAC 提示即可自动提升的东西......UAC 的意义何在?

要将 UAC 清单添加到程序中,您只需将清单添加到项目中并对其进行编辑即可。UAC 的示例清单是 这里. 。如果您想在最后可能的时刻提升,那么您需要一个生成单独的进程 - 您无法提升现有进程。因此,将这一点分开,然后使用

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

其他提示

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

所以你有两个选择:

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

您可以将程序分成两个部分:

  • 无需提升即可运行的用户应用程序
  • 负责需要提升的任务的 Windows 服务

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

顺便说一句:以编程方式修改 C:\Program Files 下的文件不被认为是好的做法,并且可能会导致许多其他问题。Windows 有专门的位置来存储配置设置和其他程序数据。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top