在虚拟环境中使应用程序与Windows 7兼容(1)(6)
使用基于每个应用程序的填充程序数据库来填充App-V 应用程序
通过部署填充程序来解决应用程序兼容性问题的另一种方法是随应用程序部署填充程序。在 MSI 环境中,通常将 .sdb 文件包括在安装程序中,然后加入一个自定义操作,该自定义操作针对它所放置的 .sdb 文件调用 sdbinst。这样,会将自定义填充程序数据库作为安装程序的一部分来安装。(如果您随后需要对该应用程序的填充程序进行更新,则需要找到所有已安装的客户端,并运行一个脚本来安装更新,这会使事情变得有些复杂。)
您可以使用 App-V 完成几乎相同的工作。您可将填充程序数据库 (.sdb) 文件包括在序列本身之中,这样 .sdb 文件就位于气泡图内。首先,对需要使用填充程序的应用程序进行排序,以便其正常运行。然后,将自定义填充程序数据库放入 system32 中。
(尽管我通常会建议人们绝不要将任何内容放到 system32 中,除非您的工资单是由 Steve Ballmer 签发的,并且您的上级包括 Steven Sinofsky;在这种特定情况下,我才会选择这样做,因为这样可简化脚本编写,system32 将在您的路径中,并且不会在生产系统的 system32 中实际留下任何内容,就像是在虚拟文件系统的 system32 中那样)。
做完这项工作后,我将编辑 .sprj 文件。我浏览到“虚拟文件系统”选项卡,然后单击“视图”|“虚拟文件系统”|“添加”。然后,我浏览到放置 .sdb 文件的位置 (c:\windows\system32\appshim.sdb),并单击“确定”。此时,该 .sdb 文件将位于气泡图内,并在安装 softgrid 软件包时进行安装。因为该文件是容器的一部分,所以它将作为应用程序的一部分进行传送(可在更新应用程序时进行更新)。
当然,要使用应用程序修补程序,只是将 .sdb 文件放到文件系统中还不够,还必须安装这些修补程序。不过,填充程序数据库必须安装在 App-V 气泡图的外面。如果将填充程序数据库安装在气泡图内,则在创建进程之前,不会发现虚拟化的 .sdb 文件;创建进程之后,填充程序找到该文件并针对它进行操作已经太晚。您需要使填充程序数据库在创建进程时能够被气泡图外面的加载程序访问。
令人高兴的是,App-V 包含一个将脚本作为应用程序启动进程的一部分来运行的机制。如果您使用最喜欢的文本编辑器来查看应用程序的 OSD 文件,就会发现只能对 XML 进行编辑。<SOFTPGK> 元素包含一个 <IMPLEMENTATION> 元素、一个 <DEPENDENCY> 元素、一个 <PACKAGE> 元素、一个 <ABSTRACT> 元素、一个 <MGMT_SHORTCUTLIST> 元素和一个 <MGMT_FILEASSOCIATIONS> 元素。<DEPENDENCY> 元素是您需要编辑的元素,您将添加子 <SCRIPT> 元素,以便安装自定义填充程序数据库。下面是一个脚本示例,该脚本可在应用程序启动时安装自定义填充程序数据库,并在应用程序退出时将其删除(因此,这是一种可清理其身后内容的 JIT 安装,是 App-V 的一个重要目标):
通过该脚本,您可从 App-V 气泡图的外面调用填充程序数据库安装程序 (sdbinst.exe),但要使用位于 App-V 气泡图内部的 .sdb 的一个参数,该 .sdb 随后将作为应用程序部署序列的一部分进行部署。因此,应用程序修补程序的部署和更新十分容易,就像它们是该应用程序的任何其他部分一样。
自定义填充程序数据库的安装过程要求拥有管理员权限;在运行时进行安装这是否会发生问题?您不希望您的用户拥有管理员权限,您的用户也不希望每次启动应用程序时都不得不单击 UAC 对话框。令人高兴的是,您无需那样做;对 sdbinst.exe 的调用会自动提升。安装填充程序的进程树如图 4 所示。
图 4 填充程序安装进程树
将创建一个命令 Shell,该命令 Shell 随后调用 sdbinst.exe 来安装自定义填充程序数据库。在调用应用程序信息服务(提供提升的服务)之前,会失败两次,其错误为 STATUS_ELEVATION_REQUIRED。上述服务调用 consent.exe,后者对策略进行检查以确定是否应提升应用程序。策略(在虚拟环境中)返回“是”而无需提示用户;consent.exe 批准提升,并创建 sdbinst.exe 的一个提升实例,该实例将安装自定义填充程序数据库。但是请务必注意,不提示就提升的策略只有在您能提升的情况下才会无提示运行。如果您是标准用户,则每次启动应用程序都会出现一条需要管理员凭据的提示,每次关闭应用程序也是如此。因为在标准用户环境中人们非常不希望出现这种情况,所以,只有在已部署本地管理员用户的情况下,这种方法才有效。我们希望只有极少的用户需要应用这种方法!