【问题标题】:Why does my win32 program need elevation?为什么我的 win32 程序需要提升?
【发布时间】:2016-09-23 06:36:30
【问题描述】:

我有一个用于自动更新的非常简单的程序。它检查服务器上的可用版本 (HTTPS),下载新的更新并运行(可能更新的)程序。这是一个用Delphi 7编写的旧程序。在Windows 8和Windows 10下似乎这个程序需要提升(以管理员身份运行)。这是一个问题,因为一旦程序被提升,它也会启动更新的程序提升,这很糟糕。

程序代码很简单,它只包含来自服务器的Indy组件(TIdHTTP),以及用来执行他下载的程序的ShellAPI,一些IniFiles和一个进度条。

所以问题是:如何找出需要提升的 API 调用,以及如何替换它?是否有调试器可以判断哪个 API 调用(在哪个代码地址)需要提升?

【问题讨论】:

  • 做一些调试并找出程序失败的地方。您可能想要添加应用清单,以便虚拟化不会干扰。你知道怎么调试吗?
  • 当我将 exe 文件复制到 Windows 7 机器上时,它的图标会出现,其中包含管理员盾牌。我可以看到它在启动之前需要管理员权限。该程序无法以普通用户身份加载。所以我认为当我开始调试时,它已经被提升了。那我怎么知道是什么原因造成的呢?我不确定如何创建清单文件 - 从来没有这样做过。
  • 哦,我也不知道怎么调试,尤其是在windows 7下。这是一个只使用win32 api的简单程序。我不认为我有 win 7/8/10 的调试工具。
  • 可能与您的程序名称有关?检查stackoverflow.com/questions/31140051/…
  • 添加清单将停止该特定的兼容 shim。您为什么不花一些时间从文档中了解这些问题。当您对这些问题知之甚少时,您确定要做出决定吗?当您信息不灵通时,您不会做出错误的决定吗?

标签: windows delphi winapi


【解决方案1】:

可能的原因有:

您的程序使用“setup”、“installer”、“updater”等词命名。Windows 会在 .exe 名称、版本和其他资源中查找这些。

您的程序尝试写入 HKLM 或 HKCR 注册表配置单元或“Program Files”或“Windows\System”文件夹。

已建议 Windows XP 避免写入上述注册表配置单元和文件夹,但直到 Windows Vista 才真正强制执行。

您可以阅读有关User Account Control 和链接文档的更多信息。

【讨论】:

  • 仅当程序没有指定 requestedExecutionLevel 的 UAC 清单时才考虑文件名。写入 HKLM 或 HKCR 的程序代码在程序启动时不会触发 UAC 提升提示,它只会在运行时根据需要对注册表访问进行虚拟化/失败。
  • @Remy 感谢您的澄清
【解决方案2】:

不一定是需要提升的 API 调用。它可能只是程序名称。它可能被称为somethingUPDATE.exe 之类的东西吗?如果是这样,那么如果没有 UAC 清单来指定提升设置,Installer Detection 将启动,Windows 将认为该程序是一个安装程序并自动显示 UAC 提升提示。 (包含InstallSetupPatch 等的文件名也是如此)。

安装程序检测技术

安装程序是设计用于部署软件的应用程序,大多数会写入系统目录和注册表项。这些受保护的系统位置通常只能由管理员用户写入,这意味着标准用户没有足够的权限来安装程序。 Windows Vista 启发式检测安装程序并请求管理员凭据或管理员用户的批准,以便以访问权限运行。 Windows Vista 还启发式地检测更新程序和卸载程序。请注意,UAC 的设计目标是防止在用户不知情和同意的情况下执行安装,因为它们会写入文件系统和注册表的受保护区域。

安装程序检测仅适用于:

  1. 32 位可执行文件

  2. 没有请求执行级别的应用程序

  3. 以标准用户身份运行并启用 LUA 的交互式进程

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

  • 文件名包含“安装”、“设置”、“更新”等关键字。

  • 以下版本控制资源字段中的关键字:供应商、公司名称、产品名称、文件描述、原始文件名、内部名称和导出名称。

  • 嵌入在可执行文件中的并行清单中的关键字。

  • 可执行文件中链接的特定 StringTable 条目中的关键字。

  • 可执行文件中链接的 RC 数据中的关键属性。

  • 可执行文件中的目标字节序列。

注意

关键字和字节序列源自从各种安装程序技术中观察到的共同特征。

这个链接也可能很有趣:

Using the SpecificNonInstaller Fix

【讨论】:

  • 当 Remy Lebau 对它进行了如此多的编辑和改进时,我得到了这个答案的所有积分和徽章,这并不公平。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-11
  • 1970-01-01
  • 1970-01-01
  • 2019-06-09
  • 1970-01-01
相关资源
最近更新 更多