适用于: Microsoft Windows Vista
摘要:本文提供了针对 IT 部门的操作指南,介绍如何为不符合 Microsoft Windows Vista 中的“用户帐户控制”(UAC) 功能的现有应用程序创建和部署应用程序兼容性“补偿”(Shim)。
| 简介和背景知识 | |
| 运行级别标记 | |
| 权限提升的允许策略 | |
| 为创建应用程序兼容性数据库补偿做好准备 | |
| 运行 CompatAdmin.exe | |
| 删除 AppCompat 数据库补偿 | |
| 在企业内使用组策略进行部署 | |
| 自定义安装程序 VBScript 示例 | |
| 创建 .msi 程序包 | |
| MSI 的 Authenticode 签名 | |
| 测试程序包 | |
| 通过组策略部署 MSI | |
| 将组策略添加到 Microsoft Active Directory | |
| 测试部署 |
用户帐户控制(User Account Control,UAC)利用了最初在 Microsoft Windows NT 3.1 中设计的 Windows 安全架构。如果在 Windows Vista 中启用了 UAC,所有用户(包括管理员)都运行在标准用户帐户内。允许管理员有选择地启动管理程序,这些程序在需要时才使用帐户的完全权限。这是受保护管理员(Protected Administrator,PA)帐户概念背后隐藏的理念。在特权用户登录到他们的帐户中时,他们实际登录到标准用户帐户环境,但是他们可以通过批准来以完全权限运行应用程序。只有在批准之后,才允许应用程序以用户的完全权限运行。
对于符合 Windows Vista 标准的新应用程序,应用程序要么需要运行在标准用户帐户下,要么(对于管理程序)必须使用清单条目进行标记。在这种情况下,Windows 可以通知用户他们正在试图启动一个管理程序,并且需要对此进行批准。有关微软徽标计划的更多信息,请访问微软 Windows 徽标主页。
IT 部门可能会发现:在部署 Windows Vista 时,他们现有的业务应用不再能够正常工作。这很可能是由于应用程序与 Windows Vista 中包含的增强功能不兼容。微软提供了一个应用程序兼容性工具包,可帮助 IT 部门识别兼容性问题和创建兼容性补偿 (Shim)。IT 部门可能会发现,要使某个给定的程序在 Windows Vista 上正常工作,程序需要执行一些管理操作。如果发生这种情况,程序需要进行标记,以便在能够以完全的管理权限运行之前,首先提示用户对此进行批准。该工具包提供了构建和安装 AppCompat Database 条目的手段,让这种标记机制得以发挥作用。
有关应用程序兼容性的信息可以在此处找到.
应用程序兼容性工具包可以从此处找到.
为应用程序选择的“运行级别”取决于应用程序将执行何种类型的系统级操作。
| • | RunAsUAC - 应用程序的运行权限应该与其父进程的权限相同。这与程序没有任何 AppCompat 数据库条目的情况完全相同。应用程序拥有的权限与加载该应用程序的进程的权限相同。 | ||||
| • | RunAsHighest - 应用程序应以当前用户能够得到的最高权限运行,但是应用程序不必要求用户是一位管理员。.此标记用于两类应用程序。
| ||||
| • | RunAsAdmin - 应用程序应以管理员权限运行,并且要求使用管理员权限启动该程序。此标记适用于那些要求用户是 Administrators 组成员的应用程序。 |
允许策略决定了用户启动请求权限的应用程序时必须提供的批准类型。它由本地安全策略中的某个设置进行控制。
若要查看/设置系统的此策略
1. | 请单击开始按钮,单击运行,然后输入secpol.msc。 | ||||||||
2. | 导航到本地安全设置,单击本地策略,然后单击安全选项。 | ||||||||
3. | 选择 UAC:提升行为提示。
|
请注意,上述设置可通过组策略进行控制并进行集中管理。
应用程序能够获得的权限(以及应用程序是否能够运行)取决于 AppCompat 数据库中应用程序的“运行级别”和运行应用程序的帐户所拥有权限的组合。下表根据各种组合形式确定程序的行为。
内置的管理员 (Administrator) 不受 UAC 的保护,因此所有应用程序都使用该帐户的完全权限加载,并且不会提示用户对此进行批准。
| • | 父进程令牌: 完全管理员权限 |
| • | 允许策略:(无关) |
| 应用程序的 AppCompat 数据库标记 | ||
| 无或 RunAsUAC | RunAsHighest | RunAsAdmin |
使用完全 (Full) 权限启动程序,不进行提示 | 使用完全权限启动应用程序,不进行提示 | 使用完全权限启动应用程序,不进行提示。 |
| • | 父进程令牌: 标准用户 |
| • | 允许策略:自动 |
| 应用程序的 AppCompat 数据库标记 | ||
| 无或 RunAsUAC | RunAsHighest | RunAsAdmin |
使用标准用户 (Standard User) 权限启动程序 | 使用完全管理员权限启动程序,不进行提示 | 使用完全管理员权限启动程序,不进行提示 |
| • | 父进程令牌:标准用户 |
| • | 允许策略:同意 |
| 应用程序的 AppCompat 数据库标记 | ||
| 无或 RunAsUAC | RunAsHighest | RunAsAdmin |
使用标准用户权限启动程序 | 使用完全管理权限启动程序,提示同意 使用完全权限启动程序 | 管理员权限,提示同意 |
| • | 父进程令牌:标准用户 |
| • | 允许策略:凭证 |
| 应用程序的 AppCompat 数据库标记 | ||
| 无或 RunAsUAC | RunAsHighest | RunAsAdmin |
使用标准用户权限启动程序 | 使用完全管理权限启动程序,提示凭证 | 使用完全管理权限启动程序,提示凭证 |
| • | 父进程令牌:完全管理员权限 |
| • | 允许策略:(无关) |
| 应用程序的 AppCompat 数据库标记 | ||
| 无或 RunAsUAC | RunAsHighest | RunAsAdmin |
使用完全 (Full) 管理权限启动程序,不进行提示 | 使用完全管理权限启动应用程序,不进行提示 | 使用完全管理权限启动应用程序,不进行提示。 |
| • | 父进程令牌:受限用户 |
| • | 允许策略:自动 |
| 应用程序的 AppCompat 数据库标记 | ||
| 无或 RunAsUAC | RunAsHighest | RunAsAdmin |
以受限用户 (Limited User) 身份启动程序 | 以受限用户身份启动程序 | 应用程序启动失败 |
| • | 父进程令牌:受限用户 |
| • | 允许策略:同意 |
| 应用程序的 AppCompat 数据库标记 | ||
| 无或 RunAsUAC | RunAsHighest | RunAsAdmin |
以受限用户身份启动程序 | 以受限用户身份启动程序 | 在运行程序前提示输入管理员凭证 |
| • | 父进程令牌:受限用户 |
| • | 允许策略:凭证 |
| 应用程序的 AppCompat 数据库标记 | ||
| 无或 RunAsUAC | RunAsHighest | RunAsAdmin |
以受限用户身份启动程序 | 以受限用户身份启动程序 | 在运行程序前提示输入管理员凭证 |
| • | 父进程令牌:受限用户 |
| • | 允许策略:自动 |
| 应用程序的 AppCompat 数据库标记 | ||
| 无或 RunAsUAC | RunAsHighest | RunAsAdmin |
以受限用户身份启动程序 | 以完全权限启动程序,不进行提示 | 应用程序启动失败 |
| • | 父进程令牌:受限用户 |
| • | 允许策略:同意 |
| 应用程序的 AppCompat 数据库标记 | ||
| 无或 RunAsUAC | RunAsHighest | RunAsAdmin |
以受限用户身份启动程序 | 以完全权限启动程序,提示用户进行批准 | 在运行程序前提示输入管理员凭证 |
| • | 父进程令牌:受限用户 |
| • | 允许策略:凭证 |
| 应用程序的 AppCompat 数据库标记 | ||
| 无或 RunAsUAC | RunAsHighest | RunAsAdmin |
以受限用户身份启动程序 | 以完全权限启动程序,提示输入凭证 | 在运行程序前提示输入管理员凭证 |
| • | 父进程令牌:完全权限 |
| • | 允许策略:自动 |
| 应用程序的 AppCompat 数据库标记 | ||
| 无或 RunAsUAC | RunAsHighest | RunAsAdmin |
使用完全权限启动程序,不进行提示 | 使用完全权限启动程序,不进行提示 | 应用程序启动失败 |
| • | 父进程令牌:完全权限 |
| • | 允许策略:同意 |
| 应用程序的 AppCompat 数据库标记 | ||
| 无或 RunAsUAC | RunAsHighest | RunAsAdmin |
使用完全权限启动程序,不进行提示 | 使用完全权限启动程序,不进行提示 | 在运行程序前提示输入管理员凭证 |
| • | 父进程令牌:完全权限 |
| • | 允许策略:凭证 |
| 应用程序的 AppCompat 数据库标记 | ||
| 无或 RunAsUAC | RunAsHighest | RunAsAdmin |
使用完全权限启动程序,不进行提示 | 使用完全权限启动程序,不进行提示 | 在运行程序前提示输入管理员凭证 |
在 IT 部门找出了企业使用的所有业务管理员程序之后,他们可使用本文的以下部分作为指南,了解如何为这些应用程序创建并部署相应的应用程序兼容性补偿。
CompatAdmin.exe 是一个图形用户界面 (GUI) 工具,可帮助企业管理员为运行在新版本 Windows 上的旧有应用程序创建程序兼容性补偿。对于 Windows Vista,该工具包已经得到增强,能够创建补偿数据库条目,可使用这些条目标记应用程序的运行级别。在 IT 部门创建数据库后,他们可以使用名为 sdbinst.exe 的工具在系统中安装数据库。该工具也包括在应用程序工具包中。
每个被创建的数据库都包含一个或多个针对目标应用程序的运行级别标记补偿项。IT 部门可使用以下步骤确定如何标记管理程序。
1. | 在运行 Windows Vista 的相应计算机上安装应用程序兼容性工具包。 |
2. | 识别无法在 Windows Vista 上正常运行的所有旧有管理程序。IT 部门可使用其他应用程序兼容性工具包的功能来为识别过程提供帮助。 |
3. | 确定每个应用程序的运行级别。 |
4. | 运行 CompatAdmin.exe,创建 AppCompat 补偿数据库。 |
5. | 使用 sdbinst.exe 在测试计算机上安装数据库以对补偿进行测试。 |
例如:
1. | 启动 compatadmin.exe(图 1)。 |
2. | 单击“修复”(Fix) 图标。 |
3. | 输入程序的名称、厂商名称和程序位置(图 2)。单击下一步。 向导的第一个屏幕用于应用针对较早版本 Windows 的常规兼容性修补。选择运行级别应用程序兼容性补偿的过程发生在向导的后面部分。 |
4. | 对于操作系统模式,请选择无,然后单击下一步(图 3)。 |
5. | 滚动到“兼容性修补”(Compatibility Fixes) 并选择所需的运行级别。为了确定哪个运行级别适用于该应用程序,请参见运行级别标记。 单击下一步(图 4)。 |
6. | 选择匹配信息。匹配信息用于识别补偿所属的文件。在下例中,除了使用程序名称外,还使用文件大小和 PE 校验和来确定补偿是否适用于该程序。虽然也可以选择使用其他匹配信息,但通常选择大小和校验和已经足以确保补偿不会被误用给具有相同名称的其他应用程序。单击完成(图 5)。 |
7. | 单击文件,然后单击保存(图 6)。 |
8. | 输入数据库的名称。在使用 sdbinst.exe 安装了补偿之后,该名称将显示在控制面板的“添加/删除程序”(ARP) 之中。选择一个有助于在 ARP 中识别该补偿的描述性名称。单击确定(图 7)。 |
9. | 为数据库文件选择一个名称,然后单击保存(图 8)。 |
10. | 运行 sdbinst.exe,并将刚刚创建的数据库文件的名称作为参数传递给它(图 9)。如果使用 -q 限定符运行 sdbinst.exe,则不会显示一个输出对话框,在使用无人值守模式进行部署时可以它。 |
管理员可以通过控制面板上的“已安装程序”小程序删除先前安装的 AppCompat 数据库条目(图 10)。如果应用程序兼容性补偿所针对的应用程序不再在环境中使用,或者需要对补偿本身进行修改,那么这将十分有用。为了删除应用程序兼容性补偿,请在列表中右击所需条目,然后选择更改/删除。管理员可以通过重复此过程删除其他 AppCompat 数据库条目。
本节内容介绍如何使用组策略部署在运行 compatAdmin.exe 一节中创建的应用程序兼容性数据库补偿。以下是主要操作步骤:
| • | IT 部门创建一个自定义的安装程序 Microsoft Visual Basic 脚本 (VBScript)。如需查看脚本示例,请访问此处。 |
| • | IT 部门为他们创建的每个 .sdb 数据库创建一个 .msi 程序包。 |
| • | IT 部门使用 Authenticode 签署该 .msi 程序包。 |
| • | IT 部门通过组策略部署该 .msi。 |
在创建 .msi 之前,IT 部门需要创建一个执行自定义安装的 VBScript。此工作只需执行一次,因为可以为他们的所有的 .msi 程序包使用相同的脚本文件。以下是一个示例脚本。
'-------------------------------------------------------------------------------------- ' Filename
:setsdb.vbs ' Description :Installs SDB entry in appcompat database ' Version
:1.0 '--------------------------------------------------------------------------------
------ ' History:' 07-19-2005: Created version 1.0
dim Ws myCmdArgs = Session.Property("CustomActionData") setDir = "%ComSpec%
/C sdbinst.exe -q " & chr(34) & myCmdArgs & chr(34) set Ws = CreateObject
("WScript.Shell") retval = Ws.Run( setDir, 2, true )下例展示了如何创建 .msi 程序包,以便使用 Microsoft Visual Studio 7 部署 AppCompat 数据库补偿。
1. | 启动 Visual Studio。 | ||||
2. | 在菜单栏上,单击文件,然后单击新建项目。 | ||||
3. | 对于项目类型,请选择左侧窗格中的安装和部署项目。在右侧窗格中选择安装项目,输入部署补偿的名称,然后单击确定(图 11)。 | ||||
4. | 对于右侧窗格中的“解决方案资源管理器”,请右击您的部署项目的名称(在本例中为 DeployIsUserAdminShim),单击添加,然后单击文件。 | ||||
5. | 找到您创建的 .sdb 数据库,然后单击打开(图 12)。 | ||||
6. | 重复步骤 4 和 5,添加您先前创建的自定义操作 VBScript 的名称,在本例中为 setsdb.vbs。 | ||||
7. | 对于右侧窗格中的解决方案资源浏览器,请右击您的部署项目的名称,单击查看,然后单击自定义操作。“自定义操作”选项卡出现在左侧窗格中(图 13)。 | ||||
8. | 在自定义操作选项卡上,右击提交文件夹,然后单击添加自定义操作。 | ||||
9. | 双击应用程序文件夹,选择该 vbscript 文件,然后单击确定(图 14)。 | ||||
10. | 右击左侧窗格中称为 setsdb.vbs 的提交操作,然后单击属性窗口。 在 CustomActionData 属性中添加以下行。 注意
| ||||
11. | 在文件菜单上,单击生成,然后单击生成解决方案。在完成生成操作后,.msi 程序包将被存放在 debug 文件夹中。 | ||||
12. | 退出 Visual Studio。 |
在 IT 部门创建了 .msi 程序包后,微软建议在通过组策略部署它之前首先对其进行 Authenticode 签名。微软假定 IT 部门已经为他们的企业创建了一个签名密钥,并使用它签署他们的 .msi 部署程序包。以下例子中使用的签名和验证工具已包括在 Microsoft Visual Studio SDK 中。
signcode -v <path>yourkey.pvk -spc <path>yourkey.spc (deployment package).msi
若要在签名中包括一个时间戳,可在命令行中包括以下参数。
-t http://timestamp.verisign.com/scripts/timstamp.dll
IT 部门可以使用如下命令验证签名。
ckhtrust (deployment package).msi
如果文件有效并且签名证书链接到环境中的一个可信发行商证书,那么 chktrust.exe 将只会返回一个成功返回代码。
有关微软 Authenticode 技术的其他信息,请访问此处。
在 IT 部门生成程序包后,他们可以对它进行测试,测试方法是:将 .msi 文件复制到一台目标计算机上并双击它,以打开 Microsoft Windows 安装向导(图 16)。
1. | 单击下一步。 |
2. | 单击下一步。 |
3. | 单击下一步。 |
4. | 单击关闭。 |
通过使用组策略,IT 部门可确保他们创建的所有 AppCompat 数据库补偿都能够自动部署到所有客户端计算机上。本节内容包含了 IT 部门设置此部署所需的基本步骤。有关临时部署组策略的更多信息,请访问此处。
第一个步骤是将 .msi 部署程序包放在一个文件共享上,要接收该补偿的所有计算机都应能访问该共享。这可以是整个域,也可以限制为某些组织单位 (OU)。微软建议 IT 部门确保 .msi 程序包在文件共享上有正确的访问控制列表 (ACL) 条目,只允许访问相应的计算机。
在本例中,DeployIsUserAdmin.msi 文件将存储在名为 \\jettdualproc\Applications 的域服务器上的文件共享中。文件上的 ACL 看上去如图 21 所示。
1. | 在 .msi 文件就位之后,以域管理员身份登录到域控制器,单击开始按钮,指向程序,指向管理工具,然后单击 Active Directory 用户和计算机。 |
2. | 右击左侧窗格中的域名,然后单击属性。在“属性”窗口出现时,单击组策略选项卡(图 22)。 |
3. | 单击“新建”,然后输入新组策略对象 (GPO) 的名称。在本例中,GPO 的名称为 Deploy IsUserAdmin Shim(图 23)。 |
4. | 突出显示新创建的 GPO 并单击属性。 |
5. | 由于补偿将应用于域中的“计算机”,而不是“用户”,请选择禁用用户配置设置复选框(图 24)。如果确认对话框出现,请单击是。 |
6. | 单击安全性选项卡,然后添加任何必要的 ACL,以允许域中的计算机访问它。确保选中了读取并应用组策略。完成后,请单击确定。 |
7. | 在属性窗口中(应该仍然处于打开状态),单击编辑。 |
8. | 在左侧窗格的计算机配置中,展开软件设置。 |
9. | 右击软件安装,单击新建,然后单击程序包。 |
10. | 在打开对话框中选择要部署的程序包,然后单击打开(图 25)。 |
11. | “部署软件”对话框出现。选择已分配,然后单击确定。 所选的 .msi 程序包将显示在组策略对象编辑器中(图 27)。 |
12. | 关闭组策略对象编辑器。 |
13. | 关闭属性窗口。 |
14. | 退出 Active Directory 用户和计算机应用程序。 |
为了对部署进行测试,IT 部门应重新启动作为域成员的某台计算机。在重启之后和显示用户登录屏幕之前,组策略应该自动将该程序包安装到计算机上。
为了验证这一点,请登录到计算机并打开控制面板中的已安装程序。如果安装成功完成,用户应该看到安装的 .msi以及实际的应用程序兼容性数据库条目(图 28)。