Windows Vista Developer Story:应用程序兼容性集锦
Microsoft Corporation
Windows Vista Developer Story 的内容面向开发人员,以及对深入探讨 Windows Vista 中某些新功能和扩展功能感兴趣的其他技术专家和管理人员。它将以文章的形式在 Windows Vista Developer Center 上发布,大约每两周发布一次。这些文章只是 Windows 帮助文件的摘要,可从此处下载。
注意 本主题为预发布文档,在将来发布的版本中可能会有所更改。
注意 要提供关于文章的反馈,请将电子邮件发送到 Vistadev@microsoft.com。
本页内容
引言
三十分钟兼容性检查
操作系统版本检测
用户帐户控制
用户帐户控制 - 应用程序更新指导原则
Windows 资源保护 (WRP)
Internet Explorer 保护模式
64 位 Windows Vista
Microsoft 图形识别和验证 (GINA)
会话 0 隔离
网络:TCP/IP 堆栈和 Windows 筛选平台
网络:内核模式 IP 助手 API
网络:IPv6
兼容性风险
帮助和支持中心
帮助平台客户端
默认程序
Windows Vista 中的程序兼容性助手 (PCA) - 客户准备文档
图形设备接口 (GDI)
绘制 (WM_PAINT) 行为差异
渲染性能
UIPI(用户帐户控制的 GUI 部分)
高 dpi 缩放
PNG 图标
命名管道的强化
SPAP 反对 (Pstore)
WMI 提供程序:默认的安全托管模型
卷影复制服务
标准用户分析器
帮助引擎支持
另请参阅
引言
Microsoft Windows Vista 引入了将由全球应用程序开发人员及企业使用的下一代操作系统技术和软件开发平台。作为增强 Windows Vista 安全性和用户体验的部分措施,引入了许多新功能并对现有功能进行了改进。
尽管 Windows Vista 同大多数针对 Microsoft Windows XP、Microsoft Windows Server 2003 及其服务包而编写的应用程序有极好的兼容性,但是由于技术创新、安全控制加强和可靠性增强等原因,还是不可避免地存在某些不兼容问题。总体而言,Windows Vista 兼容性很高,而且 Microsoft 在不断努力为 Windows Vista 的现有应用程序寻求最佳兼容性解决方案。
本文可为要了解如何验证应用程序兼容性的应用程序开发人员奠定初步的基础。本文也概述了在 Windows Vista 中为数不多的已知应用程序不兼容问题,并提供了到详述的白皮书和其他开发人员指南的链接。
有几项新功能可帮助开发人员解决 Windows Vista 下不能正常运行的应用程序,例如:
“兼容性”选项卡。
用户可右键单击快捷方式或 EXE 然后应用 Windows XP SP2 兼容性模式,这样应用程序就如同在 Windows XP 上工作一样。此外,如果应用程序需要管理员权限并且用户拥有这些权限,则用户可选择“以管理员身份运行该程序”。有关详细信息,请参阅本文的“用户帐户控制”部分。
三十分钟兼容性检查
本部分提供了关于如何在 Windows Vista 上测试和评估应用程序兼容性的指导。主要有两个方案可测试 Windows Vista 上的兼容性,如下所述。
利用 Windows Vista 的全新安装
在测试计算机上安装 Windows Vista。
在 Windows Vista 上安装应用程序。如果出现提示,要求安装该应用程序的权限,则单击“允许”并继续安装。如果安装成功,请转至步骤 6。
如果应用程序安装失败,且未出现安装权限提示,则右键单击 EXE 安装程序然后选择“以管理员身份运行该程序”,重新安装应用程序。如果安装成功,请转至步骤 6。
注意 如果使用 MSI 进行安装则无需执行该步骤。
如果收到 OS 版本、CLSID 注册或文件复制之类的错误,则右键单击 EXE 安装程序文件,选择“兼容性”选项卡,然后选择 Windows XP SP2 兼容性模式。
回到步骤 2。如果无法安装应用程序,则转至步骤 9。
现在应用程序应该已完成安装。
启动应用程序。如果应用程序未正常启动或显示有错误,则为应用程序 EXE 应用 Windows XP SP2 兼容性模式并再试一次。
如果应用程序成功启动,则遍历通常用于测试 Windows XP 上的应用程序的整套测试。验证应用程序的功能并确认应用程序运行正常。如果所有主要功能均通过测试,则转至步骤 10。
如果应用程序安装和启动不成功、崩溃、出现错误或未通过主要功能测试,则可能是一小部分应用程序受到 Windows Vista 变更的影响。请参考本文中的主题检查您的应用程序。
该方案完成。
利用 Windows XP Service Pack 2 升级
在测试计算机上安装 Windows XP SP2 然后再安装应用程序。在进行下一步之前先验证应用程序的所有功能。
将测试计算机升级至 Windows Vista。按 Windows Vista 安装和升级说明进行操作。升级完成后,像在 Windows XP 上一样登录。
启动应用程序。如果应用程序未正常启动或显示有错误,则为应用程序 EXE 应用 Windows XP SP2 兼容性模式并再试一次。
如果应用程序成功启动,则遍历通常用于测试 Windows XP 上的应用程序的整套测试。验证应用程序的功能并确认应用程序运行正常。如果所有主要功能均通过测试,则转至步骤 6。
如果应用程序安装和启动不成功、崩溃、出现错误或未通过主要功能测试,则可能是一小部分应用程序受到 Windows Vista 变更的影响。请参考本文中的主题检查您的应用程序。
该方案完成。
如果两个方案均已完成且应用程序执行正常,则应用程序在 Windows Vista 下运行正常。有关获取应用程序证书的信息,请参阅 Windows Vista 主页。
链接
操作系统版本检测
功能影响力
高
简要说明
Windows Vista 的内部版本号是 6。现在在查询时 GetVersion 函数会将此版本号返回给应用程序。
注意 这是继 Windows XP(5.x 版本)后又一主要版本号。
表现
如下所述,此版本变更的表现极具应用程序特定性:
任何专门检查 OS 版本的应用程序都将获得更高的版本号。
应用程序安装程序可能会阻止其自身安装应用程序,而应用程序可能会阻止其自身启动。
应用程序可能会警告用户并继续正常运行。
有些应用程序可能会变得不稳定或崩溃。
缓解
大多数应用程序会在 Windows Vista 上正常运行,因为 Windows Vista 的应用程序兼容性非常高。但是,对于检查 OS 版本的应用程序和安装程序,在 Windows Vista 中提供了“兼容性”模式。
用户可以右键单击快捷方式或 EXE,然后应用“兼容性”选项卡中的 Windows XP SP2 兼容性模式。大多数情况下,这样做应该可以使应用程序如同在 Windows XP 上一样工作,而无需对应用程序做任何更改。
补救措施
通常情况下,应用程序并不需要执行 OS 版本检查,或者至少始终接受 OS 的版本 6 或更高版本。除非特定的法律、商业或系统组件要求进行版本检查,否则均应执行上述行为。
应用程序的安装程序不应使用 16 位安装程序,以确保 64 位系统兼容性。
确保应用程序使用的任何驱动程序都尽可能为用户模式驱动程序,以维护多平台(32 位和 64 位)的兼容性。
用户帐户控制
功能影响力
高
简要说明
提高 Windows 安全性的一个基本步骤就是让交互用户使用标准用户帐户运行,从而使他们只能使用有限的一组权限。默认情况下,即使以管理员组成员身份登录,Windows Vista 也会以标准用户来运行每个应用程序。相反,如果用户试图启动那些已标记需要管理员权限的应用程序,系统将会明确要求他们确认使用意图。只有以管理员权限运行的应用程序才可以修改系统、全局设置和行为。Windows Vista 的这一功能就是用户帐户控制 (UAC)。
表现
无法检测到和提升自定义安装程序、卸载程序和更新程序从而以管理员身份运行。
执行任务时需要管理权限的标准用户应用程序失败,或者未将该任务提供给标准用户。
尝试执行当前用户不具有必需权限的任务的应用程序可能会失败。失败的表现形式取决于应用程序的编写方式。
执行管理任务和进行全局更改的控制面板应用程序可能运行不正常和失败。
运行时使用 RunDLL32.EXE 的 DLL 应用程序在执行全局操作时可能运行不正常。
写入全局位置的标准用户应用程序将通过虚拟化被重定向到每个用户的位置。
补救措施
用于自定义安装程序的快速解决方案:
用户可通过右键单击并选取“以管理员身份运行该程序”来启动安装程序或更新程序。
可通过应用一个应用程序兼容性修复程序来指示特定安装程序需要提升。为此,右键单击快捷方式或 EXE,然后从“兼容性”选项卡应用 Windows XP SP2 兼容性模式。
需要管理权限来执行系统修改或写入权限区域的应用程序的快速解决方案:
公司用户能够应用应用程序兼容性修复程序来指示传统应用程序正确运行需要的管理员权限或特权。
减少某个受限文件上访问控制列表 (ACL) 的限制可能会有助于试图写入这些文件的应用程序。
检查虚拟化文件夹或注册表项来查看应用程序是否正访问需要管理员特权的内容。该信息可用于将访问受管理员保护位置的要求从应用程序的未来版本中删除。有关虚拟化文件、文件夹和位置的详细信息,请参阅“链接”部分。
在独立的 EXE 中封装“运行 DLL 作为应用程序”DLL 调用并且为此 EXE 加入一份清单以使其要求提高的权限。
兼容性测试:
任何安装、卸载或更新情况都应提示用户许可或出示凭据。一旦获得用户批准,操作即会成功。
以内置管理员身份尝试重现失败的情况。如果该方案通过,故障可能是由于缺乏权限造成的。
使用 Application Compatibility Toolkit 的 Compatibility Administrator“用户帐户控制”预测器工具来识别正在执行管理员操作的应用程序的那些区域。
利用 Windows Vista 功能解决方案:
基于 Windows Vista 的应用程序需要:
遵循 Windows Vista LOGO 程序中的指导原则和用户体验 (UX) 指导原则文档(请参阅“链接”部分)。
使用内嵌的清单来表示特定的 requestedExecutionLevel(以前称为 RunLevel)。
将所有管理和非管理功能分离到单独的 EXE 中。所有需要更高权限的功能都应位于独立的用清单表示执行级的可执行的 EXE 中或使用管理权限运行的 COM 对象中。仅在需要时启动管理任务。这适用于所有应用程序。
对于那些本来就不需要特殊管理的应用程序,要修改代码来消除对管理员权限或特权的需要。
对于仅由管理员使用的应用程序,将该应用程序作标记以便能够使用管理员权限或特权运行它。
当更新应用程序时,应使用独立的更新程序 EXE 来更新目标应用程序。
控制面板应用程序必须从 .cpl 文件移到 .exe 文件,然后为基于 EXE 的控制面板应用程序加入一份清单,该清单指定所需的执行级。
在需要提升的 RunDLL32.EXE 下运行的 DLL 应修改为一个可执行并具有在清单内显示的执行级的 EXE。
如果可能,总是用只读访问权限打开文件和注册表项。仅在需要时使用读写访问权限,或在相应操作完成后就将权限恢复为只读。
链接
用户帐户控制 - 应用程序更新指导原则
功能影响
媒体
简要说明
许多现有的应用程序有将更新功能集成到它们的应用程序中的倾向。嵌入更新功能的目的是为了确保客户端运行 ISV 可以提供的最新二进制。
现已发现,许多应用程序在执行更新功能时,需要比“标准”用户更多的权限。通常,需要运行在安装时安装的基于计算机的文件。按照运行和安装应用程序的 UAC 模式,只有 Admin 批准模式 Admin 中提升的管理员才有足够的权限执行这些操作。
Windows Vista Installer Detection 试探法能够正确地检测出许多应用程序的更新程序,并且适当地提升更新程序,从而成功地完成提升。然而,仍然有一些无法成功更新应用程序的领域。例如:
未经过安装检测的进程外更新程序 — 未通过安装检测试探法检测的更新程序。
多用途可执行程序/进程内更新 — 需执行多次操作的重载可执行程序。例如,二进制既是主要应用程序又是更新应用程序,或者多用途可执行程序在应用程序内作为线程运行。
表现
应用程序更新功能失败
补救措施
未经过安装检测的进程外更新程序
这是一个任何企业都可能出现的问题,并且可能导致企业需要使用“管理员”权限来运行应用程序的结果。如果应用程序使用未经过安装程序检测的单个进程更新自己,那么该单个进程将用 App Fix 标记为需要“管理员”权限。
以用户身份无效的更新程序将禁止企业使用最低权限运行。
更新程序应使用要求的“管理员”运行级别被写为单独的进程。
- 仅在有必要用于更新用途时,该进程才执行。检测要更新的程序,以确定其是否应作为用户处理。
多用途可执行程序/进程内更新
在 Vista 上,没有好方法来创建执行更新的多用途可执行程序,因为您无法切换执行程序的运行状态。因而,执行程序将不得不一直作为“管理员”来运行。这时,应用程序应遵循以下其中一种方法来执行更新。
利用 MSI 中的“修补”技术(Windows Installer、InsallShield、Wise 等的最新版本支持该功能)。
MSI 是一项主要的安装程序技术,因为它为用户提供管理更新的功能。
使用 MSI 来创建初始安装程序并在 MsiPatchCertificate 表内嵌入证书。
为应用程序创建更新并用先前指定的证书签署它。
在应用修补程序时,MSI 将为应用程序执行提升。
注意 这种方法胜过其他方法的主要优势在于,它使用“标准用户”工作,并可保证游戏的安全性。它提供了更好的用户体验,因为“标准用户”帐户不必向“管理员”申请就可安装修补程序或要求永久“管理员”权限来玩游戏。
使用其他自定义安装程序机制。
不鼓励在企业环境下使用它,因为这将禁止用户作为“非管理员”运行。
更新程序应使用要求的“管理员”运行级别被写为单独的进程。
注意 仅在有必要用于更新用途时,该进程才执行。检测要更新的程序,以确定其是否应作为用户处理。
作为“标准用户”应用程序运行时进行更新。
- 当使用 ClickOnce 技术时,可作为“标准用户”进行更新。这也是一个安装平台,可允许用户在其中部署应用程序并为应用程序编写器处理更新。
链接
https://msdn.microsoft.com/msdnmag/issues/04/05/ClickOnce/
Windows 资源保护 (WRP)
功能影响
高(阻止安装或运行应用程序)
简要说明
作为增加系统稳定性、预测性和可靠性的方案,Windows 资源保护 (WRP) 专用于保护处于只读状态下的 Windows 系统。这将影响特定的文件、文件夹和注册表项。受保护资源的更新将被限制在 OS 所信任的安装程序(例如 Windows Servicin)。这能够使 OS 随附的组件和应用程序受到更好的保护,使其免受其他应用程序和管理员的影响。
表现
应用程序和管理员将无法成功替换或修改受保护的 OS 资源,随之会带来以下结果:
应用程序安装程序尝试替换、修改或者删除受 WRP 保护的 OS 文件和/或注册表项时可能会失败,并得到一条错误消息表明无法更新资源。这是因为对这些资源的访问被拒绝。
应用程序尝试将新的注册表项或值写入受保护的注册表项时可能会失败,并得到一条错误消息表明由于访问被拒绝而导致更改失败。
应用程序如果依赖一些注册表项或值,则其尝试写入受保护资源时可能会失败。
受保护的系统区域示例:
WRP 会保护大部分基于 Windows 的可执行文件。默认情况下,下列扩展名代表 WRP 保护的文件:
.acm、.ade、.adp、.app、.asa、.asp、.aspx、.ax
.bas、.bat、.bin
.cer、.chm、.clb、.cmd、.cnt、.cnv、.com、.cpl、.cpx、.crt、.csh
.dll、.drv、.dtd
.exe、.fxp、.grp
.h1s、.hlp、.hta
.ime、.inf、.ins、.isp、.its
.js、.jse、.ksh、.lnk
.mad、.maf、.mag、.mam、.man、.maq、.mar、.mas、.mat、.mau、.mav、.maw、.mda、.mdb、.mde、.mdt、.mdw、.mdz、.msc、.msi、.msp、.mst、.mui
.nls、.ocx、.ops
.pal、.pcd、.pif、.prf、.prg、.pst
.reg、.scf、.scr、.sct、.shb、.shs、.sys
.tlb、.tsp、.url
.vb、.vbe、.vbs、.vsmacros、.vss、.vst、.vsw
.ws、.wsc、.wsf、.wsh
.xsd、.xsl
默认情况下,受保护的注册表项包括大部分 COM OS 注册表项,例如:
HKEY_CLASSES_ROOT\Interface\{GUID}
HKEY_CLASSES_ROOT\Interface\{GUID}\NumMethods
HKEY_CLASSES_ROOT\Interface\{GUID}\ProxyStubClsid
HKEY_CLASSES_ROOT\Interface\{GUID}\ProxyStubClsid32
有极少一部分文件夹受 WRP 的保护。这些是 OS 资源专用的文件夹(例如一些 inetpub 文件夹),如:
$(runtime.bootDrive)\inetpub\uddi\webroot\details\
runtime.bootDrive)\inetpub\uddi\webroot\edit\
(runtime.bootDrive)\inetpub\uddi\webroot\controls\
$(runtime.bootDrive)\inetpub\uddi\bootstrap\
缓解
重要信息 如果应用程序被识别为是基于 Windows Vista 的应用程序,则不会应用下列缓解。
对于众所周知的安装程序,在以下条件下将不会显示“拒绝访问”错误:
当应用程序安装程序被检测为传统安装程序(即,该安装程序不具有清单)时。
由于应用程序尝试创建或修改 WRP 资源而出现“拒绝访问”错误时。
某些情况下,在尝试删除受 WRP 保护的资源时会自动提供缓解。
如果应用程序尝试在 WRP COM 注册表项下创建新的子项或值,则可能会收到“拒绝访问”错误。
注意 在这种情况下,尽管未将更改应用于 WRP 资源,还是会返回成功提示。
补救措施
除非使用 Microsoft 提供适用于 Windows Vista 的可再分发软件包,否则不要在 Windows Vista 上安装或者更新系统组件。
不要安装 Microsoft 提供适用于 Windows Vista 的、完整的可再分发软件包的单个组件。
使用 SfcIsFileProtected 检测 WRP 保护的文件。如果某个文件在 WRP 下,则应用程序不应安装或修改该文件。
对于受 WRP 保护的注册表项,应用程序应完好地处理由于 WRP 引起的“拒绝访问”消息。
通过安装相应的应用程序,测试和验证依赖 WRP 缓解的传统应用程序工作正常。
链接
Internet Explorer 保护模式
功能影响力
高
简要说明
在 Windows Vista 中,Microsoft Internet Explorer 7 以“保护模式”运行,该模式通过以限制严格的权限运行 Internet Explorer 进程,保护用户免受攻击。“保护模式”显著降低了写入、更改或破坏用户计算机上数据或者安装恶意代码的攻击能力。它有助于保护用户,避免恶意代码未经授权便自行安装。此模式是安装 Windows Vista 时用于 Internet Explorer 的默认模式。
表现
在 Internet 或 Intranet 区域中时,使用 Internet Explorer 7 的应用程序将不能直接写入磁盘。
应用程序可能不知道如何处理新的提示。
“保护模式”建立于新的完整性机制之上,以将写访问限制在可保安全的对象(如,具有更高完整性级别的进程、文件和注册表项)。当以“保护模式”运行时,Internet Explorer 是一个低完整性进程;因此它无法获得对用户配置文件或者系统位置中文件和注册表项的写入访问权限。
完整性低的进程只能对那些已分配了低完整性强制标签的文件夹、文件和注册表项执行写入操作。结果,Internet Explorer 及其扩展在“保护模式”中运行,从而只能对低完整性位置(如新的低完整性“临时 Internet 文件”文件夹、“历史记录”文件夹、Cookies 文件夹、“收藏夹”文件夹以及“Windows 临时文件”文件夹)进行写入操作。
而且,在 Windows Vista 交付时,“保护模式”进程将以低桌面完整性级别运行,这样可防止其将特定的窗口消息发送给完整性更高的进程。
通过防止对用户系统敏感区域进行未授权的访问,“保护模式”可限制由受损 Internet Explorer 进程或恶意软件造成的损失程度。例如,攻击者无法悄无声息地将击键记录程序安装到用户的 Startup 文件夹。同样,受损的进程不能通过窗口消息操作桌面上的应用程序。
当然,这些防范措施同时也限制了对更高完整性位置 (IL) 的合法更改。因此,“保护模式”提供了可减少对现有扩展影响力的兼容性体系结构,如下图所示。
图 1
兼容性层处理许多现有扩展的需要。它截取了对中等完整性资源(如用户配置文件中的“我的文档”文件夹和 HKEY_CURRENT_USER 注册表配置单元)的写入尝试。兼容性层使用普通的 Windows 兼容性修复程序将这些操作自动重新定向到下列低完整性位置:
%userprofile%\LocalSettings\Temporary Internet Files\Virtualized
HKEY_CURRENT_USER\Software\Microsoft\InternetExplorer\InternetRegistry
两个更高权限的代理程序进程允许 Internet Explorer 和扩展执行经用户许可的提升操作。例如,用户权限代理程序 (IEUser.exe) 进程提供一组允许用户将文件保存到低完整性区域之外区域的功能。另外,管理员权限代理程序 (IEInstal.exe) 进程支持 Internet Explorer 安装 ActiveX 控件。
补救措施
快速解决方案:
将相关站点添加到受信站点列表中。
关闭“保护模式”(不建议使用)。
兼容性测试:
- 应用快速解决方案并确保应用程序能够如同在 Windows XP SP2 中那样执行这些从属功能。
利用 Windows Vista 功能解决方案:
- 更改应用程序以处理保护模式,包括任何可能显示的相关提示。
链接
Understanding and Working in Protected Mode Internet Explorer(英文)
Information Index for Internet Explorer 7 Beta 2 Preview(英文)
64 位 Windows Vista
功能影响力
高
简要说明
Windows Vista 完全支持 AMD 和 Intel 的 64 位体系结构处理器。64 位版本的 Windows Vista 能够借助 WOW64 仿真器运行所有 32 位的应用程序。然而,内核不支持 16 位应用程序、16 位安装程序和 32 位内核模式驱动程序。
所有 64 位驱动程序必须经过数字签名才可用于 Windows Vista 64 位版本。未签名的驱动程序不受支持,而且也无法在 64 位 Windows Vista 上安装。在安装期间和驱动程序加载期间均会执行数字签名检查。
表现
在 64 位版本的 Windows Vista 上,使用 16 位可执行文件、16 位安装程序或 32 位内核驱动程序的应用程序和组件将无法启动或不能正常运行。出现这种情况时,将显示下列错误消息:
该程序或功能“[exepath]\[app16bit].exe”无法启动或运行,因为其与 64 位版本的 Windows 不兼容。请与软件供应商联系,询问其是否有 64 位 Windows 兼容版本。
启动 16 位安装程序或应用程序时,会显示下列错误消息:
此文件的版本与您当前运行的 Windows 版本不兼容。请检查计算机的系统信息,查看您是需要 x86(32 位)还是 x64(64 位)程序版本,然后联系软件发布者。
32 位内核驱动程序将无法安装到 64 位系统上。如果安装者通过编辑注册表手动添加驱动程序,系统将不能加载此应用程序,而且此操作会导致系统失败。
64 位未签名的驱动程序将无法安装到 64 位系统上。如果安装者通过编辑注册表手动添加驱动程序,系统将不会在加载期间加载未签名的驱动程序。
补救措施
利用 Windows Vista 功能解决方案:
应将所有 16 位组件从应用程序中删除并用 32 位或 64 位的同等组件代替。
应将所有 16 位安装程序转换为 32 位或 64 位安装程序。
如果应用程序使用内核模式驱动程序,那么,需要编写 64 位版本的驱动程序。应用程序应该检测 OS(32 位或 64 位)的平台,然后基于 OS 平台安装合适的驱动程序体系结构。
确保所有 64 位的驱动程序有数字签名。
兼容性测试:
- 在 32位和 64 位 Windows Vista 计算机上安装并启动应用程序。应用程序应该在这两种体系结构上正常运行。
链接
Microsoft 图形识别和验证 (GINA)
功能影响力
高(频率:低)
简要说明
在 Windows Vista 之前,要登录到第三方服务器或使用第三方设备,ISV 必须替换 Windows XP 中的图形识别和验证 (GINA) 动态链接库。这种应用程序还必须替换现有的 UI 并实现 Windows XP 上的智能卡和远程桌面功能。
注意 如果应用程序不是以这种方式在 Windows XP 中运行,则此信息不适用。
Windows Vista 引入了一种新的身份验证模式,使得 LogonUI 和 WinLogon 相互间能够直接通信。该模式提供了 GINA 所不具备的简单性、可伸缩性和灵活性。不同于 GINA 模式的是,ISV 不再需要替换登录屏幕的 UI,这样就缓解了其需要为用户重新编写用户界面的负担。ISV 能够编写凭据提供程序,后者是一个插入到 LogonUI 中的模块,用来描述 UI 和收集凭据并将其传递给 WinLogon。凭据提供程序对于 WinLogon 完全透明。
凭据提供程序也是附加的,也就是说,用户可安装多个凭据提供程序,然后从中选择想要使用的那一个。凭据提供程序可由用户进行选择和/或由事件来驱动。多个凭据提供程序可同时存在于 Windows Vista 上,而且不局限于第三方。事实上,Windows 将附带两个现成的凭据提供程序:用户名和密码凭据提供程序和智能卡凭据提供程序。
另外,凭据提供程序可在 CredUI 中重复使用。也就是说,在 LogonUI 上用于描述和收集凭据信息的同一对象可用于在 CredUI 方案中收集完全相同的凭据。
Windows XP 和 Windows Server 2003 上的 GINA 功能不受 Windows Vista 支持,并已从中删除。应用程序的 GINA 模块将不能起作用,而必须使用 Windows Vista 的新身份验证模式重新进行编写。
表现
用户将不能成功安装自定义登录应用程序。
用户将不能在 Windows Vista 中使用自定义登录应用程序(使用 Windows XP 技术)登录。这些可能包括:
生物尺度设备。
用于登录的自定义 UI。
远程用户使用自定义登录 UI 登录的虚拟专用网络 (VPN) 解决方案。
补救措施
利用 Windows Vista 功能解决方案:
- 需要重新编写使用 GINA 技术的应用程序或组件,以使用 Windows Vista 的新的登录身份验证模型。
链接
- 有关所有凭据提供程序信息和问题,请将电子邮件发送到 Shell Credential Provider 别名:credprov@microsoft.com
会话 0 隔离
功能影响力
高(频率:低)
简要说明
在 Windows XP、Windows Server 2003 和更早期的 Windows 操作系统版本中,所有服务都在与第一个登录到控制台的用户相同的会话中运行。此会话称为“会话 0”。在“会话 0”中一起运行服务和用户应用程序会产生安全风险,因为这些服务以提升的权限运行,因此会成为那些正在伺机提升自身权限级别的恶意代理的目标。
通过隔离“会话 0”中的服务并使“会话 0”成为非交互式,Microsoft Windows Vista 操作系统降低了这种安全风险。在 Windows Vista 中,仅系统进程和服务在“会话 0”中运行。首位用户将登录到“会话 1”,随后的用户将登录到随后的会话。这意味着服务将永远不会在与用户应用程序相同的会话中运行,因此可防止源于应用程序代码的攻击。
受影响驱动程序类的具体示例包括:
打印机驱动程序,它由假脱机服务加载。
使用用户模式驱动程序框架 (UMDF) 编写的所有驱动程序,因为这些驱动程序由“会话 0”中的进程托管。
受此功能影响的应用程序类:
创建 UI 的服务。
试图使用窗口消息函数(例如 SendMessage 和 PostMessage)与应用程序通信的服务。
创建全局命名对象的应用程序。
表现
如果属于应用程序的某个服务抛出一个 UI,则该应用程序将等待该服务,且在用户会话中不会显示此 UI。
补救措施
快速解决方案:
如果应用程序的服务使用一个 UI,Windows Vista 中的一个内置缓解将允许用户在某个特定桌面中与“会话 0”UI 进行交互。这将使得特定于该应用程序的 UI 可用,而不是整个“会话 0”桌面。
如果应用程序创建全局命名对象,则请使用 Windows XP 兼容性模式,以确保应用程序继续使用“会话 0”服务。
兼容性测试:
在“终端服务器”模式或快速用户切换 (FUS) 模式下,在 Windows XP 上测试并验证应用程序。如果在这些情况下该应用程序在 Windows XP 上运行正常,则其很可能能够在 Windows Vista 下运行。
确定在应用 Windows XP 兼容性模式(其包含对某些“会话 0”问题的缓解)后,应用程序运行正常。
在 Windows Vista 中测试驱动程序,确保其运行正常。如果运行不正常,则在启用 FUS 并有多个用户登录的情况下在 Windows XP 中测试该驱动程序。如果对于第二个及随后登录的用户而言,该驱动程序都运行正常,则可能不是受 Windows Vista 中“会话 0”更改的影响。此测试未检测的唯一一类问题是,那些有关在 Windows Vista 的“会话 0”中缺少视频驱动程序的问题。
利用 Windows Vista 功能解决方案:
使用客户端或服务器机制,例如远程过程调用 (RPC) 或命名管道,在服务和应用程序之间通信。
使用 WTSSendMessage 函数在用户桌面上创建一个简单的消息框。这允许服务为用户提供通知并请求简单响应。
对于更复杂的 UI,请使用 CreateProcessAsUser 函数在用户会话中创建一个进程。
对于服务提供的任何可用命名对象(例如事件或映射内存),请明确选择 Local\ 或 Global\。
链接
网络:TCP/IP 堆栈和 Windows 筛选平台
功能影响力
高
简要说明
我们已完全重新编写了 Windows Vista 网络堆栈。Windows Vista 实施了一个新的体系结构以代替 Windows XP 或 Windows Server 2003 中的双重堆栈模型(为支持 IPv4 和 IPv6),借此拥有了支持多个 IP 层的一个传输和分帧层。它有几个新功能和协议增强功能。新堆栈完全模块化、灵活且可扩展。尽管以往所有的尝试都是为了保持与在各层与堆栈对接的现有应用程序的应用程序兼容性,然而,仍有一些更改(主要是指改进的副作用)可能具有潜在的应用程序兼容性问题,因此应用程序开发者必须仔细评估这些更改以了解其对其应用程序的影响。
Microsoft Windows 筛选平台 (WFP) API 允许开发者创建与筛选交互的代码,该筛选发生在 Windows Vista 和代号为“Longhorn”的 Microsoft Windows Server 操作系统网络堆栈和整个操作系统的多个层中。WFP 基于应用程序的套接字 API 使用,还集成有并支持防火墙功能,例如经验证的通信以及动态防火墙配置。
注意 WFP 本身不是防火墙。它是一组使防火墙得以实现的系统服务和 API。
在 Windows Vista 上不支持 TCP/IP 堆栈的下列元素:
防火墙钩驱动程序功能和过滤器钩驱动程序功能不受支持。
R 系列工具,包括 rexec、rsh、finger 等。如果需要,可从 Services For Unix 组件中获得这些工具。
网间分组交换 (IPX) 协议。IPX 不受支持,而且实际上很少使用。由于此更改产生的对应用程序兼容性的影响应该没有或是极小。
表现
如果构建用于 Windows XP 的应用程序仅使用公用的网络功能,则其在功能方面不应有任何削弱。应在 Windows Vista 上对其进行测试,以验证其功能。
使用任何防火墙钩驱动程序或过滤器钩驱动程序功能的应用程序将不能运行。
依赖于 Microsoft 从未发布的内部结构和函数调用的应用程序将失败。
在内核模式下编写的传输驱动程序接口 (TDI) 过滤器驱动程序可能在 OS 升级后不能正常运行。
注意 在将来的版本中会朝不支持 TDI 接口的方向发展。然而,这些驱动程序在 Windows Vista 上仍可运行。
补救措施
利用 Windows Vista 功能解决方案:
WFP 为网络安全开发者提供了一组丰富的功能和服务,并提供了有关这些可用功能集的指南和文档。
注意 现在,依赖 Services for Unix 和 R 系列的应用程序和脚本必须首先安装这些工具。
链接
网络:内核模式 IP 助手 API
功能影响力
高
简要说明
在 Windows 的早期版本中,Winsock 客户端不具有访问内核的 API 集。这一点在 Windows Vista 中将有变化。此外,在默认情况下,Windows Vista 现在还支持 IPv6。现在不是为 IPv4 和 IPv6 提供独立的 API,而是设计了一个新助手 API 以提供涉及所有新技术的常用功能,如下所述:
在内核 (WSK) 客户端中用于 Windows Sockets 的内核模式功能。
IPv6 支持。
用于 IPv4 和 IPv6 寻址的单个功能集。
提供一致的、可扩展的对象模型。
提供基于网络服务接口的定义明确的安全模型。
公开新堆栈功能,例如隔间和子接口。
表现
使用较旧的助手 API 或未正式发布的内核函数调用的应用程序将不能运行,且可能不稳定。
补救措施
- 应用程序需支持和实现新内核模式 IP 助手 API。
链接
- 此时还没有链接。
网络:IPv6
功能影响力
高(频率:中)
简要说明
默认情况下,Windows Vista 中的 TCP/IP 堆栈会启用 IPv6。如果可用,将首选 IPv6 连接。对于挂接到 TCP/IP 堆栈的应用程序,有如下含义:
无论网络是否支持 IPv6,Windows Vista 堆栈都将发送 IPv6 通信。因此,默认情况下将生成路由器请求和邻居发现消息。
默认情况下,将显示 IPv6 地址。可能会有多个 IPv6 地址与本地链接、全局链接、临时链接或转换技术(如 6to4、6over4、ISATAP 或 Teredo)相关联。
注意 默认情况下将启用 Teredo。
Windows Vista 允许在仅 IPv6 模式下配置系统。在这种情况下,任何 IPv4 支持均不可用。
Windows Vista 中的 TCP/IP 堆栈支持强主机路由模型。这就意味着,从多宿主的计算机路由的数据包不仅要基于目标地址,而且要基于数据包的源地址。这个更改是必要的,因为在 IPv6 中,每个计算机获取多个 IP 地址,在使用转换技术的情况下,就考虑路由而言,主要以多宿主计算机的形式出现。为确保在这些场合中可以正确连接,网络堆栈必须实现强主机路由模型。
表现
使用 Windows XP TCP/IP 堆栈的应用程序和/或不知道 IPv6 协议的应用程序,将不会正常运行,可能会崩溃或创建不稳定的系统。
应用程序的强主机路由模型的含义如下:
从非循环地址连接到循环地址将失败,反之亦然。
不允许通过网络中的 Windows Vista 计算机来发送源地址为 127.0.0.0/8 的数据包。
补救措施
应用程序需要按如下要求重新编写:
挂接到堆栈的所有应用程序都必须能够处理 IPv6 通信。至少,在接收 IPv6 通信时不应崩溃。
任何依赖存在单个 IPv4 地址的应用程序都需要进行修改以处理多个 IPv6 地址。而且,任何选取首个地址的应用程序都可能需要更加仔细地识别要使用的 IPv6 地址。这是因为 IPv6 本地链接地址是不可路由的,因此,应用程序可能会不工作。相反,应用程序应使用允许按名称进行连接的函数并自动选择最适合的地址。
应用程序必须处理和支持仅 IPv6 的情况。
应用程序必须支持和实现强主机路由模型。
链接
兼容性风险
不支持使用的组件
以下 Windows 早期版本中的组件将不会出现在 Windows Vista 中:
内核模式打印机驱动程序支持:现在,所有打印机驱动程序都必须遵循用户模式驱动程序框架。将阻止所有内核模式打印机驱动程序载入到 Windows Vista。有关详细信息,请参阅 User-Mode Driver Framework (UMDF) 站点。
Windows Vista 不支持使用 Windows 帮助(WinHelp.exe 和 WinHlp32.exe)。Beta 2 不支持 Windows 帮助,而一些 Windows 帮助代码已从该版本中删除。要在 Windows Vista 中查看具有 .HLP 文件扩展名的帮助文件,您需要从 Microsoft 下载中心下载并安装 Windows 帮助。此下载对 Beta 2 或 RC1 不可用。有关详细信息,请参阅帮助引擎支持。
注意 Windows Vista 将继续支持 HTML Help 和 .CHM 文件。
Microsoft FrontPage 服务器扩展。现在,Windows SharePoint Services 为开发人员社区提供了增强的功能集。
Macintosh 的服务。
D3DRM。DirectX 将是 Windows Vista 唯一支持的图形包。
Web 发布向导。
NetDDE - 出于安全考虑,Windows Vista 不支持 NetDDE。(默认情况下,在 Windows XP SP 2 和 Windows Server 2003 上将禁用 NetDDE。)仍然支持常规 DDE。NetDDE 技术允许使用 DDE 传输的应用程序通过网络透明地进行数据交换。结果将是应用程序无法通过网络进行数据交换。要解决该问题,可使用一种不同的网络技术,例如,DCOM 或 Windows Communication Foundation。有关 NetDDE 的详细信息,请参阅 https://support.microsoft.com/default.aspx?scid=kb;en-us;125703。
帮助和支持中心
帮助和支持中心 (HelpCtr.exe) 是专用于 Windows XP 和 Windows Server 2003 的帮助应用程序。帮助和支持中心显示已编译的具有 .CHM 文件扩展名的帮助文件。
帮助和支持中心未包含在 Windows Vista 中,其功能不被支持。如上所述,已编译的具有 .CHM 文件扩展名的帮助文件只在 HTML 帮助应用程序中显示。
帮助平台客户端
帮助平台客户端 (HelpPane.exe) 是一个专为 Windows Vista 设计的新帮助引擎。它与任何先前版本的 Windows 均不兼容。要显示具有 .H1S 文件扩展名的帮助文件,需要使用帮助平台客户端。
在 Windows Vista 中,帮助平台客户端可由 OEM、系统创建者、企业客户在遵守许可协议的前提下进行自定义,但不能由第三方程序使用。有关自定义帮助平台客户端的详细信息,请参阅 Windows SDK。
Windows Vista 显示器驱动程序模型 (VDDM)
Windows Vista 显示器驱动程序模型 (VDDM) 是一个全新的显示器驱动程序模型,它提高了 Windows 中显示器驱动程序的稳定性。VDDM 中包含了许多主要功能,其中包括:
有效管理 DX 应用程序的视频存储器和新桌面窗口管理器 (DWM)。在 Windows Vista 中,多个 3D 应用程序将使用图形处理器单元 (GPU)。
升级驱动程序无需重新启动。
动态检测 GPU 挂起,无需重新启动即可进行恢复。
监视器的热插拔检测支持。
使用 DX9L 强制要求的硬件功能。
无故障视频回放。
可进行非常安全的设计。
而 Windows 早期版本的大部分应用程序不应受 VDDM 影响,包括以下风险:
DX 游戏兼容性,会导致 DX 运行时、IHV 驱动程序或核心图形堆栈问题。
因更严格的 ACPI 要求而使用的移动功能(如热键、克隆视图、亮度和放大)。
可访问性,尤其是 Windows XP 设计的屏幕放大应用程序在 Windows Vista 上无效。
链接
通过电子邮件发送图形反馈别名:lhgfxfb@microsoft.com
安全异常处理
在 Windows 早期版本中,IsBadReadPtr 和 IsBadWritePtr 函数用于验证参数。现在,Windows Vista 上禁止使用这些函数。同样,依赖于 Windows 组件(使用这些函数来验证参数)的应用程序会发现 Windows 已不再使用它们。应用程序不应依赖于 Windows 进行任何参数验证(将检查 null,如果指针不正确,应用程序将失败)。
安全异常处理 (SEH) 还将与不执行标记联合使用。在对异常进行调度之前,将检查异常处理程序是否被标记了 page_execute,同时还将检查处理程序是否为有效代码以及其是否在 SEH 表格中。
DLLmain 操作
在进程创建期间,DLL 的加载顺序不能得到保证,不得依赖它来执行操作。由于新的 OS 组件依赖关系,DllMain 中的复杂处理可能会导致应用程序挂起或崩溃。有关详细信息,请参阅 MSDN 上的以下页面:
Outlook Express 已重命名
Outlook Express 已被更改和移动,现在称为 Windows Mail。MAPI 应用程序需要知道这一更改。动态使用 MAPI 默认程序的大部分应用程序应该不会遇到任何兼容性问题。
Shell:主题和我的文档位置
Windows 资源管理器 Shell 已为 Windows Vista 引入了新的可视主题。Windows 早期版本中能够处理主题的应用程序对新主题应该没有兼容性影响。
同时,“我的文档”位置和结构在 Windows Vista 中已进行了更改以便提供更好的用户体验。用户数据现存储在 \users\%username%\ 文件夹结构中。Pictures、Music、Documents、Desktop 和 Favorites 都是直接位于此结构下的新文件夹。如果应用程序使用 ShGetFolderPath 函数并动态使用文件夹路径,则会自动将其重定向到新路径和文件位置。通常,应用程序不会察觉到因这些更改所造成的兼容性影响。
快速用户切换 (FUS)
所有版本的 Windows Vista 中现在均提供“快速用户切换”(FUS),包括加入域的计算机。应用程序和安装程序需知道 FUS,并能处理多个已登录的用户会话和终端服务器方案。有关详细信息,请参阅 Microsoft Windows XP Fast User Switching:Design Guide for Building Business Applications(英文)。
CriticalSection 代码更改
CriticalSection 代码已做了更改,以提高安全性和可靠性。使用关键节锁的应用程序:
应始终初始化关键节。
不应读入非文档式对象。读入非文档式结构以评估关键节状态的应用程序在查找未初始化和释放的关键节时很有可能会中断。
应防止资源不足。在持有关键节锁时调用 Sleep 的应用程序现可导致需要该锁的其他线程出现资源不足情况。Sleep 调用应置于 LeaveCriticalSection 调用之后。
有关详细信息,请参阅 MSDN 中的关键节对象主题。
用户界面权限隔离 (UIPI)
在 Windows Vista 中,默认情况下将启用“用户界面权限隔离”(UIPI)。由于此安全功能,较低完整性级别中的进程无法通过 Windows 消息传送 (SendMessage) 与较高完整性级别的进程进行通信。这就意味着,运行于标准用户级别下的应用程序无法与使用高管理级别的其他应用程序进行通信。这也将意味着,安装键盘或鼠标挂钩的应用程序现在将需要改为使用清单和请求提升。欲了解相关信息,请参阅本文档中的“Internet Explorer 保护模式”一节。
默认程序
功能影响
媒体
简要说明
“默认程序”是在考虑了争用资源的应用程序的情况下设计的一种新基础结构,用于管理每个用户文件和协议关联。应用程序需要进行注册方可使用“默认程序”功能。请注意,“默认程序”在 Windows Vista 和以后的版本中将具有大量可视内容,对于要进行编码和维护的应用程序而言,某些任务更容易。
因为对于常见任务有如此多的竞争应用程序,因此,在当今的软件生态系统中很难管理 Windows 中的默认行为。许多人都使用多个软件程序来执行同样的操作:浏览 Web、查看图片、播放音乐、观看电影以及管理电子邮件来命名一些内容。即使很多人决定尝试某个应用程序,这也具有极大的困难,该应用程序已永久接管了他们的系统和默认行为(如双击)。
当我们开始向同一台计算机中添加多个用户时,问题将变得更为糟糕。当多个用户开始使用不同的应用程序时,它们将开始随意修改相互间的默认设置。此问题的根源在于协议和文件关联通常都是基于每台计算机进行管理和被采用的,将通过向注册表中的 HKLM (HKEY_Local_Machine) 中写入注册表项来实现这些操作。使此问题变得更为困难的是,应用程序将在注册表中的多个位置执行写入操作以采用默认值。
这往往会导致某些应用程序在注册表中的某一位置执行写入操作,而其他应用程序却在另一个位置执行写入操作。当这些应用程序希望回收某些行为的默认值但却无法实现时,问题将变得更糟,因为它们不会在其他应用程序所具有的所有位置执行写入操作。核心问题是需要通过一种简单的方式来管理系统上具有资源之争的应用程序。
补救措施
Windows 首先尝试解决此问题的是 SPAD(设置程序访问和默认值)。这使得用户能够允许应用程序尝试回收其以前的默认行为。SPAD 仅允许应用程序运行某一注册的代码来返回至某一状态。SPAD 是大开关,可为整个计算机设置默认值。Windows Vista 中仍将提供 SPAD,以便允许管理员配置计算机的默认值并隐藏访问,不过,对于用户而言,其不是主要的默认值体验。
在 Windows Vista 中,我们提供了一组应用程序可以使用的新功能。此组新功能称为“默认程序”。默认程序旨在帮助用户就其默认行为进行选择。其中大部分是 Windows Vista 及以后版本中的默认值,这些默认值将主要在“每个用户”级别而不是“每个计算机”级别进行控制。这使得多用户计算机环境具有更大的灵活性,我们相信这种多用户计算机环境将成为标准环境。其中一部分是为用户添加新的集中式 UI,但其余部分将为 ISV 提供它们所需的工具来帮助用户进行选择。默认程序为应用程序提供了:
采用默认值的简化过程。
每个用户文件和协议关联。
检查默认值的编程方式。
可重复使用的常见 Windows UI。
Windows 中的广告区。
此功能主要是为争用资源的应用程序而设计的。这些应用程序希望成为文件类型(如 mp3 和 jpeg)或协议(如 http 和 mailto)的默认值。主要处理其自己的协议和文件关联的应用程序通常不需要使用此新功能,因为它们不必担心其他应用程序对其进行任意破坏。不争用资源的应用程序的行为和安装方式同在 XP 中类似。不过,所有应用程序均可利用新的“默认程序”功能。
“默认程序”功能作为一系列控制面板和开放式 API 被内置于操作系统中。对于要使用控制面板或 API 的应用程序而言,它需要在安装时通过编写特定架构进行注册方可成为“默认程序”的一部分。这使得应用程序可显示在“默认程序”控制面板中,因此,用户可在任何给定的时间还原应用程序的默认文件关联和协议。
一旦用“默认程序”对某个应用程序进行了注册,该应用程序便可利用通过 API 提供的新功能。默认程序提供 API 旨在:
还原所有注册的默认值。
还原单个注册的默认值。
查询特定默认文件关联/协议/开始菜单规范的所有者。
为特定应用程序启动默认值 UI。
清除所有每个用户关联。
“默认程序”功能旨在使得安装后的用户选择更容易,并为应用程序提供一个简单的框架来争取默认值并对其进行声明。
为何使用默认程序
深层要点:
默认程序有助于发现应用程序。
对 Windows Vista 而言,允许所有管理员写入到 HKLM 的底层体系结构正在发生改变。
默认程序允许应用程序在更改非常少的代码时维护 XP 奇偶过程流。
仅声明计算机级别默认值不会始终给出所需结果。
对于使用“默认程序”框架的争用资源的应用程序而言,消费者可明显获益,而对于使用“默认程序”的应用程序而言,也有显著的益处。
“默认程序”为注册的应用程序提供了丰富的 UI 体验,因此它可以真正地向用户通告其所能做到的所有令人惊异的事情。此外,通过某个 URL 进行数字签名的应用程序将能够显示该 URL,且允许用户很容易地往回导航至其主网站,并查看公司提供的其他应用程序和增强功能。
使用新的 API 集还将显著减少新应用程序的开发成本。几乎所有争用资源的应用程序均可监视或检查它们是否不为默认值。通过使用新的 API 集,可在单个 API 调用中实现此操作,而不是像在以前版本的 OS 中那样会使注册很缓慢。
使用新的 API 集还有助于应用程序在使用“用户帐户控制”(UAC) 的新环境中正确运行。通过以管理员身份使其看上去像系统的标准用户来实现 UAS。这就意味着,管理员不能在 Windows Vista 及之后的版本中正常写入到 HKLM。这样做的结果就是,进程无法在管理员不知晓的情况下代表管理员进行操作。因为有该体验,安装通常始终会有所提升,不过,对于希望能够声明安装后默认值的应用程序而言,它们需要在每个用户级别而不是在每个计算机级别声明默认值。切换到新的 API 集可自动执行此操作。尝试声明每个计算机安装后默认值的应用程序将失败。
应用程序使用“默认程序”的另一个重要原因就是总是可获得所需结果。文件和协议关联是从注册表中的层次结构派生而来的。此结构中的一部分指明每个用户默认值将始终通过每个计算机默认值进行选择。这就意味着,如果应用程序决定通过写入到 HKLM(与在 XP 中一样)在其代码中构建提升点以便声明默认值,则它将不会始终获得所需结果。只要安装了另一个类似的应用程序,且使用了采用每个用户文件和协议关联的默认程序 API,以前的应用程序即不再是默认值,因为每个用户默认值具有更高的优先权。
默认程序 UI
默认程序具有多组 UI。这些图片不是 Windows Vista 出厂时此体验所显示的最终图片,但它们对功能和要了解的内容进行了一般介绍。
默认程序 UI 流:
图 2
开始菜单:
图 3
默认程序控制面板 Hub 页面:
图 4
设置默认程序页面:
图 5
只有已注册的应用程序才会显示在应用程序列表中。当应用程序注册了某个说明值后,它即会显示在右侧的列表框中。注册时需要说明。
图 6
还原默认值将回收应用程序的所有注册默认值。“高级”允许用户为应用程序选择特定的默认值。
注意 为了能够在 UI 中显示 URL,应用程序必须将 URL 嵌入到其数字签名的 Authenticode 证书中。未签名的应用程序将无法显示 URL。
高级
图 7
此视图显示了应用程序已注册的所有内容以及当前拥有默认值的应用程序。由于存在一个允许应用程序调用此窗口的 Windows 公共 API,因此,应用程序不再需要维护文件关联 UI。建议使用此 UI 而不创建自定义 UI。
默认程序指南和最佳实践:
安装
该操作系统上的应用程序的安装方式应与其在 XP 中的安装方式相同。此外,应用程序需要为默认程序创建其架构。注册新架构使应用程序可以利用所有新功能。安装方式与在 XP 中时相同的应用程序仍有效,但各应用程序需要进行注册以在安装后采用默认设置。应用程序在安装时应完成以下任务:
安装必要的二进制文件(与 XP 相同)。
向 HKLM 写入程序 ID(与 XP 相同)。
注意 应用程序需要为其关联创建特定于应用程序的 ProgID。
索求计算机级文件关联(与 XP 相同)。
向新的默认程序架构写入信息(Windows Vista 中的新增任务)。
安装后
首次运行体验:
应用程序可选择设置“每用户首次运行体验”。这是建议的设置。在该设置下,应用程序会询问与每个用户的选择相关的问题。应用程序不应选择“每计算机首次运行体验”。首次运行体验将为用户提供两种主要选择:
接受默认应用程序设置(这将是默认行为)。
自定义设置。
接受默认设置会调用默认程序 API,该 API 将索求应用程序的所有已注册默认设置。这会将默认文件关联从每计算机设置更改为每用户设置。
自定义设置会向用户显示文件关联 UI。应用程序可以编程方式为某特定应用程序调用 Windows 文件关联 UI。这是建议方法。
默认 UI :
选择显示默认 UI 的应用程序会使用新的默认程序 API 打开文件关联的以应用程序为中心的版本。
Litware Media Player 示例:
图 8
在该视图中,用户将看到某特定应用程序已注册的所有默认设置。用户将能够查看应用程序的内容、当前默认设置,并可将默认设置更改为新的应用程序。在保存时,将提交所有更新并关闭窗口。在取消时,将关闭窗口。在提供该 UI 的情况下,应用程序不必再耗费用于维护文件关联 UI 的开发资源,或考虑关联是否设置正确。
检查应用程序是否为默认设置:
许多应用程序(例如 Web 浏览器或电子邮件客户端)具有通常不为用户所知的文件和协议关联。HTTP:\ 和 Mailto:\ 就是其中的例子。此类应用程序在被调用时,通常会检查并确认自己是否为默认设置。应用程序会通过新的默认程序 API 集来检查和确认自己是否为默认设置。如果该应用程序不是默认设置,它会向用户显示一个 UI,要求其进行以下操作:
保持所有设置不变。
使该应用程序成为默认设置。
应用程序还应包含一个默认情况下为选中状态的复选框,该复选框表达的意思是“请在 <应用程序> 不再是默认设置时通知我”。应用程序不会在未询问用户的情况下自动索求默认设置。应用程序会通过调用默认程序 API 来实现 #1,以重新索求应用程序已注册的所有默认设置。
下面是使用 Internet Explorer 的示例:
图 9
注册到默认程序
默认程序的作用是,使每个应用程序明确注册它们要将哪些文件关联和协议考虑用于默认设置。这通过在 HKLM 中注册以下架构来完成。请注意,ApplicationDescription 可以是字符串文字,也可以是字符串资源引用。后者允许 MUI'ization。
HKLM\%APPLICATIONCAPABILITYPATH% ApplicationDescription = REG_EXPAND_SZ "@path\to\dll.dll,-resourceId" ApplicationName = REG_EXPAND "@path\to\dll.dll,-resourceId" \FileAssociations .file-extension = REG_SZ "file-extension-progid" \UrlAssociations url-scheme = REG_SZ "url-scheme-progid" \MIMEAssociations MIME = REG_SZ "mime-progrid" \Startmenu REG_SZ StartmenuInternet ="%app Name%" Mail ="%App Name%"
注意 这些是指向已在 HKLM\software\clients 中注册规范的应用程序的指针。值应为 HKLM\software\clients\StartmenuInternet 或 HKLM\software\clients\Mail 下的注册表项名称。
HKLM\Software\RegisteredApplications unique-app-name = REG_SZ "%APPLICATIONCAPABILITYPATH%"
注意 ApplicationDescription 是必需的。但 ApplicationName 为可选条目,允许不同类型应用程序指向同一 .exe 并显示为不同名称。
注意 要在该 UI 中显示 URL,应用程序必须在其数字签名证书中嵌入 URL。未签名的应用程序将无法显示 URL。
下面是使用 Contoso Web 浏览器的示例:
注意 这应是一个 DLL 以允许进行本地化。
HKLM\software\Contoso\WebBrowser\Capabilities Description ="这一倍受赞誉的 Web 浏览器在其性能上有了很大的提高。 它可以在极短的时间内搜索 Internet 并找到所需的任何内容。它采用 集成的选项卡和新的网页仿冒检测程序,提升了用户的 Internet 体验。" \FileAssociations .htm = ContosoHTML .html = ContosoHTML .shtml = ContosoHTML .xht = ContosoHTML .xhtml = ContosoHTML \UrlAssociations http = Contoso.Url.Http https = Contoso.Url.Https ftp = Contoso.Url.ftp \Startmenu StartmenuInternet = "Contoso.exe" HKLM\software\RegisteredApplications Contoso.WebBrowser.1.06 = software\Contoso\WebBrowser\Capabilities
ProgId
应用程序需要提供特定于应用程序的 ProgId。ProgId 应含有通常写入到默认注册表项中的所有信息。应用程序可在 progid 与协议/扩展名之间建立一对一或一对多的映射关系。这完全是随机的,并且两种方法的效果相同。在上述示例中,ContosoHTML 指向一个含有 htm、html、shtml、xht 及 xhtml 的 shellexecute 信息的单个 progid。对于协议,会为每个协议都定义一个特定 progid。这就使每个协议的执行字符串也不同。
在为 MIME 定义 ProgID 时,progid 必须含有附带相应应用程序的类 id 的 CLSID 子项。这用于对照该类 id 在存储于 HKLM 中的 MIME 数据库中进行查找。
值的定义
Capabilities - 存储特定应用程序的所有默认程序信息的注册表子项。Capabilities 子项始终在应用程序注册表项级别下。
Description - 默认程序旨在帮助用户做出明智的选择。我们允许每个应用程序都注册一个描述字符串,以便每个应用程序可以向用户通告其功能。该值是 \capabilities 下的一个属性。
注意 这是必填字段。应用程序必须在此处提供一个要在 UI 中显示的条目。务必要将您的字符串本地化。
ApplicationName - 指定将在默认程序 UI 中显示的名称。如果此字段未填写,则默认程序将使用与最先注册的 progid 相关联的 .exe 的名称作为应用程序名称。应用程序名称应始终与 RegisteredApplications 名称相符。
FileAssocations - 该文件关联子项用于存储应用程序要索求的所有特定文件关联。每个文件关联都存储为 FileAssocations 子项的一个属性。每个扩展名都应指向一个特定于应用程序的 progid,而不是通用 progid。
UrlAssocaitions - URL 关联子项用于存储应用程序要索求的所有特定 URL 关联。每个 URL 关联都存储为 UrlAssocations 子项的一个属性。每个协议都应指向一个特定于应用程序的 progid,而不是通用 progid。
MIMEAssocaitions - MIME 关联子项用于存储应用程序要索求的所有特定 MIME 关联。每个 mime 关联都存储为 MIMEAssocations 子项的一个属性。该名称应是存储在 MIME 数据库中的 MIME 名称的原样,值应是含有相应 CLSID 的特定于应用程序的 progid。
Startmenu - Startmenu 子项用于开始菜单上的 Internet 和电子邮件插槽。同时还注册为这些插槽的争用者的应用程序可将该功能链接到其默认程序条目中。提供指向开始菜单注册信息的链接使应用程序可以表明,当它在默认程序中显示时还需要相应的电子邮件或 Internet 链接。如果提供了此信息,并且用户将默认设置恢复为此程序,则此信息还将接替 startmenu 位置。该注册信息正好就是 HKLM\software\clients\StartMenuInternet 或 HKLM\software\clients\Mail 下的已注册项的名称。如果是邮件客户端,它还会设置默认的 MAPI 客户端。
注意 另外有一个单独的开始菜单注册信息。有关详细信息,请参阅 https://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/programmersguide/shell_adv/registeringapps.asp
HKLM\software\RegisteredApplications - RegisteredApplications 是必需项,以便 OS 能够知道有关各应用程序的所有信息的存储位置。它应该是应用程序的名称。
使用默认程序 API
一旦应用程序注册完成,就有多个 API 可供应用程序用于实现更佳的用户体验。此界面位于 June CTP 中。在 Beta2 版本中,此界面已根据用户反馈进行了更改,因此会略有不同。
typedef [v1_enum] enum tagASSOCIATIONLEVEL { AL_MACHINE, AL_EFFECTIVE, AL_USER } ASSOCIATIONLEVEL; typedef [v1_enum] enum tagASSOCIATIONTYPE { AT_FILEEXTENSION, AT_URLPROTOCOL, AT_STARTMENUCLIENT, AT_MIMETYPE } ASSOCIATIONTYPE; [ object, uuid(4e530b0a-e611-4c77-a3ac-9031d022281b), pointer_default(unique), helpstring("应用程序文件扩展名和 URL 协议注册") ] interface IApplicationAssociationRegistration : IUnknown { HRESULT QueryCurrentDefault( [in, string] LPCWSTR pszQuery, [in] ASSOCIATIONTYPE atQueryType, [in] ASSOCIATIONLEVEL alQueryLevel, [out, string] LPWSTR* ppszAssociation); HRESULT QueryAppIsDefault( [in, string] LPCWSTR pszQuery, [in] ASSOCIATIONTYPE atQueryType, [in] ASSOCIATIONLEVEL alQueryLevel, [in, string] LPCWSTR pszAppRegistryName, [out] BOOL* pfDefault); HRESULT QueryAppIsDefaultAll( [in] ASSOCIATIONLEVEL alQueryLevel, [in, string] LPCWSTR pszAppRegistryName, [out] BOOL* pfDefault); HRESULT SetAppAsDefault( [in, string] LPCWSTR pszAppRegistryName, [in, string] LPCWSTR pszSet, [in] ASSOCIATIONTYPE atSetType); HRESULT SetAppAsDefaultAll( [in, string] LPCWSTR pszAppRegistryName); HRESULT ClearUserAssociations(); } interface IApplicationAssociationRegistrationUI : IUnknown { HRESULT LaunchAdvancedAssociationUI([in, string] LPCWSTR pszAppRegName); }
AssociationLevel
AL_MACHINE - 返回适用于某扩展名的计算机默认设置。
AL_EFFECTIVE - 返回当前用户的有效默认设置。
注意 这是多数应用程序都会使用的函数。
AL_USER - 返回每用户默认设置。如果不存在每用户默认设置,它会返回故障代码 0x80070483。
AssociationType
AT_FILEEXTENSION - 用于查询 .htm 或 .mp3 之类的文件扩展名
AT_URLPROTOCOL - 用于查询 http:// 或 mailto: 之类的协议
AT_STARTMENUCLIENT - 用于查询邮件或 Internet 链接的 startmenu 客户端的所有者。
AT_MIMETYPE - 用于查询 MIME 类型,例如 audio/mp3。
QueryCurrentDefault
传入扩展名(.mp3、HTTP 等等)的字符串、所属扩展名的类型、关联级别,并且它将返回当前默认设置的 ProgID。通常,应用程序将使用 AL_EFFECTIVE 关联级别,因为这将确定用户的有效默认设置。调用者必须 CoTaskMemFree 所返回的 progid 字符串。
QueryAppIsDefault
传入扩展名(.mp3、HTTP 等等)的字符串、所属扩展名的类型、关联级别以及已注册应用程序名称,并且它将根据应用程序是否拥有该默认设置而返回 BOOL 值。通常,应用程序将使用 AL_EFFECTIVE 关联级别,因为这将确定用户的有效默认设置。
QueryAppIsDefaultAll
传入关联级别、已注册应用程序名称,并且它将根据应用程序是否拥有其所有已注册的默认设置而返回 BOOL 值。通常,应用程序将使用 AL_EFFECTIVE 关联级别,因为这将确定用户的有效默认设置。
SetAppAsDefault
传入已注册应用程序名称、扩展名(.mp3、HTTP 等等)及所属扩展名的类型。默认设置将设置为已注册的应用程序。
SetAppAsDefaultAll
传入已注册应用程序名称,并且它将设置注册到该应用程序的所有默认设置。
ClearUserAssociations
删除当前用户的所有每用户关联,将该用户返回到每计算机默认设置所在的注册表项下。当前不存在要求有人来调用此函数的已定义的合作伙伴或第三方场景。但如果他们想调用,也可以进行调用。
LaunchAdvancedAssociationUI
指定的应用程序注册名必须与 HKLM\Software\RegisteredApplications 下注册的某个值匹配。以便为指定的应用程序启动“设置程序关联”页面。旨在用于提供到其高级关联配置的 UX 直接链接的应用程序。
注意 此 API 集仅可用于 Windows Vista 及其以后版本。支持下级 OS(XP、Win2K 和 Win98)的应用程序应通过使用 sku 检查来使用下级 OS 上的预先存在的默认代码,以便区分 Windows Vista 之前和 Windows Vista 之后的 OS。
代码示例
使用 Contoso Web 浏览器的注册,以下为使用 API 集来实现它的方式。
Contoso Web 浏览器拥有其所有默认设置时进行如下查询:
HRESULT CheckContosoHasAllDefaults(__out BOOL* pfHasAllDefaults) { IApplicationAssociationRegistration* pAAR; HRESULT hr = CoCreateInstance(CLSID_ApplicationAssociationRegistration, NULL, CLSCTX_INPROC, __uuidof(IApplicationAssociationRegistration), (void**)&pAAR); if (SUCCEEDED(hr)) { hr = pAAR->QueryAppIsDefaultAll(AL_EFFECTIVE, L"Contoso.WebBrowser.1.06", pfHasAllDefaults); pAAR->Release(); } return hr; }
Contoso Web 浏览器拥有 .htm 的默认设置时进行如下查询:
HRESULT CheckContosoHasDotHTM(__out BOOL* pfHasDotHTM) { IApplicationAssociationRegistration* pAAR; HRESULT hr = CoCreateInstance(CLSID_ApplicationAssociationRegistration, NULL, CLSCTX_INPROC, __uuidof(IApplicationAssociationRegistration), (void**)&pAAR); if (SUCCEEDED(hr)) { hr = pAAR->QueryAppIsDefault(L".htm", AT_FILEEXTENSION, AL_EFFECTIVE, L"Contoso.WebBrowser.1.06", pfHasDotHTM); pAAR->Release(); } return hr; }
设置 Contoso Web 浏览器作为 .htm 的默认浏览器:
HRESULT SetContosoAsDefaultForDotHTM() { IApplicationAssociationRegistration* pAAR; HRESULT hr = CoCreateInstance(CLSID_ApplicationAssociationRegistration, NULL, CLSCTX_INPROC, __uuidof(IApplicationAssociationRegistration), (void**)&pAAR); if (SUCCEEDED(hr)) { hr = pAAR->SetAppAsDefault(L"Contoso.WebBrowser.1.06", L".htm", AT_FILEEXTENSION); pAAR->Release(); } return hr; }
文件关联文档
有关使用客户端类型注册程序的详细信息,请参阅 https://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/programmersguide/shell_adv/registeringapps.asp
有关动词和文件关联的详细信息,请参阅 https://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/programmersguide/shell_basics/shell_basics_extending/fileassociations/fa_verbs.asp
Windows Vista 中的程序兼容性助手 (PCA) - 客户准备文档
PCA 简介
附件中的“程序兼容性向导”以及文件属性中的“兼容性”选项卡是针对用户的实用工具用以解决 Windows XP 中的兼容性问题。这些工具的主要限制是发掘能力有限,且存在这样一种事实,即用户需要知道何时使用这些工具。程序兼容性助手 (PCA) 作为 Windows Vista 中的新增功能,可以使得较早的有兼容性问题的程序以自动化方式更好地运行。如果在用户运行早期的程序后 PCA 检测到已知的兼容性问题,它将通知用户并提供适用的解决方案,用户下次运行程序前会生效。
注意 PCA 是针对客户端的功能,服务器上不可用。
下列部分描述了用户预期会遇到 PCA 的一些情况,用户体验的细节,适用于这些情况中的每一个的解决方案,如何在稍后管理由 PCA 执行的设置。最后一部分介绍了如何防止程序使用 PCA。
PCA 情况
检测安装失败
对于 PCA 的主要情况之一便是检测要安装到 Windows Vista 上的程序发生安装程序失败的情况,并提供应用 Windows XP 兼容性模式的解决方案。
最常见的安装错误起因于安装程序硬编码对它们可运行的 Windows OS 版本的检查。这些安装程序通常失败时返回这样一条错误消息,即,不支持当前 Windows 版本并终止。对此的进一步解释是,程序通常使用 GetVersion 或 GetVersionEx API 来获取它们正在其上运行的 Windows OS 版本。在 Windows Vista 中,这些 API 将返回 6 作为主要版本。如果程序被硬编码来查找主要为版本 5 的 XP 版本,则它在 Windows Vista 中将失败。Windows XP 兼容性模式中包括的 XPVersionLie 修复程序会在程序调用 GetVersion 或 GetVersionEx API 时,为其提供 OS 的 XP 版本。
以下是一个示例错误消息,来自用于键盘和鼠标的 Microsoft Intellitype 软件,发现其在 Windows 内部应用程序兼容性测试期间,在 Windows Vista 中失败,
图 10
PCA 将检测此情况并在安装程序被终止后显示类似于如下的用户界面。
图 11
如果用户选择选项来“使用推荐设置重新安装”,Windows XP 兼容性模式将应用于该安装程序,安装程序会自动重启。
以下问答解释了其中所发生情况的详细信息:
检测逻辑是什么,PCA 如何知道安装因版本问题失败?
PCA 并不专门查找因版本问题引起的安装失败。PCA 使用的逻辑为,如果安装未成功完成将进行检测。它监视由 Windows Vista 视为安装程序进行检测的程序并检查程序是否在“添加或删除程序”(ARP) 中注册条目。如果未在 ARP 中创建任何条目,则 PCA 断定安装未成功完成,并等待安装程序终止,然后显示 UI。
PCA 如何获取有关安装程序的信息?
PCA 依靠 Windows Vista 中的“用户访问控制”(UAC) 功能来了解是否程序被安装。UAC 包括对安装程序的检测并将确保检测的安装程序以提升的权限运行(作为管理员)。这包括在启动程序前获取来自用户的管理凭据或确认。
PCA 对话框中每个与安装有关的选项有何功能?
“使用推荐设置重新安装”
这将应用 Windows XP 兼容性模式并重新启动程序。要获取更多有关如何应用兼容性模式的详细信息,请参阅以下关于管理 PCA 设置的相关部分。
“程序已正确安装”
可能在某些情况下,PCA 会提出已正确安装但未在 ARP 中创建条目的安装程序。这种情况下,客户可以使用此选项。
“取消”
PCA 将不进行任何操作。
所有这些选项均会导致 PCA 对话框消失。对于同一安装程序 PCA 将不会再次显示,除非用户在上一 PCA 对话框中选择了“取消”选项。
在 UAC 下检测程序失败
对于 PCA 的第二种情况是,在“用户访问控制”(UAC) 下运行的同时检测程序故障。PCA 检测到这一非较高权限的程序遇到故障且同时启动了 child exe 这一特殊情况,因为它被检测出是安装程序且需要以很高的权限进行运行。尝试启动 updater.exe 的程序通常会遇到这种情况。如果同一 updater.exe 从资源管理器运行,则它会如预期的那样以很高的权限进行运行,因为资源管理器知道如何启动 UAC 许可 UI 并以很高的权限运行程序。
这种情况下,PCA 将应用 ELEVATECREATEPROCESS 兼容性模式,使程序下次能够以管理员的身份成功地启动 child exe。下次程序尝试启动 child exe 时,用户会看到 UAC 许可 UI 提供或确认管理员凭据。
以下为在此情况下显示的 PCA 对话框的示例,由测试程序说明。
图 12
此处,测试程序正在尝试启动更新程序,该程序需要以很高的权限进行运行且已失败。这由 PCA 来检测。现在,如果在程序下次运行时尝试启动更新程序,该程序将不会失败并会以很高的权限成功运行。用户会看到如下所示的 UAC 许可 UI。
图 13
有关在后台发生的情况的更多详细信息,将在下面的问答中进行解释。
检测逻辑是什么,PCA 如何知道程序在启动需要以管理员身份运行的 child exe 时失败?
对此种情况的检测将通过 CreateProcess API 处的规范来完成,目的是检测 child 进程启动因需要以很高的权限运行而导致失败这一情况。
为什么 PCA 对话框中不包含任何选项?
出于对此种情况中的问题检测的高度信任,系统将自动应用解决方案(ELEVATECREATEPROCESS 兼容性模式),用户无需进行任何选择。
程序启动时告知用户已知程序的兼容性问题
除了以下列出的两个运行时问题检测情况外,PCA 还包括一种在程序启动时提出具有兼容性问题的程序列表这一情况。该列表将存储在“系统”应用程序兼容性数据库中。此情况存在于 Windows XP 中,这些消息被称为“应用程序帮助”(也称为 apphelp)消息。
apphelp 消息共有两种类型。如果发现该程序不兼容并且如果该程序可能对系统造成严重影响(例如,停止错误或安装后无法启动等),则将显示如下所示的拦截消息。
注意 Microsoft 已从 ISV 获得了对被拦截程序的批准。
图 14
另一类型的消息为类似于如下内容的非拦截消息。这将用于具有已知兼容性问题但不会对系统造成严重影响的程序。
图 15
这两种情况下,“检查解决方案”将发送一份 Windows 错误报告,以从 Microsoft 获得在线响应。响应将显示在客户端的“问题的解决方案”(wercon.exe) UI 中。通常,响应将属于以下 3 种类型:
有关该程序,将用户指向 ISV 的更新。
有关详细信息,将用户指向 ISV 网站。
有关详细信息,将用户指向 Microsoft 知识库文章。
由 PCA 进行的管理设置
通过使用键名 =“full path of the exe”,字符串值 =“name of the compatibility mode being applied”设置
“Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers”下面的注册表项,将兼容性模式应用于程序。
如果是安装情况:
应用于安装程序 .exe 的兼容性模式名称将是“WINXPSP2”。
设置 HKEY_LOCAL_MACHINE 下面的注册表项,以应用对所有用户有效的这一解决方案。
如果是 UAC 情况:
应用于程序 .exe 的兼容性模式名称将是“ELEVATECREATEPROCESS”。将设置 HKEY_CURRENT_USER 下面的注册表项,该解决方案将只对当前用户有效。
必须删除这些注册表项,才能删除由 PCA 应用的兼容性模式。
排除 PCA 中的程序
PCA 用于检测旧程序的问题,而不用于监控为 Windows Vista 开发的程序。排除 PCA 中的程序的最佳选择是通过程序包括含有为 UAC 而标记的运行级别(管理员或受限用户)的应用程序清单。这意味着程序将被测试后以在 UAC(和 Windows Vista)下工作,并且 PCA 将检查此清单并排除该程序。这对安装程序和普通程序都适用。有关 UAC 和如何创建此 UAC 清单的详细信息,请参阅 https://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnlong/html/AccProtVista.asp。
需要时,将提供组策略设置以禁用所有程序的 PCA。
该策略的名称为“Turn Off Program Compatibility Assistant”(关闭程序兼容性助手),且可在组策略编辑器 (gpedit.msc) 中“管理模板 -> Windows 组件 -> 应用程序兼容性”的下面找到。
管理 Apphelp 消息
企业中的 IT 专业人员可以使用 Compatibility Administrator 工具禁用“系统”应用程序兼容性数据库中的 apphelp 条目或在其企业中为程序添加包含 apphelp 消息的自定义数据库。
Compatibility Administrator 工具是作为 Application Compatibility Toolkit 的一部分提供的。有关该 Toolkit 的详细信息,请参阅 https://www.microsoft.com/technet/windowsvista/appcompat/tools.mspx
图形设备接口 (GDI)
绘制 (WM_PAINT) 行为差异
功能影响
小
简要说明
作为“桌面窗口管理器”工作的一部分,Microsoft 已经对应用程序在屏幕上绘图的方式进行了细微而重要的更改。在 Windows Vista 之前,hwnd 曾被直接绘制到屏幕上,这样做虽然有一定的优点,但事实上却限制了 Windows 显示和管理顶层窗口的方式。在 Windows Vista 中,将所有顶层窗口呈现为屏幕外位图(类似于 WS_EX_LAYERED),“桌面窗口管理器”会将图像组合在一起以绘制桌面。
表现
工具提示、弹出菜单、提示框、启动画面等周围的黑色区域。
在应用程序尚未绘制出完整 hwnd 时,可能会发生这种情况,通常是因为该应用程序认为背景窗口中的像素已足够好。这是 Microsoft 正在积极改善的区域,因此不要根据当前的位过度优化,但请向我们提供反馈。
黑闪
当应用程序进行不属于 WM_PAINT 的绘画时,将发生相关问题。USER 会检测到应用程序正在绘图并重新绘制桌面,但当这种情况发生时,该应用程序可能还没有完成 hwnd 的绘制,因此便会产生包含未初始化像素(黑色)的备份位图。同样,Microsoft 正在积极处理这一区域,因此请将有关您认为的需要改进之处的反馈发送给我们。
对应用程序禁用玻璃效果
当应用程序绘制到窗口的非客户端区域(标题栏)时,将会发生这种情况。
橡胶带、自定义阴影及其他特殊效果
这些效果通常可通过 GetDC(NULL) 实现;但是,当应用程序以位图备份,而不是直接绘制到屏幕时,对 GetDC(NULL) 的读取和写入将易于出现问题。对屏幕的读取和写入速度明显低于 Windows XP。而且,并不支持所有的 GDI 光栅操作(但我们确实支持 XOR)。
改进的远东字体
Windows Vista 对中文、日文和韩文字体进行了多处更改,使它们更加易读;副作用之一是,当字符可能有不同宽度时,这些采用新字体的文本的布局可能会略有不同。请考虑测试您的文本在屏幕和打印机上的布局方式。而且,还请考虑测试远东语言可与拉丁文字符集(例如英语)混用的地方。
渲染性能
功能影响
小
简要说明
大多数应用程序将在 Windows Vista 上快速或更快速地运行,但有一些更改可能需要监控。
表现
整体 GDI 绘图性能会变慢吗?
现在,GDI 原型(如 LineTo 和 Rectangle)在软件上而不是视频硬件上提供,大大简化了显示器驱动程序。我们认为这不会影响许多现实中的应用程序,但如果有影响的话,我们希望得到您的反馈。
文本显示速度会变慢吗?
诸如 DrawText 之类的调用可更好地支持国际语言和东亚语言,我们认为这不会影响现实中的应用程序,但如果有影响的话,我们希望得到您的反馈。
应用程序地址空间会减少吗?
在应用程序的地址空间中存储顶层窗口的位图(请参阅有关绘图的部分),可能减少一些 MB 的可用地址空间。
会从 GetDC(NULL) 中进行读取并写入到其中吗?
此操作比先前版本的 Windows 慢,因为现在应用程序呈现为屏幕外位图,而不是直接显示到屏幕上。在可能的情况下,请考虑绘制到 HWND 备份的 HDC,或创建覆盖窗口。GetDC(NULL) 仍是获取屏幕快照的首选方式。
UIPI(用户帐户控制的 GUI 部分)
功能影响
小
简要说明
作为防止恶意软件的附加保护层,Windows Vista 允许使用三种不同级别的 UI 权限来运行不同的 UI 应用程序。应用程序可与相同和较低权限的其他应用程序自由交互,但不能修改较高权限的应用程序或与之对话。大多数应用程序将使用中间权限运行,而需要管理员权限的应用程序要在较高的模式中运行,受限进程(如低权限 Internet Explorer)使用最低的权限模式。
更具体地说,除非较高权限的应用程序通过调用 ChangeWindowMessageFilter() 明确允许该消息,否则处于较低权限模式的应用程序不能向较高权限的应用程序发送消息。同样,较低权限应用程序可以读取由较高权限应用程序所拥有的 HWND,但不能对其进行修改。由于兼容性的原因,即使 API 因权限问题而被阻止,SendMessage 及其他 API 也会成功返回。同样,在兼容性影响较高而安全性风险较低的地方,有时允许低权限的应用程序向高权限的应用程序发送未经请求的消息。
表现
与其他应用程序交互的应用程序也会停止此类操作。
可执行下列操作的实用程序:重新定位窗口、为您键入击键、向窗口添加额外的按钮,等等。
在不同的应用程序间进行剪切和粘贴时失败。
它起作用吗?它支持您所期望的所有不同的剪贴板格式(多信息文本、HTML 等)吗?
补救措施
日记挂钩
WH_JOURNALPLAYBACK 和 WH_JOURNALRECORD 本来就是跨进程的,因此需要最高的权限级别。SendInput() API,在许多情况下不需要完全 UI 权限,常常可用来代替日记挂钩。
对于您拥有其源代码的程序,请考虑检查使用以下 API 的任一代码,因为它们常常指示跨进程的内容:
SendInput
RegisterWindowMessage
BroadcastSystemMessageEx
BroadcastSystemMessage
SetWindowsHook
SetWindowsHookEx
CallNextHookEx
CallNextHook
SetWinEventHook
AttachThreadInput
FindWindowEx
FindWindow
CreateDesktop
CreateDesktopEx
OpenDesktop
OpenInputDesktop
EnumDesktops
EnumDesktopWindows
SwitchDesktop
SetThreadDesktop
GetThreadDesktop
CloseDesktop
CreateWindowStation
OpenWindowStation
EnumWindowStations
CloseWindowStation
GetProcessWindowStation
此列表并不详尽,也不能保证是需要更改的每项内容,但它能很好地平衡发现问题和最小化假正值之间的关系。您可以使用 findstr /s /g:temp.txt *.c *.cpp *.h *.hpp 搜索源文件,其中 temp.txt 是被复制到文本文件中的上述 API 列表。
高 dpi 缩放
功能影响
小
简要说明
在使用高 dpi 设置的系统中,本身不了解高 dpi 的应用程序将自动缩放。
表现
像素大小已有很长一段时间基本没有变动,但 LCD 制造商日益趋向于推出像素越来越小的监视器,也称为高 DPI(每英寸点数)监视器。如果应用程序在高 DPI 屏幕上使用与标准 96 DPI 屏幕上相同的像素数,看起来就会很小。Windows Vista 引入了对面向 96 DPI 屏幕所编写的应用程序的放大功能,这种放大功能是通过以更大大小呈现应用程序位图来实现的。与所有位图的放大一样,这会导致图像有些模糊,但给出了大小正确、呈现适当的图像。应用程序也可以决定本身就支持高 DPI,从而实现最清晰的外观。目前,应用程序可关闭放大功能并通过调用 SetProcessDPIAware() 来声明其自身可识别 DPI。基于指令清单进行此项声明的方法正在研究中。有关如何编写本身就支持高 DPI 的应用程序的详细信息,请参阅 https://msdn.microsoft.com/library/en-us/dngdi/html/highdpiapp.asp。
本节以下部分将讨论不可识别 DPI 的应用程序的潜在问题。应用程序会向 Windows 询问“滚动条的像素宽度为多少”等问题,这样当 96 DPI 应用程序发出询问时,Windows Vista 会将 96 DPI 的答案提供给应用程序。但有些情况下,Windows 并不会基于应用程序给出答案,这通常是因为 Windows Vista 还没有足够的信息(请将有关反馈提供给我们),有时候则是因为“正确”答案取决于应用程序对答案所要进行的操作。(屏幕坐标往往会引发这一问题。)
大多数的兼容性问题是由这些不适当的状况而引起的。测试时应查找以下问题:
文本被截断(部分隐藏)。
文本过长。
所绘制的某些内容尺寸或位置错误。
补救措施
有关如何编写本身就支持高 DPI 的应用程序的详细信息,请参阅 https://msdn.microsoft.com/library/en-us/dngdi/html/highdpiapp.asp。
PNG 图标
功能影响
低
简要说明
目前,图标文件格式 (*.ico) 除支持旧的 BMP 样式图标外,还支持 PNG 图像;许多 Windows Vista 图标使用 PNG 变型。
表现
查看或编辑图标文件的应用程序可能不理解新的格式。
链接
https://blogs.msdn.com/nickkramer/archive/2006/04/24/582365.aspx
此信息是对 https://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnlong/html/AppComp.asp 内容的补充。
命名管道的强化
简要说明
在 Windows Vista 中,许多服务在 NetworkService (NS) 或 LocalService (LS) 等权限较低的帐户(而非本地系统)下运行。服务的强化是一种旨在改进各服务之间分隔的方案,这样,如果某个服务受到侵害,它不能很容易地攻击系统上的其他服务。Windows Vista 强化了 RPC 服务器所使用的命名管道,以防止其他进程进行攻击。
在 Windows XP 下,RPC 服务器创建命名管道,管道上的 ACL 授予 LocalService 或 NetworkService 完全控制权。其中包括创建管道的“服务器实例”的能力,使客户端能够进行连接。而唯一应创建管道实例的进程是最初创建管道的进程。ACL 经 Microsoft 更改后,将只允许最初创建管道的进程来创建服务器实例。
表现
以下服务受到影响:运行 LocalService 或 NetworkService 的服务、选择使用服务 Sid 的服务以及在命名管道上使用 RPC 请求“默认”命名管道安全描述符的服务。
选择使用服务 Sid 的服务意味着任何第三方服务在默认情况下都不会受到影响。服务 Sid 是 Windows Vista 中的一个新功能,您必须在服务配置中设置一个 DWORD 来进行选择。开发人员选择使用服务 Sid 后,将可采用新的服务强化行为进行测试。这一变化就是这些行为中的一项。
在命名管道上使用 RPC 请求“默认”命名管道安全描述符的服务意味着,如果某些 RPC 服务器因特殊需要而指定一个自定义的安全描述符,就不会看到任何变化。以下是受影响管道的列表:
Epmapper
Eventlog
Dav rpc
Keysvc
Winreg
Tapserv
W32time_alt
Termsvcapi
Ctx_winsta
Hydralspipe
SPAP 反对 (Pstore)
简要说明
受保护存储 (PStore) 服务为应用程序提供了一个接口来存储必须保证安全或不能进行修改的用户数据。在 Windows Vista 中,这项服务已改为只读属性。这就意味着任何尝试创建新 PStore 数据项的应用程序都将失败。
补救措施
将 DPAPI 用于将来的 PStore 过程。
有关现有 PStore 项及如何使用 DPAPI 对其进行管理的详细信息,请参阅 https://msdn.microsoft.com/library/en-us/dnsecure/html/windataprotection-dpapi.asp?frame=true
WMI 提供程序:默认的安全托管模型
简要说明
WMI 提供程序的默认 HostingModel 已从 LocalSystem 更改为 NetworkServiceHost。
在先前的 Windows 版本(Windows Vista Beta 2 之前)中,WMI 提供程序的 HostingModel(__Win32Provider.HostingModel 属性)在未指定的情况下默认为 LocalSystem。由于 LocalSystem 是高权限帐户,因此在这样的安全环境中运行的 WMI 提供程序为操作系统带来了权限提升的风险,风险的大小取决于提供程序代码质量和测试。
多数情况下,没必要使用 LocalSystem,NetworkServiceHost 环境更为合适。因为多数 WMI 提供程序必须模拟 (ImpersonationLevel=1) 客户端安全环境,来代表 WMI 客户端执行请求的操作,由此看来,这一更改特别的正确。
表现
如果 WMI 提供程序没有托管模型定义并且运行于 LocalSystem 级别下,那么它将不会正常运行。
补救措施
必须更改预期的托管模型,以确保 WMI 提供程序代码通过模拟 WMI 客户端在客户端安全环境中执行操作。需要 LocalSystem 安全环境的情况极其少见。但是,如果绝对需要 LocalSystem 环境,应在提供程序 MOF 文件中通过 HostingModel=LocalSystemHost 语句明确指定该托管模型。
链接
卷影复制服务
简要说明
卷影复制服务 (VSS) 是 Windows XP 和 Windows Server 2003 中引入的一个新服务。它是一个框架,可以方便应用程序、存储子系统及存储管理应用程序(包括备份应用程序)之间的通信。此服务用于定义、维持和使用存储数据时点复制。
表现
与 XP 备份应用程序的兼容性
自 XP 以后一些接口发生了改动,代码库与 Windows Vista 不兼容。这些 XP 应用程序至少需要使用 VSS SDK 7.2 中或随 Windows Vista Beta 2 一起发行的 Platform SDK 中的标头或库重新进行编译。
与 2K3 SP 1 备份应用程序的兼容性
2K3 SP1 中的二进制文件与 Windows Vista 兼容。多数备份应用程序还需要在以下方面进行更改:收件箱编写器、文件和注册表虚拟化、WRP,以及在 %windir%system32 中使用硬链接,这使得来自 WS 2K3 SP1 的备份应用程序不可能按原样工作。
编译 Windows Vista 的备份应用程序
对于使用 Server 2003 所提供接口的应用程序,可以使用 VSS SDK 7.2 中提供的标头和库进行编译。要使用 Windows Vista 特有的新接口,则应使用 Windows Vista 的 Platform SDK 中所含的 VSS 标头和库重新进行编译。包含 VSS 组件的 SDK 将随 Beta 2 一起首次发布。
Windows Vista 中的 VSS 编写器
注册表编写器
与已弃用的先前的编写器方案相比,注册表编写器现在执行注册表的在位备份和还原。注册表编写器不报告用户配置单元。
COM+ RegDB 编写器
此编写器用于备份 %systemroot%\registration 的内容。COM+ 依赖于备份的注册表项,因此需要通过注册表进行备份和还原。
MS 搜索编写器
此编写器用于在搜索索引创建后将其从影子副本中删除。
MSDE 编写器
这是 SQL 2000 和 SQL 2005 数据库的默认编写器。
WMI 编写器
WMI VSS 编写器用于在备份操作期间备份 WMI 特定状态及数据。这些数据包括 WBEM 存储库中的文件,需要进行注册表备份。
后台智能传输服务 (BITS) 编写器
此编写器使用 FilesNotToBackup 注册表项来从目录 %allusersprofile%\application\data\microsoft\network\downloader 中排除某些文件。
自动系统恢复 (ASR) 编写器
ASR 编写器用于存储系统的磁盘配置。
系统编写器
在 Windows Vista 中,系统编写器将采用如下规则来生成文件列表:
所有已安装的静态文件。这些文件的 writeabletype 属性 = "static ",或者在组件清单上的 writeabletype 为 ""。这将包括所有的 WRP 文件。此外,还有一些标记为静态但不是 WRP 的文件。例如,游戏文件为静态但不是 WRP,所以管理员可以更改父级控制。
包括所有清单、可选组件和第三方 Win32 文件的 WinSxS 文件夹。
用于已安装驱动程序的所有 PnP 文件(属于 PnP)。
所有用户模式服务和非 PNP 驱动程序。
属于 CryptSvc 的所有目录。
%windir%\system32 中的文件硬链接到 winsxs 目录。
还原应用程序负责根据系统快照放置文件和注册表并设置 ACL。这时也必须创建适当的硬链接。
Microsoft 优化编写器
此编写器用于从快照中删除某些文件。通过文件删除可以最大程度减小快照维持阶段的“写入时复制”(COW) I/O 量,这些文件通常是临时性文件或者那些不构成用户或系统状态的文件。
链接
http://search.msdn.microsoft.com/search/default.aspx?siteId=0&tab=0&query=Volume+Shadow+Copy+Service
标准用户分析器
“标准用户分析器”(以前称为“LUA 分析器”)是一个有用的工具,可以帮助独立软件供应商 (ISV)、IT 专业人员和用户诊断作为标准用户运行的应用程序中可能出现的问题。“标准用户分析器”基于“LUA 预测器”技术,后者是 Microsoft 应用程序验证器的一部分。
安装的前提条件和兼容性
操作系统:Windows Vista、Windows XP 和 Windows Server 2003。
注意 目前只提供“标准用户分析器”的 32 位版本。
安装的前提条件:安装“标准用户分析器”之前必须安装“应用程序验证器”。“应用程序验证器”可从 Microsoft 网站免费下载。
安装
要安装“标准用户分析器”,需运行 SUAnalyzer.msi 文件。所有的“标准用户分析器”文件都安装到“Program Files\Standard User Analyzer”文件夹下。
注意 “标准用户分析器”要求安装最新的“应用程序验证器”。
“标准用户分析器”用于诊断应用程序中的标准用户兼容性问题
注意 “标准用户分析器”应在 Windows Vista 计算机上运行,才能正确地发现应用程序的标准用户兼容性问题。下面写出的操作步骤将由 Windows Vista 计算机上的标准用户执行。
单击“开始”,指向“所有程序”,然后双击“Standard User Analyzer”(标准用户分析器)。
在“App Info”(应用程序信息)选项卡的“Target Application”(目标应用程序)字段中,输入目标应用程序可执行文件的目录位置或使用“浏览”功能。
在“App Info”(应用程序信息)选项卡的“Parameters”(参数)字段中,输入应用程序的参数(如果适用)。
在“App Info”(应用程序信息)选项卡上,选中“Launch Elevated”(启动升级)复选框,然后单击“Launch”(启动)按钮。
如果出现要求为 SUAnalyzerSrv.exe 提供用户帐户控制凭据的提示,则提供管理员凭据并单击“Submit”(提交)。
在出现要求为目标应用程序提供用户帐户控制凭据的提示时,提供管理员凭据并单击“Submit”(提交)。
注意 执行此步骤时,SUAnalyzerSrv.exe 进程可能会请求升级。这一进程是一个后台进程,负责管理需要管理员访问令牌的任务,例如更改“应用程序验证器”中的设置。
在测试期间,“标准用户分析器”将启动应用程序、监视其行为并等待其关闭。然后“标准用户分析器”将产生应用程序日志并对其进行解析,这可能需要一些时间。生成并解析日志后,单击各选项卡可查看“标准用户分析器”所发现的具体问题。
解释标准用户分析器测试数据
选项卡 | 详细信息 |
---|---|
File(文件) | 列出文件系统访问问题。例如,应用程序尝试写入数据的文件通常只能由管理员访问。 |
Registry(注册表) | 列出系统注册表访问问题。例如,应用程序尝试对 HKLM 下的注册表项执行写操作,而此位置通常只能由管理员访问。 |
INI | 列出 WriteProfile API 问题。WriteProfile API 最初用于 16 位 Windows,但在现在的一些应用程序中仍比较常见。例如 Windows XP 中的“计算器”。如果将其视图由“标准型”切换为“科学型”,calc.exe 会调用 WriteProfile API 以将数据写入 windows\win.ini,而只有管理员用户对该文件拥有写权限。 |
Token(令牌) | 列出访问令牌检查问题。如果应用程序明确地检查用户访问令牌中的“Builtin\Administrators”安全标识符 (SID),则其很有可能不能为标准用户工作。 |
Privilege(权限) | 列出权限问题。例如,如果应用程序明确地启用“SeDebugPrivilege”,则其不能为标准用户工作。 |
Name Space(命名空间) | 列出应用程序在受限命名空间中创建系统对象时所引发的问题(例如事件、内存映射)。存在此错误的应用程序将不能为标准用户工作。 |
Other Objects(其他对象) | 列出关于文件和注册表项以外其他对象的访问问题。 |
当单击任一选项卡中某个问题时,“标准用户分析器”的左下方窗格都会显示日志文件中所有与其相关的记录。接下来可以单击任何一条记录,右下方窗格中会随即显示该记录的详细信息,其中包括格式消息、参数和堆栈跟踪。ISV 可以使用堆栈跟踪数据追踪到应用程序源代码中的问题。
标准用户分析器主菜单
File (文件)菜单
Open Log File(打开日志文件):加载一个已保存的日志文件。
Export Log File(导出日志文件):保存当前的日志文件。
View Raw Log File(查看原始日志文件):以原始 xml 格式打开当前的日志文件。(警告:如果文件太大,将需要很长一段时间才能打开文件。)
Exit(退出):退出程序。
View(视图)菜单
选择要显示的消息种类。通常只有“错误消息”视图是必要的。
Options(选项)菜单
Filter Noise(筛选干扰信息):在显示/隐藏“干扰”条目之间切换。
Load Noise Filter File(加载干扰信息筛选文件):加载干扰信息筛选文件。
Export Noise Filter File(导出干扰信息筛选文件):保存干扰信息筛选文件。
Only Display Records with Application Name in StackTrace(仅显示应用程序名在 StackTrace 中的记录):这样可以减少干扰信息,但是由于“标准用户分析器”只捕获前 32 个堆栈帧,所以如果调用堆栈中的内容超过 32 个帧,则启用此选项可能会漏掉真正的问题。
Logging(日志记录):日志记录选项。建议不要选中“Log Information”(日志信息)复选框,以避免日志文件过大。
帮助引擎支持
Microsoft 致力于在 Windows 平台上提供帮助和支持技术,并将继续为软件开发人员研究新的解决方案。本文档介绍 Windows Vista 对四种 Microsoft 帮助技术的支持情况:Windows 帮助、HTML Help 1.x、“帮助和支持中心”以及“帮助平台”客户端。
Windows 帮助(WinHelp.exe 和 WinHlp32.exe)
Windows 帮助(WinHelp.exe 和 WinHlp32.exe)是从 Windows 3.1. 开始的 Windows 中就已经采用的最初的帮助引擎。要显示文件扩展名为 .HLP 的帮助文件,需要使用 Windows 帮助。
Windows Vista 未提供 Windows 帮助技术。Beta 2 不支持 Windows 帮助,一些 Windows 帮助代码已从该版本中删除。要在 Windows Vista 中查看文件扩展名为 .HLP 的帮助文件,需要从 Microsoft 下载中心下载并安装 WinHlp32.exe。此下载不适用于 Beta 2。
Microsoft 强烈建议软件开发人员停止在 Vista 中使用 Windows 帮助应用程序。对于依赖于 .HLP 文件提供帮助的程序,软件开发人员最好将其帮助体验迁移到备选的帮助文件格式,例如 CHM、HTML 或 XML。此外,还需要将调用 WinHelp() API 改为调用新的内容资源。有几个第三方工具可以帮助作者将内容从一种格式转化为另一种格式。
HTML Help 1.x (HH.exe)
Microsoft HTML Help 1.x (HH.exe) 是从 Windows 98 开始的 Windows 版本中所采用的帮助系统。要显示文件扩展名为 .CHM 的已编译帮助文件,需要使用 HTML Help。
Windows Vista 中将包含 HTML Help。但此引擎将只进行一些主要的更新。Windows Vista 或未来的 Windows 版本中的 HTML Help 引擎将不会增加新的功能或功能改进。
有关 HTML Help 功能和 HTML 帮助文件编写方法指导的详细信息,请参阅 Help 1.4 SDK (https://msdn.microsoft.com/library/default.asp?url=/library/en-us/htmlhelp/html/vsconhh1start.asp) 站点。
帮助和支持中心 (HelpCtr.exe)
帮助和支持中心 (HelpCtr.exe) 是一个专用于 Windows XP 和 Windows Server 2003 的帮助应用程序。帮助和支持中心显示文件扩展名为 .CHM 的已编译帮助文件。
帮助和支持中心未包含在 Windows Vista 中,其功能不被支持。前面提到过,文件扩展名为 .CHM 的已编译帮助文件只能在 HTML Help 应用程序中显示。
帮助平台客户端 (HelpPane.exe)
帮助平台客户端 (HelpPane.exe) 是一个专为 Windows Vista 设计的新帮助引擎。它与任何先前版本的 Windows 均不兼容。要显示文件扩展名为 .H1S 的帮助文件,需要使用“帮助平台”客户端。
在 Windows Vista 中,“帮助平台”客户端可由 OEM、系统构建商、企业客户在遵守许可协议的前提下进行定制,但不能由第三方程序使用。有关定制“帮助平台”客户端的详细信息,请参阅 Windows SDK。