我们可以让UAC提示只显示一次吗?

时间:2010-01-07 11:06:17

标签: .net windows-7 uac

首次运行时,应用程序是否有办法仅向用户显示一次UAC提示。此后,没有进一步的提示。

换句话说,我知道我们的应用需要用户的UAC权限才能执行某些操作。那没关系。但是我们不希望它在每次运行时都要继续询问。用户是否可以一直授予我们的应用程序权限?或者我所问的是否违反了UAC的基本原则?

我们正在使用.NET和Windows 7

7 个答案:

答案 0 :(得分:13)

您的问题的答案是:不,您不能这样做。


微软特别禁止此类行为。如果应用程序可以将自己添加到排除列表中,那么我们就会回到之前的混乱中。

您需要做的是让您的程序不需要管理员权限。

问问自己:您在Windows XP上做了什么?

  • 我不允许运行你的软件吗?
  • 当我是标准用户时,您的软件会崩溃吗?
  • 您的软件没有提供任何价值,并且在标准用户运行时绝对没有功能吗?

Windows XP没有UAC的说服力。用户以管理员身份运行程序的唯一方法是使用其他用户登录。这比单击“继续”更糟糕的用户体验。

如果您不想编写标准用户友好的软件,那么您就是问题的一部分。 UAC不是问题,UAC很有意思。我可以关闭UAC,作为标准用户全职运行,而您的软件仍然将无效。


Microsoft considered

  • 白名单
  • 记住我的偏好
  • 不要再问我了。

如果你有一个白名单,那么每个程序都会在安装时将自己添加到这样的列表中。

如果存在此类白名单,那么您的应用将成为恶意软件的目标。它会喜欢修改二进制文件来执行它想要的东西;因为它知道程序会被无声升级。

恶意软件会喜欢用你的应用程序使用SendMessage,尝试传递无效的数据或结构,试图让你的管理应用程序执行它想要的代码。

如果用户可以选择禁用将来的程序提示,那么他们就会这样做,并且每个程序都将作为管理员运行,我们将回到原来的状态。

所有这些想法都没有解决问题:几乎没有程序实际上需要管理员访问

现在是时候迫使开发人员接受这个事实。


白名单无法正常工作

有些人希望想出办法让白名单工作。

  • 有一个复选框,用户可以说“不要再提示我输入此文件”
    如果存储该文件名,则其他具有相同名称的程序将以管理员身份静默运行。

  • 好的,然后我们将记录完整路径,或使用文件的哈希作为白名单条目。 如果有白名单,那么其他程序会在安装时将自己添加到该列表中,并使程序运行具有用户不想要的管理访问权限。

  • 如果只允许签名的应用程序,那么我们知道它们是安全的。应用程序不安全,因为它们已经签名。应用程序不必是恶意软件,因为它被滥用于做坏事。 (例如flash中的缓冲区溢出,firefox,即chrome,safari,opera,word,photoshop,Yahoo image uploader工具)。

您必须将有效代码签名者列表存储在 somehwere 列表中。无论你如何分割它,拥有任何白名单意味着应用程序只会将自己添加到该列表中。

  • 那么,不要让他们访问列表。甚至管理员也不允许将项目添加到列表中。如果管理员甚至不能将项目添加到列表中,那么用户如何首先将项目添加到列表中?如果您不允许将项目添加到白名单,则无法将项目添加到白名单中!

你如何管理白名单?让我们说用户已经改变了主意,或者爸爸改变了主意,或者IT改变了主意,或者公司改变了主意,或者软件发行商改变了主意:如何从列表中删除项目 - 尤其是当没有人允许修改列表。

摘要:白名单无效

答案 1 :(得分:3)

更新:哎呀我最初误解了这个问题并将其解释为“仅在第一次运行时提示一次”,而不是“每次只运行一次”(相应编辑如下)

您无法一直授予应用程序管理员权限,这确实违反了UAC的设计。

但是,解决此问题的一种方法是创建应用程序与之通信的服务,该服务能够在后台运行并使用提升的权限执行任务,而主应用程序无需提升权限。

服务只需要在安装时提示一次。

如果这听起来太多了,你可以看看捆绑SkipUAC实用程序,它使用这样的方法允许用户启动应用程序而不会在每次启动时提示输入UAC。

我原来的答案:

如果可执行文件具有requireAdministrator设置的清单,则它应该仅在每次初始启动时触发UAC提示,但不会在此之后触发(即所有操作,包括初始进程启动的其他应用程序将继承提升的权限,但如果您退出应用程序并再次启动它将再次出现提示。)

您可以在Visual Studio 2008/2010中通过IDE设置EXE的清单,或者使用VS 2005最新Service Pack附带的命令行实用程序(可以将其集成到构建步骤中以自动执行)这个过程,但在2005年有点软糊涂。)

我会在网上搜索“UAC”和“manifest”以获取更多信息,它在在线MSDN文档中有相当好的文档记录(一旦知道你要查找它)。

这在Windows 7和Windows Vista中同样有效。

答案 2 :(得分:3)

唯一的方法是将自己安装为服务或设备驱动程序。

答案 3 :(得分:1)

答案 4 :(得分:0)

如果这是可能的(我不认为它正在考虑说How to configure Visual Studio not to give UAC prompt on each run?),我很确定它必须在用户端完成(比如首先禁用提示),而不是申请方。

答案 5 :(得分:0)

开发人员需要在他们头后面打一巴掌吗?

我创建了2个备份程序。

两者都要求管理员权限运行....为什么?因此,用户可以在那里备份文件。

我可以在后台运行此服务吗? mabye?可能不是。

这就是所有AV软件在后台都有服务的原因。 所以GUI就是它的GUI ......没有功能,除了将命令/信息传递回服务,此时命令等运行。

是否白名单工作取决于用户... 我知道一个事实的用户只是一直点击'ALLOW'......他们甚至都不读它。 那么UAC如何保护它们,那些愚蠢的评论等没有帮助。 他们这样做是因为UAC每次去做某事都会提示他们。

备份程序,启动应用程序,编译器,生成器所有这些都需要管理员权限。

坦率地说,服务并不总是答案,因为它实现起来很耗时,而且当它需要时你不能确定它被删除/重新启动(自动更新)。

答案 6 :(得分:-2)

用户应该能够右键单击可执行文件并转到属性 - >兼容性 - > “以管理员身份运行此程序”