Windows 7开发:安装程序检测 - 白皮书2011-04-18 MSDN 介绍伴随着用户帐户控制( UAC )在 Windows Vista 中的出现,应用程序在默认情况下都是 以标准用户的权限来运行的。这对于早期版本的应用程序会是一个问题,因为他们将以管理 员权限来运行(在 Windows Vista 之前的版本中通常也是如此)。然而一些项目需要以管理 员的权限来运行,多数安装程序显然需要对特殊权限的位置进行写入操作,例如: ProgramFiles 文件夹或者是注册表中的 HKEY_LOCAL_MACHINE 。这些项目都将失败并收到拒 绝访问错误。在 Windows Vista 中要对此进行修复,操作系统将会进行一些监测以确定它是不是可执 行的,事实上它是不是一个安装程序,如果是,系统会为其提升至管理员权限。但是,有时 候这些检测自身也可能会引发问题。它是如何工作的所有的没有清单文件(外部的或是内置的)的 32 位应用程序都会进行安装侦测。操作系 统假设这些应用程序都是“早期版本”,它们都将以管理员权限来运行。侦测方法包含了查看文件名并搜索文件名中是否包含关键字“ setup ”“ install ”和 “ update ”,如果找到了,一个盾牌似的图标的会覆盖在原有图标上,就像下面显示的 Windows 资源管理器的图标一样,表明这个应用程序需要管理员权限来正确运行。

问题虽然这个侦测可以使早期版本的安装程序可以在 Windows Vista 或者以后版本的操作系 统中正确的运行,它也可以引起对一些非安装应用程序进行不必要的权限提升(例如, StockUpdater.exe )。这些应用程序对于侦测来讲是需要提升权限的,但是在严格意义上来 讲可能并不需要。这可能给用户带来安全隐患和麻烦,并且由于害怕它们可能给它们的系统 带来损害,用户可能会放弃使用该应用程序。反过来也仍然会有问题。一个不使用 Microsoft Windows Installer ( MSI )并且没有 按照侦测法命名的自定义的安装程序,可能确实需要以管理员权限来运行。但是由于侦测没 有把它识别为一个安装程序,没有添加类似盾牌的图标或者没有提升权限,应用程序可能会 在安装的过程中失败。解决方案最直接的解决方案是添加清单文件。如果应 用程序源不可用,那么只能在包含可执行文件的文件夹中添加一个外部清单文件。该清单文 件的名称应该使用与可执行文件相同的名字并在其后面加上“ .manifest ”(例 如, StockUpdater.exe.manifest )。这个清单文件应该定义了应用程序何时需要管理员权 限,或者使用标准用户权限就可以成功运行了。一个标准的的清单文件应该和下面的 看起来类似 :
<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft- com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<assemblyIdentity version="1.0.0.0" name="StockUpdater"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas- microsoft-com:asm.v3">
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
</asmv1:assembly>
例子中,红色的文字显 示了清单文件中包含级别属性的有效部分 :• asInvoker – 表明应用 程序应该使用创建者权限来运行。这意味着应用程序是以和 Windows 资源管理器拥有同样级 别的权限来运行的,通常是标准用户权限。这个应用程序并不是一个安装程序并且不会被侦 测所标记。• requireAdministrator – 表明该应用程序应该以管理员 权限来运行(可能由于它是一个安装程序)。• highestAvailable – 表明该应用程序应该以可以达到的最高的权限级别来运行。如果用户是管理员,那么效果就 和 requireAdministrator 一样了。如果源代码可用,您可以使用 Microsoft Visual Studio 2008 用户界面来添加一个清单文件。新项目通常在默认情况下会包含一个 清单文件。总结安装侦测通过确定 “早期版本的”项目为安装程 序,来允许这些程序正常运行。但是,这些侦测可能会导致不需要的结果。系统只会对没有 清单文件的 32 位可执行文件进行侦测。可以通过添加一个清单文件来去除不必要的侦测并 指定所期望的行为。