UAC提示触发器列表?

4
我刚刚运行了一个我几年前编写的旧程序,比Vista发布还要早几年。Windows(7)给我显示了UAC提示,并要求我授权运行它。这让我很惊讶,因为这是一个相对简单的程序,没有任何花哨的东西,当然也没有需要提升权限的内容。然后我检查了目录,发现Windows正在该程序上覆盖盾牌图标。
我快速扫描了代码,没有看到任何明显触发UAC提示的地方。此外,该程序与我编写的其他几个程序共享一个框架,其中没有一个需要UAC权限。问题所在的程序以及其他不会触发UAC提示的程序都存储在同一个目录下,位于(FAT32)闪存驱动器上。
唯一真正与其他几乎相同的程序不同的地方是,它使用ShellExecute允许用户启动默认的Web浏览器来打开选定的URL,但我无法想象为什么会需要提升权限。
现在我正在尝试找到关于Windows如何确定何时使用UAC提示的启发式信息。我知道旧的安装程序通常会触发提示,但这些通常称为setup.exeinstall.exe,而此程序具有非常无害的名称(udb.exe)。我怀疑它是检测某些函数调用或类似的东西(当然,这意味着Windows Explorer读取并反汇编所有可执行文件,这似乎是不可行的)。
我认为应该存在一些关于此内容的信息,但我所做的研究只发现了一些离题的讨论(上面或右侧的“类似问题”列表中没有提到),其中列出了一些原因,但都不适用:
- 程序的特定请求(在UAC出现之前写成的程序显然不可能), - 缺少清单(它确实有一个,也无法解释为什么其他程序不会触发它) - 文件名/路径的内部列表(这里不适用) - 源代码(同样,这并不能解释其他程序为什么可以正常运行) - 访问受限文件/注册表键(这里也不适用) - 资源条目(再次,其他程序共享相同的资源数据) - 其他与系统相关的活动(同样,对于这个程序也不适用)
我最终找到了一些相关的问题,如一个询问和我一样的问题,但那个问题得出了完全不同的结果,对这里没有帮助,还有一个类似但相反的问题,同样没有帮助。不幸的是,我找到的最佳问题是关于安装程序/更新程序的(当然,这里并不适用),而且也没有帮助,因为答案只是我在其他网站上找到的旧信息,如上所述。

有没有人知道UAC触发器的列表或其他方法来确定为什么Windows会认为某些程序需要提升权限?是否有受限API函数的列表或类似的东西?

明确一下,我正在尝试找出为什么Windows会为一个程序设置UAC,但不会为另一个类似的程序设置。


1
@HarryJohnston,你也误解了问题。就像我说的那样,我很困惑为什么我之前在Vista出现之前编写的一个程序不会触发UAC,而类似的程序却会触发。我想知道为什么Windows会这样做。如果有一个函数、文件、注册表键、字符串等列表,那么我可以对其运行搜索以尝试找出Windows看到了什么使其启动。至于清单,那就违背了问题的意义。我不是要避免提示,我想知道为什么它会发生。就像我说的,我找不到任何原因。 - Synetech
2
UAC基于用户权限,而不是一些奇妙的触发器,如文件、字符串等。@Xearinox,错误!已知有某些因素可以触发UAC。做一些研究。例如,我已经列出了几个可能导致它的事情,比如文件名为setup.exe。这与权限有什么关系呢? - Synetech
1
@HarryJohnston,首先,如果只是出于好奇心,那么这并不是离题的,因为它涉及到Windows API函数及其影响,这显然是本主题。其次,我想知道为什么,因为它不应该发生。我真的不明白为什么这么难理解,为什么你对一个简单的问题如此抵触。另外,你看到我链接的类似问题了吗?它们没有被关闭为离题。 - Synetech
1
听起来对我来说是浪费时间的大事情。那么你不是网站管理员或仲裁者,无法判断什么是有效的时间利用,这是一件好事。如果你认为我的问题太可怕了,正在破坏网站并带来世界末日,只需投票关闭或标记它,让版主决定即可。至于你所说的其他一切,除非你能提供某种理由证明你具有权威地位,否则听起来你只是在推测触发器(你真的认为Explorer有启发式算法吗?)以及微软发布或未发布或记录的内容。 - Synetech
1
我怀疑你不会得到你想要的答案。在我看来,最好逐个分析问题可执行文件。 - Bill_Stewart
显示剩余7条评论
1个回答

4

原始答案(2014年7月4日)

搜索“UAC启发式”会得到这篇博客文章:识别管理应用程序。在该页面上:

操作系统会根据一种启发式方法判断应用程序是否像安装程序或更新程序,并在用户运行它时自动调用提升以使用管理员权限/特权运行程序。以下是一些启发式检测点,尽管此列表不是详尽无遗的:

  • 文件名检测-查找文件名中的“setup”、“update”、“install”等单词
  • SxS清单字检测-在程序的SxS清单中查找已知值的程序集名称属性
  • 字符串表检测-在可执行文件的资源部分中的字符串表中查找已知值

因此,Xearinox并不正确,它完全基于权限。

您可以使用Process Monitor来查找权限错误,以便找出为什么程序会触发UAC提示的原因。


更新(2020年7月29日)

搜索会得到更新的文档页面:

用户帐户控制的工作方式

该页面底部有一个安装程序检测技术部分,其中包含以下信息(类似于上面的列表):

在创建32位进程之前,将检查以下属性以确定它是否为安装程序:

  • 文件名包括关键字“install”、“setup”或“update”。
  • 版本资源字段包含以下关键字:供应商、公司名称、产品名称、文件描述、原始文件名、内部名称和导出名称。
  • 侧-by-side清单中的关键字嵌入在可执行文件中。
  • 特定StringTable条目中的关键字链接在可执行文件中。
  • 资源脚本数据中的关键属性链接在可执行文件中。
  • 可执行文件中有针对性的字节序列。

我不认为进程监视器会有帮助,因为在进程启动之前就已经决定是否需要提升权限了。 - Harry Johnston
@HarryJohnston - 您可以禁用UAC,然后以标准用户身份运行应用程序。然后,进程监视器可能会提供一些线索。 - Bill_Stewart
2
启动可执行文件时会使用启发式算法。我认为其他细节(博客作者未列举的列表中的其余部分)应被视为可能随时更改的实现细节。 - Bill_Stewart
显然,这指的是您运行的可执行文件。并非所有触发UAC的可执行文件都显示盾牌图标叠加。 - Bill_Stewart
你需要搜索它;这就是为什么我在答案的第一句话中说“搜索”。避免链接失效也是我在答案中引用相关信息而不仅仅发布链接的原因。 - Bill_Stewart
显示剩余5条评论

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