我们能否让UAC提示仅显示一次?

5

有没有一种方法使应用程序仅在第一次运行时向用户显示UAC提示。此后,不再出现提示。

换句话说,我知道我们的应用程序需要用户的UAC权限才能执行某些操作。这很好。但我们不希望它在每次运行时都要求权限。用户是否可以永久授权我们的应用程序?或者我所要求的违反了UAC的基本原则?

我们正在使用.NET和Windows 7。


你使用的是Vista还是Windows 7? - Richard Ev
Windows 7,如果解决方案也适用于Vista,那就更好了。 - hawbsl
1
你能举一些需要管理员权限才能运行的软件功能的例子吗?我只是好奇想知道。我们很难想出任何场景,需要我们的某些软件才能运行。 - Ian Boyd
我们正在访问卷影副本。 - hawbsl
刚刚看到你下面的概述/回答。看起来不错。 - hawbsl
6个回答

15

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


Microsoft特别禁止这种行为。如果应用程序可以将自己添加到排除列表中,那么我们会回到以前的混乱时期。

你需要做的是使你的程序不需要管理员访问权限。

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

  • 我不能运行你的软件吗?
  • 当我是标准用户时,你的软件崩溃了吗?
  • 当以标准用户身份运行时,你的软件没有任何价值,也没有任何功能吗?

Windows XP没有UAC的便利性。用户作为管理员运行您的程序的唯一方法是使用另一个用户登录。这比单击“继续”要糟糕得多。

如果你不想写与标准用户兼容的软件,那么你就是问题的一部分。UAC不是问题,UAC是一种便利。我可以关闭UAC,全职作为标准用户运行,但你的软件仍然无法工作。


Microsoft正在考虑

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

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

如果存在这样的白名单,那么你的应用程序将成为恶意软件的目标。它会喜欢修改二进制文件以执行它想要的内容;因为它知道该程序将被静默提升。

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

如果用户有禁用程序未来提示的选项,那么他们只会这样做,每个程序都将作为管理员运行,我们将回到以前的状态。
所有这些想法都无法解决问题:几乎没有一个程序实际上需要管理权限
现在是时候强制开发人员接受这个事实了。

白名单无法奏效

有些人想出了让白名单奏效的方法。
  • 添加一个复选框,用户可以选择“不再提示我此文件”
    如果您存储该文件名,则具有相同名称的其他程序将以管理员身份静默运行。
  • 好的,那我们记录全路径或使用文件哈希作为白名单条目。 如果有白名单,其他程序会在安装时将自己添加到该列表中,并以用户不想要的管理员权限运行。
  • 如果只允许签名应用程序,那么我们就知道它们是安全的。 应用程序并不安全,因为它们被签名。一个应用程序不必成为恶意软件,也可以被滥用以执行糟糕的操作(例如Flash、Firefox、IE、Chrome、Safari、Opera、Word、Photoshop、雅虎图像上传工具中的缓冲区溢出)。
您必须在某个地方存储有效代码签名者的列表。无论如何切割它,任何白名单都意味着应用程序将仅添加自己到该列表中。
  • 那么,请不要允许它们访问该列表。即使管理员也不允许向列表中添加项目。 如果甚至管理员也不能向列表中添加项目,那么用户如何首先添加项目到白名单中呢?如果您没有权限添加项目到白名单中,则无法将项目添加到白名单中!

那么如何管理白名单呢?比如用户改变了想法,父亲改变了想法,IT部门改变了想法,公司改变了想法,或者软件发布商改变了想法:当没有人被允许修改名单时,如何从名单中删除项目。

总结:白名单无法发挥作用


3
这是一种表面上看起来不那么友好但可能是正确的简单方法。虽然你的应用程序需要提升的权限可能有很好的理由,但在许多情况下,这只是因为该应用程序没有遵循最佳实践,并且从一开始就编写得很糟糕。在大多数情况下(例如自动更新),很少需要提升权限,因此在实际需要时触发它们对用户来说并不是负担。如果你的应用程序每次都需要这些权限,那么设计可能存在缺陷。 - Iain Collins
6
用户不应该反复点击。关键是打击开发者的头,使他们实际上不需要管理员权限。几乎没有必要这样做。一旦整个软件生态系统将管理员访问变得罕见,那么用户将很少遇到UAC提示。然后他们会认识到管理员访问是什么:危险的事情,不应轻易授权。接下来的7年将是痛苦的过渡时期,开发者因为懒惰而受到指责。 - Ian Boyd
1
如果白名单包含应用程序签名,并且加入白名单的唯一方式需要UAC提示,那么为什么白名单不能起作用呢?我不明白为什么被列入白名单的程序会比用户只需点击“确定”按钮的程序更容易成为缓冲区攻击等攻击向量。 - supercat
1
@supercat 你打算将这个白名单存储在哪里,以防安装程序添加自己进去?一个文件?注册表? - Ian Boyd
2
@Joshua Drake:“你的论点假设微软会把它随意放置”,请给出其他任何可能的位置。你一直跳过这个问题,好像这只是一个小的实现细节。“没有理由让每个以管理员身份运行的应用程序都必须对此具有写入权限。” 每个以管理员身份运行的应用程序都必须具有对此进行写入操作的权限 - 因为他们是管理员。要么他们有管理机器的权力,要么他们没有。听起来你在提议某种“高级用户”安全级别。但那我怎么以管理员身份运行呢? - Ian Boyd
显示剩余15条评论

3
更新:Oops,我最初误读了问题,将其解释为“仅在第一次运行时提示一次”,而不是“每次运行仅提示一次”(下面已进行修改)。
你不能永久授予应用程序管理员权限,这确实违反了UAC的设计。
但是,有一种方法可以绕过这个问题,那就是创建一个服务,该服务与您的应用程序通信,并能够在后台使用提升的权限执行任务,而无需主应用程序需要提升的权限。
服务只需要在安装时提示一次。
如果听起来像太多工作,请查看SkipUAC实用程序的捆绑方式,该实用程序使用了这种方法,允许用户在每次启动时都不需要提示UAC。
我的原始答案:
如果可执行文件具有设置了requireAdministrator的清单,它应该仅在每次初始启动时触发UAC提示,但之后不会再出现提示(即所有操作,包括最初进程启动的其他应用程序,都将继承提升的权限,但是如果退出应用程序并再次启动,则提示将再次出现)。
您可以通过Visual Studio 2008/2010中的IDE或使用最新服务包附带的命令行实用程序为EXE设置清单(这可以集成到构建步骤中以自动化该过程,但在2005年版本中需要一些技巧)。
我会在网络上搜索“UAC”和“清单”以获取更多信息,在线MSDN文档中有比较详细的文档(一旦你知道该如何查找)。
这在Windows 7和Windows Vista中同样适用。

但是用户可以为我们的应用程序永久授权吗?这样在后续的执行中,UAC就不会再出现了吗? - hawbsl

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

有一个概念是让一些高级处理一直运行,并且用户可以与其通信。但是我们必须小心,恶意软件会喜欢攻击您的服务,以使其执行任意代码。 - Ian Boyd


0

抱歉,请忽略我刚才写的内容,我读错了问题。 - Iain Collins

-2
用户应该能够右键单击可执行文件,然后进入属性 -> 兼容性 ->“以管理员身份运行此程序”。

2
它不会弹出UAC提示框吗?我以为这主要是为了修复旧版本的应用程序崩溃,这些应用程序在执行需要管理员权限的操作之前没有请求该权限? - Fire Lancer
是的,如果用户不是管理员,则许多程序在Windows XP上会崩溃。您可以勾选该框而不是每次都“以管理员身份运行”。 - Ian Boyd
这仍然会出现提示。唯一的方法是在安全设置中明确地关闭它才能摆脱提示。 - Joshua Drake

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接