【问题标题】:Can we get the UAC prompt to show only once?我们可以让 UAC 提示只显示一次吗?
【发布时间】:2011-01-02 10:44:57
【问题描述】:

有没有办法让应用在首次运行时只向用户显示一次 UAC 提示。此后,不再提示。

换句话说,我了解我们的应用需要用户的 UAC 权限才能执行某些操作。这很好。但我们不希望它在每次运行时都不断询问。用户可以一直授予我们的应用程序权限吗?还是我的要求违反了 UAC 的基本原理?

我们正在使用 .NET 和 Windows 7

【问题讨论】:

  • 您使用的是 Vista 还是 Windows 7?
  • Windows 7,如果该解决方案也适用于 Vista,那么这是一个奖励
  • 您能否举例说明您的软件执行哪些操作需要管理员访问权限?我只是想知道。很难想出我们的某些软件需要它的任何场景。
  • 我们正在访问卷影复制
  • 刚刚在下面看到了您的概述/答案。看起来不错

标签: .net windows-7 uac


【解决方案1】:

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

【讨论】:

  • 还不给UAC提示吗?我认为这主要是为了修复旧版应用程序崩溃,这些应用程序需要管理员权限,但在执行之前没有要求这些权限?
  • @Fire Lancer 是的,如果用户不是管理员,许多程序会在 Windows XP 上崩溃。而不是每次都“以管理员身份运行”,您只需选中该框即可。
  • 这仍然给出提示。摆脱提示的唯一方法是在安全设置中专门将其关闭。
【解决方案2】:

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

【讨论】:

  • 糟糕,请忽略我刚刚写的内容,我看错了问题。
【解决方案3】:
【解决方案4】:

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

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

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

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

如果这听起来工作量太大,您可以看看与 SkipUAC 实用程序捆绑,该实用程序使用类似的方法允许用户启动应用程序,而不会在每次启动时提示输入 UAC。

我的原始答案:

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

您可以通过 Visual Studio 2008/2010 中的 IDE 为 EXE 设置清单,或使用 VS 2005 最新服务包附带的命令行实用程序(这可以集成到构建步骤中以自动化这个过程,但在 2005 年有点做作)。

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

这在 Windows 7 和 Windows Vista 中同样适用。

【讨论】:

  • 但是用户可以一直授予我们的应用程序权限吗?所以 UAC 永远不会出现在后续的执行中?
【解决方案5】:

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


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

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

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

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

Windows XP 没有 UAC 的说服力。用户以管理员身份运行程序的唯一方法是使用另一个用户登录。这比点击“继续”的用户体验差得多。

如果您不想编写标准用户友好的软件,那么您就是问题的一部分。 UAC 不是问题,UAC 是一种便利。我可以关闭 UAC,以标准用户的身份全职运行,而您的软件仍然无法运行。


Microsoft considered

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

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

如果存在这样的白名单,那么您的应用将成为恶意软件的目标。它很想修改二进制文件来执行它想要的东西;因为它知道程序将被静默提升。

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

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

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

终于到了迫使开发人员接受这一事实的时候了。


白名单不起作用

有些人想想办法让白名单发挥作用。

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

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

  • 如果只允许签名的应用程序怎么办,这样我们就知道它们是安全的。 应用程序不安全,因为它们已签名。一个应用程序不必是恶意软件,它就会被滥用来做坏事。 (例如,flash、firefox(即 chrome、safari、opera、word、photoshop、Yahoo 图像上传工具)中的缓冲区溢出)。

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

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

您如何管理白名单?假设用户改变了主意,或者爸爸改变了主意,或者 IT 改变了主意,或者公司改变了主意,或者软件发布者改变了主意:你如何从列表中删除项目 - 特别是当没有人时允许修改列表。

总结:白名单不起作用

【讨论】:

  • 这是一种简单且表面上可能不友好的方法,但它可能非常正确。虽然在许多情况下您的应用程序需要提升权限可能有一个很好的理由,但这仅仅是因为该应用程序没有遵循最佳实践并且一开始就写得不好。在大多数情况下(例如自动更新),很少需要提升权限,因此在实际需要时触发对用户来说不是负担。如果您的应用在每次设计/可能/有缺陷时都需要它们。
  • @hawbsl:用户不应该再点击再点击。关键是要打开发者的后脑勺,让他们实际上不需要管理权限。您实际上几乎没有理由这样做。一旦整个软件生态系统使管理访问变得稀少,那么用户将很少看到 UAC 提示。然后他们将看到管理访问权的本质:危险的东西,不能轻易授予。接下来的 7 年将是痛苦的过渡期,开发者会因为懒惰而被淘汰。
  • 如果白名单包含应用程序签名,为什么它不能工作,而进入白名单的唯一方法需要 UAC 提示?我不明白为什么列入白名单的程序更像是缓冲区攻击等的攻击媒介,而不是用户只需单击“确定”的程序。
  • @supercat 你打算将这个白名单存储在哪里,这样安装程序就无法将自己添加到其中?一份文件?注册表?
  • @Joshua Drake “您的论点假设 MS 会将其放置在周围” 说出 任何 其他可以放置的位置。你一直跳过这一点,就像它是一个次要的实现细节。 “没有理由每个以管理员身份运行的应用程序都必须对事物具有写入权限。” 每个以管理员身份运行的应用程序都具有对事物的写入权限是有原因的 - 他们是管理员.他们要么有权管理机器,要么没有。听起来您正在提议某种“高级用户”安全级别。但是那我该如何以管理员身份运行呢?
【解决方案6】:

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

【讨论】:

  • 有一些提升的处理一直在运行的概念,用户可以与之通信。但我们很担心,恶意软件会喜欢戳你的服务,让它执行任意代码。
猜你喜欢
  • 2018-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
  • 2019-06-14
  • 2020-11-10
  • 1970-01-01
相关资源
最近更新 更多