3

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

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

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

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

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

感谢您的帮助。

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

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

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

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

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

4

3 回答 3

3

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

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

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

Process.StartInfo.UseShellExecute = true;
Process.StartInfo.Verb = "runas";
于 2010-02-10T14:30:06.570 回答
0

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

所以你有两个选择:

  • 更改您的任务,使它们不再需要管理提升(例如,将您的文件写到别处)。
  • 将您的应用程序分解为一个 Windows 服务组件和一个用户界面组件。服务组件可以在提升的帐户下运行(希望是执行您需要执行的任务所需的最低提升的帐户)。必要时,用户界面组件可以与服务对话(通过命名管道或类似的方式)。
于 2010-02-10T14:44:54.940 回答
0

您可以将程序拆分为两个组件:

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

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

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

于 2010-02-10T14:46:46.823 回答