安装必须以管理员身份运行的程序

时间:2010-02-10 14:28:02

标签: c# deployment uac setup-deployment

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

我尝试运行此功能并在关闭UAC的计算机上运行良好,无需任何其他设置。但是,在打开UAC的计算机上(任何级别高于'永不通知'在Windows 7中)它将崩溃。我需要它才能在所有计算机上运行。

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

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

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

感谢您的帮助。

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

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

  • 当我需要额外的权限时,是否有办法提升安全状态(然后只有UAC提示)。基本上这个应用程序在后台运行,大部分时间都没有。它会不时地检查一些文件(此时我将需要能够写入磁盘并读取注册表(此时只读即可),但是因为它是一个临时文件夹,所以我无所谓如果有一个位置,应用程序可以在没有任何完美权限的情况下编写。)

    但是在某些时候我需要预先形成所有剩下的任务(用户需要确认此操作),所以如果UAC会在此时提示那没问题。有没有办法在此时提升它,然后将其恢复为默认权限?

  • 这样的解决方案是否可以与旧版本的Windows一起使用,包括Vista和Xp(可能更老?)。它可以使它工作吗?

3 个答案:

答案 0 :(得分:3)

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

考虑一下 - 如果你可以安装一些在没有UAC提示的情况下自动提升的东西...... UAC有什么意义呢?

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

启动它
Process.StartInfo.UseShellExecute = true;
Process.StartInfo.Verb = "runas";

答案 1 :(得分:0)

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

所以你有两个选择:

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

答案 2 :(得分:0)

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

  • 正常运行的用户应用程序
  • 负责需要提升的任务的Windows服务

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

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