使用基于每个应用程序的填充程序数据库来填充 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 进行编辑。
<DEPENDENCY> <CLIENTVERSION VERSION="4.6.0.0"/> <SCRIPT EVENT="LAUNCH" PROTECT="TRUE" TIMING="PRE" WAIT="TRUE" EXTERN="TRUE"> <SCRIPTBODY LANGUAGE="Batch">sdbinst /q appshims.sdb</SCRIPTBODY> </SCRIPT> <SCRIPT EVENT="SHUTDOWN" PROTECT="TRUE" TIMING="POST" WAIT="TRUE" EXTERN="TRUE"> <SCRIPTBODY LANGUAGE="Batch">sdbinst /u appshims.sdb</SCRIPTBODY> </SCRIPT> </DEPENDENCY>
通过该脚本,您可从 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 的一个提升实例,该实例将安装自定义填充程序数据库。但是请务必注意,不提示就提升的策略只有在您能提升的情况下才会无提示运行。如果您是标准用户,则每次启动应用程序都会出现一条需要管理员凭据的提示,每次关闭应用程序也是如此。因为在标准用户环境中人们非常不希望出现这种情况,所以,只有在已部署本地管理员用户的情况下,这种方法才有效。我们希望只有极少的用户需要应用这种方法!
结论
Microsoft Application Virtualization 是一个功能强大的应用程序管理和部署工具。如果在 Windows 7 迁移计划中使用该工具,有可能降低安装测试过程中的成本(不过,成本不会降到 0)。
继续利用大多数同样的过程,还可以使用填充程序解决应用程序兼容性问题。如果要在组织范围内部署单个填充程序数据库,要进行的转换任务很少,只需小心避免提升填充程序(与在 App-V 环境中通常应避免提升的情况大体一样)。如果要部署基于每个应用程序的填充程序,可以使用一些适当的方式来打包和部署应用程序的填充程序数据库,不过,这种情况下,有一个显著的缺点,即无法合理地以非管理员用户的身份运行应用程序。因此,强烈建议(就像在基于 MSI 的应用程序部署中那样)尽量以集中管理的单个数据库的形式部署填充程序,这种情况下,可以使用现有的系统管理软件进行部署。如果采用这种方式,将来在您的用户中,以非管理员身份运行的用户的比重会越来越大。