如何还原缺少的 Windows 安装程序缓存文件和解决 SQL Server 更新的过程中出现的问题

文章翻译 文章翻译
文章编号: 969052 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

症状


本文中描述的过程是提供紧急救济,只并不永久解决。使用此紧急过程的客户应验证它们按照知识文库文章中的说明,请使用Windows 安装程序缓存验证程序程序包的 Windows 安装程序缓存 2667628。

当您尝试安装 Microsoft SQL Server 服务包或累积更新时,您可能会遇到下面的错误消息,可以指示 Windows 安装程序缓存问题。Windows 安装程序缓存,位于c:\windows\installer文件夹中存储应用程序文件安装使用Windows 设置r 技术并不会删除重要。如果安装程序缓存已遭到破坏,您可能无法立即请参阅问题,直到您执行的操作如卸载、 修复或更新 SQL Server。

在安装 SQL Server 的Windows 安装程序将存储关键文件存储在 Windows 安装程序缓存 (默认为 C:\Windows\Installer)。将卸载和更新应用程序需要这些文件。因为它们都是唯一的计算机之间无法复制缺少的文件。

Microsoft 建议您使用 SQL Server 安装的第一次在这些文章中所述的修复过程来确认您当前的安装:
注意在事件日志中或在安装程序日志中均位于下面的文件夹之一,表明您应修复受影响的实例正在进行更多操作,可以以短信形式找到下面的错误消息:
  • 对于 SQL Server 2008年和 SQL Server 2008 r2:
    C:\Program 使用 SQL Server\100\Setup 引导
  • 对于 SQL Server 2012年:
    C:\Program 使用 SQL Server\110\Setup 引导

SQL 2005 年 (所有分支机构)
收起该表格展开该表格
产品版本找不到安装程序程序包 (MSI) 时出现错误消息缺少安装程序缓存包 (MSP) 时出现错误信息
SQL Server 2005
1636 无法安装 Windows 安装程序的 MSI 文件
1636 无法安装 Windows 安装程序的 MSP 文件
注意您必须查看安装程序日志文件,以确定是否丢失了任何缓存文件。有关如何执行此操作的详细信息,请转到"解决方案"一节。

SQL Server 2008 sp1
收起该表格展开该表格
产品版本找不到安装程序程序包 (MSI) 时出现错误消息缺少安装程序缓存包 (MSP) 时出现错误信息
SQL Server 2008 SP1没有错误消息
标题: SQL Server 安装程序失败。
------------------------------
SQL Server 安装程序遇到了以下错误: 无法打开修补程序文件。该文件是: c:\WINNT\Installer\1cf506f.msp。错误代码 0x84B20001。
------------------------------
仅生成 SQL Server 2008 sp3 (CU/GDR 分支不适用)
收起该表格展开该表格
产品版本找不到安装程序程序包 (MSI) 时出现错误消息缺少安装程序缓存包 (MSP) 时出现错误信息
SQL Server 2008 SP3
找不到缓存的 MSI 文件 C:\Windows\Installer\2775c8.msi。其原始文件是 sql_engine_core_inst.msi,它已安装产品的 Microsoft SQL Server 2008年数据库引擎服务从<network path="">,版本"10.3.5500.0",语言 ENU。</network>
找不到缓存的修补程序文件"C:\Windows\Installer\19b19196.msp"。此缓存文件的原始文件是"sql_engine_core_inst.msp",可以从"服务包 3 为 SQL Server 2008 (KB2546951) (64 位)",版本 10.3.5500.0 上安装
注意在执行升级时,您会收到以下错误消息:
收起这个图片展开这个图片
SQL Server 错误


对于 SQL Server 2008 R2 SP1 只 (CU/GDR 分支不适用)
收起该表格展开该表格
产品版本找不到安装程序程序包 (MSI) 时出现错误消息缺少安装程序缓存包 (MSP) 时出现错误信息
SQL Server 2008 R2 SP1
标题: SQL Server 安装程序失败。
------------------------------
SQL Server 安装程序遇到了以下错误: C:\Windows\Installer\932b909.msi。
------------------------------
找不到缓存的修补程序文件"C:\Windows\Installer\105441.msp"。此缓存文件的原始文件是"sql_engine_core_inst_loc.msp",您可以从"Service Pack 1 的 SQL Server 2008 R2 (KB2528583) (64 位)"安装,版本 10.51.2500.0。
注意在执行升级时,您会收到以下错误消息:
收起这个图片展开这个图片
SQL Server 错误


SQL Server 2008 R2 sp2
收起该表格展开该表格
产品版本找不到安装程序程序包 (MSI) 时出现错误消息缺少安装程序缓存包 (MSP) 时出现错误信息
SQL Server 2008 R2 SP1
找不到缓存的 MSI 文件 C:\Windows\Installer\932b909.msi。其原始文件是 sql_engine_core_inst.msi,它已安装产品的 SQL Server 2008 R2 SP1 数据库引擎服务从<network path="">,版本"10.51.2500.0",语言 ENU。</network>
找不到缓存的修补程序文件"C:\Windows\Installer\105441.msp"。此缓存文件的原始文件是"sql_engine_core_inst_loc.msp",您可以从"Service Pack 1 的 SQL Server 2008 R2 (KB2528583) (64 位)"安装,版本 10.51.2500.0。
注意在执行升级时,您会收到以下错误消息:
收起这个图片展开这个图片
SQL Server 错误


对于 SQL Server 2012 之前 CU2
没有缺少 MSP 或 MSI 文件的消息。但是,在安装程序日志中记录错误代码 1714年。

在 Summary.txt 文件中:
组件名称: SQL Server 安装程序支持文件
组件错误代码: 1714年

在 Detail.txt 文件中:
<Date><Time>Slp: Sco: d:\2d5feb4dd893c4adee47f15661ac\1033_ENU_LP\x64\setup\sqlsupport_msi\x64\SqlSupport.msi 文件不存在
<Date><Time>Slp: Sco: d:\2d5feb4dd893c4adee47f15661ac\1033_ENU_LP\x64\setup\sqlsupport_msi\x64\SqlSupport.msi 文件不存在
<Date><Time>Slp: 检查点: PREINSTALL_SQLSUPPORT_CPU64_ACTION
<Date><Time>Slp: Sco: 试图创建基本的注册表项置此变量,计算机<Server name="">
<Date><Time>Slp: Sco: 试图打开注册表子项 Software\Microsoft\Windows\CurrentVersion\Installer
<Date><Time>Slp: Sco: 尝试获取注册表值 InstallerLocation
<Date><Time>Slp: Windows 安装程序版本: 5.0.7601.17514
<Date><Time>Slp: Sco: 等待服务 'msiserver' 接受停止请求。
<Date><Time>Slp: Sco: 试图打开 SC 管理器
<Date><Time>Slp: Sco: 试图打开服务的服务 msiserver 的句柄
<Date><Time>Slp: 调用 QueryServiceStatus Win32 API
<Date><Time>Slp: Sco: 试着关闭服务的服务 msiserver 的句柄
<Date><Time>Slp: Sco: 试着关闭 SC 管理器
<Date><Time>Slp: 目标包:"d:\2d5feb4dd893c4adee47f15661ac\1033_ENU_LP\x64\setup\sqlsupport_msi\SqlSupport.msi"
<Date><Time>Slp: MSI 错误: 不能删除旧版本的 Microsoft SQL Server 2012年安装 (英语) 的 1714年。与技术支持组联系。
<Date><Time>Slp:InstallPackage: MsiInstallProduct 返回了结果代码 1603。
<Date><Time>Slp: 使用 MSI 错误代码以检测的重试选项: 1714年
<Date><Time>Slp: 不能重试的 MSI 返回检测到的代码。</Time></Date></Time></Date></Time></Date></Time></Date></Time></Date></Time></Date></Time></Date></Time></Date></Time></Date></Time></Date></Time></Date></Time></Date></Time></Date></Time></Date></Server></Time></Date></Time></Date></Time></Date></Time></Date>

对于 SQL Server 2012 CU2 (和任何后续 CU 或 SP)
收起该表格展开该表格
产品版本找不到安装程序程序包 (MSI) 时出现错误消息缺少安装程序缓存包 (MSP) 时出现错误信息
SQL Server 2008 R2 SP1
缓存的 MSI 文件 C:\Windows\Installer\<file_encoded_name>.msi 丢失了。其原始文件是 ' C:\Windows\Installer\sql_<featurename>.msi} 及其产品安装 Microsoft SQL Server <version>C:\originalfolder,从版本<versionnumber>,语言<language>。</language> </versionnumber> </version> </featurename> </file_encoded_name>
找不到缓存的修补程序文件"c:\Windows\Installer\1fdb1aec.msp"。其原始文件是"sql_engine_core_inst.msp",可从"修补程序 2316年为 SQL Server 2012 (KB2679368) (64 位)",版本 11.00.2100.60.The 缓存的修补程序文件安装"C:\Windows\Installer\<file_encoded_name>.msp 丢失了。其原始文件 ' C:\Windows\Installer\sql_<featurename>.msp},可以从安装的修补程序<number>为 SQL Server 2012年<KB number="">,版本<versionnumber>。</versionnumber> </KB> </number> </featurename> </file_encoded_name>

原因

Windows 安装程序数据库文件 (.msi) 或 Windows 安装程序修补程序文件 (.msp) 丢失时 Windows 安装程序缓存中,则可能会出现这些问题。Windows 安装程序缓存文件位于以下文件夹中:
%windir%\installer
通过使用 Windows 安装程序安装产品时,Windows 安装程序缓存中存储已去除原始.msi 文件的版本。对产品修补程序,是累积性更新或服务包安装程序,例如每次更新还将相关.msp 或.msi 文件存储在 Windows 安装程序缓存中。

修补程序,是累积性更新或服务包安装程序,如产品对任何未来的更新依赖于存储在 Windows 安装程序缓存文件中的信息。如果没有此信息,新的更新不能执行所需的转换。

解决方案

要解决这些问题,请使用下列过程之一。

步骤 1: 使用脚本

若要完成此过程中的步骤,您必须复制 FindSQLInstalls.vbs 脚本 为要更新您的 SQL Server 安装在计算机上的本地文件夹的"详细信息"部分。

注意FindSQLInstalls.vbs 脚本收集的信息来更正无效的包路径。然后,此脚本对源位置使用,以确保所有 MSP 程序包中的 Windows 安装程序缓存目录。如果原始的源媒体,将重新添加任何丢失的文件包。

若要通过使用脚本来解决这些问题,请执行以下步骤:
  1. 找到脚本内容保存到的目录。
  2. 打开提升的命令提示符脚本,保存到的目录,然后运行下面的命令:
    Cscript FindSQLInstalls.vbs %computername%_sql_install_details.txt
  3. 在文本编辑器 (如记事本),在步骤 2 中打开该文件,并确定导致失败的问题。若要执行此操作,文字文件中搜索的字符串模式如下所示:
    • 不这样做
    • !!!
  4. 根据在步骤 3 中的结果,采取所需的步骤。

    注意查找有关"示例"一节中的这些步骤的详细信息。

  5. 直到在第 2 步中创建的文本文件中不再包含引用了无效的路径或丢失的文件正在被更新的组件的文本,请重复步骤 2 到 4。

示例

下面的示例将条目和 FindSQLInstalls.vbs 脚本运行时生成的输出文件所述的操作的说明。

示例 1: 安装程序文件丢失
以下是输出的您会错过.msi 包的 Windows 安装程序高速缓存文件夹中时,将生成的示例。
================================================================================
PRODUCT NAME   : Microsoft SQL Server 2008 Database Engine Services
================================================================================
  Product Code: {9FFAE13C-6160-4DD0-A67A-DAC5994F81BD}
  Version     : 10.2.4000.0
  Most Current Install Date: 20110211
  Target Install Location: 
  Registry Path: 
   HKEY_CLASSES_ROOT\Installer\Products\C31EAFF906160DD46AA7AD5C99F418DB\SourceList
     Package    : sql_engine_core_inst.msi
  Install Source: \x64\setup\sql_engine_core_inst_msi\
  LastUsedSource: m;1;G:\x64\setup\sql_engine_core_inst_msi\

"LastUsedSource"行指向用于运行安装程序的位置。

在"LastUsedSource"行中, m ;该项表示媒体,表示原始数据源是 CD/DVD 介质。

在下面的示例中,源是 CD 或 DVD 驱动器 g。如果安装发生从一个文件的文件夹或网络共享上,"LastUsedSource"行开头n ;条目,跟Numeric_Data_Name ;条目,然后再实际路径:
!!!! sql_engine_core_inst.msi DOES NOT exist on the path in the path G:\x64\setup\sql_engine_core_inst_msi\ !!!!
 
Action needed, re-establish the path to G:\x64\setup\sql_engine_core_inst_msi\ 

"操作需要"行显示必须存在,才能更新丢失原始安装媒体的文件的完整路径:
Installer Cache File: C:\WINDOWS\Installer\19b4d2.msi 

"安装程序缓存文件"行确认安装程序缓存文件的名称:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!! C:\WINDOWS\Installer\19b4d2.msi DOES NOT exist in the Installer cache. !!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

下面的输出部分,建议您需要解决缺少的文件的操作:
 Action needed, recreate or re-establish path to the directory:
     G:\x64\setup\sql_engine_core_inst_msi\then rerun this script to update installer cache and results
     The path on the line above must exist at the root location to resolve
     this problem with your msi/msp file not being found or corrupted,
     In some cases you may need to manually copy the missing file or manually
     replace the problem file overwriting it is exist: 
 
     Copy "G:\x64\setup\sql_engine_core_inst_msi\sql_engine_core_inst.msi" C:\WINDOWS\Installer\19b4d2.msi
 
     Replace the existing file if prompted to do so.
示例 2: 缺少的修补程序
缺少的修补程序可能会导致类似示例 1 中的条目。大多数情况下,您会注意到引用一个修补程序,"修补程序 LastUsedSource"行中的条目,这行类似于以下:
Patch LastUsedSource:   n;1;c:\0ca91e857a4f12dd390f0821a3\HotFixSQL\Files\

此输出表明下列有关安装修补程序:
  • 通过双击该修补程序的可执行文件,原始修补程序已安装。
  • 此修补程序的安装程序安装的修补程序过程中使用临时文件夹中,c:\0ca91e857a4f12dd390f0821a3。
  • 要重新创建该路径,必须运行相同的可执行文件,并添加以下参数:
    /x:c:\0ca91e857a4f12dd390f0821a3
    注意此命令会强制该可执行文件以解压文件至以前丢失的位置,并且这将重新创建使用任何丢失的文件更新的 Windows 安装程序缓存所需的结构。实际位置而异,并且单个修补程序 (如服务包可能需要解压缩到多个位置。每个已安装的产品包括一个部分,包含"已安装的修补程序"的以下信息:
    Display name:
    KB Article URL:  http://support.microsoft.com/?kbid=<value>
    Patch LastUsedSource: 

    "KB 文章 URL"行可以帮助您下载任何修补程序的媒体,如果这是必需的。

步骤 2: 手动还原文件

若要手动还原文件,Windows 安装程序缓存中的缺失,请执行以下步骤:
  1. 从错误消息、 设置日志文件,或正在由 Windows 安装程序维护的注册表项,请收集有关缺少的文件的完整详细信息。例如,在"症状"部分中的错误消息 1、 解决问题所需的全部信息是错误消息中出现:
    • PatchName:"修补程序 1702年个 SQL Server 2008 R2 (KB981355) (64 位)"
    • 原来使用的修补程序的 MSP 文件: sql_engine_core_inst.msp
    • 缓存的 MSP 文件: c:\Windows\Installer\1fdb1aec.msp
  2. 如果没有所有的详细信息,请参阅"步骤 2"部分的步骤后,若要收集这些详细信息的详细信息。
  3. 请访问 http://support.microsoft.com并搜索与此修补程序关联的知识库文章。在此示例中,您必须搜索 KB981355。
  4. 此修补程序软件包下载到计算机中。请确保您将相对应的修补程序包下载到所需的平台。在此示例中,该软件包是 SQLServer2008R2-KB981355-x64.exe。
  5. 通过使用下面的语法解压缩修补程序软件包的内容:
    C:\Temp>SQLServer2008R2-KB981355-x64.exe /x C:\Temp\SQLServer2008R2-KB981355-x64\
  6. 找到原始的 msp 文件 sql_engine_core_inst.msp 文件。该文件应在以下文件夹中:
    C:\Temp\SQLServer2008R2-KB981355-x64\x64\setup\sql_engine_core_inst_msi\
  7. 将此原始的 msp 文件复制到下面的 Windows 安装程序缓存:
    %windir%\installer\
  8. 重命名原始的 msp 文件 sql_engine_core_inst.msp,以下名称:
    缓存的 msp 文件 1fdb1aec.msp

可以启动安装程序的更新程序导致了该错误并继续更新过程。您可能会遇到此邮件的丢失的 Windows 安装程序高速缓存文件,供另一个组件或同一产品的另一个更新。

若要获取所有缺少 Windows 安装程序缓存文件相关的 SQL Server 产品组件的列表,您可以下载"更多信息"一节中提到的 SQL Server 2008 R2 BPA 工具。

如果错误消息引用了一个丢失的 Windows 安装程序数据库文件 (.msi),您不需要执行步骤 2 到 4。相反,您可以直接转到步骤 5。必须先找到.msi 文件从原始介质,用于安装该产品。如果 sql_engine_core_inst.msi 生成此错误消息,则必须找到此文件与下面的文件夹结构下的安装介质:
\x64\setup\sql_engine_core_inst_msi\
其它步骤是相同的。

步骤 2 的详细信息

如何查找缺少的.msp 文件的修补程序软件包和产品详细信息
不同版本的产品生成不同的错误消息这一问题的。从 Microsoft SQL Server 2008 SP1 更新的安装程序会出现"症状"一节中提到的错误消息。有其他更新中,,您将收到错误消息,可能没有明确说明哪些修补程序文件从 Windows 安装程序缓存和特定更新的详细信息将丢失。这些错误消息,安装程序日志文件将包含缺少的 Windows 安装程序缓存文件的信息。安装程序日志示例如下所示:
MSI (s) (FC:F8) [13:48:58:649]: Opening existing patch 'C:\WINDOWS\Installer\145258.msp'.
MSI (s) (FC:F8) [13:48:58:649]: Couldn't find local patch 'C:\WINDOWS\Installer\145258.msp'. Looking for it at its source.
MSI (s) (FC:F8) [13:48:58:649]: Resolving Patch source.
MSI (s) (FC:F8) [13:48:58:649]: Note: 1: 2203 2: D:\cda162709d239766830bae5ce12b\HotFixSQL\Files\sqlrun_sql.msp 3: -2147287037 
MSI (s) (FC:F8) [13:48:58:649]: SOURCEMGMT: Source is invalid due to missing/inaccessible package.
MSI (s) (FC:F8) [13:49:29:961]: Product: Microsoft SQL Server 2005 -- Installation failed.
MSI (s) (FC:F8) [13:49:29:992]: MainEngineThread is returning 1635
This patch package could not be opened.  Verify that the patch package exists and that you can access it, or contact the application vendor to verify that this is a valid Windows Installer patch package.
D:\SQL2K5\Servers\Setup\SqlRun_SQL.msi

如果仔细检查此安装程序日志时,它已提供原始的 MSP 文件使用以下修补程序有关的信息:
sqlrun_sql.msp


若要查找有关 Windows 安装程序缓存中丢失的.msp 文件的更多详细信息,请执行以下步骤:
  1. 在下面的 Windows 安装程序修补程序注册表子项缺失的.msp 文件的搜索:
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Patches\
  2. 查找此修补程序的 GUID。
  3. 在下面的 Windows 安装程序产品注册表子项中的修补程序 guid 搜索:
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\
示例安装程序日志中,将以下注册表项中存在丢失的.msp 文件和其相应的修补程序详细信息的信息:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Patches\A3B085EA74A9A7640A496636F7EF9A44

值: 0
名称: LocalPackage
数据: C:\WINDOWS\Installer\145258.msp

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\1EB3A031CC585314E87AA527E46EECC2\Patches\A3B085EA74A9A7640A496636F7EF9A44
值: 6
名称: displayName
对于 SQL Server 数据库服务 2005 ENU (KB932555) 的数据: GDR 2050

现在您具有的所有信息点,着手解决丢失的文件,Windows 安装程序缓存中的步骤。

注意如果您使用 Microsoft SQL Server 2008 Service Pack 3 (SP3) 或更高版本,您还可以收到缺少的.msi 文件类似的错误消息。通过使用此错误消息,可以快速确定缺少哪些文件,哪些服务包下载,并可以在此找到下载。

有关如何获取服务包的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
2546951 SQL Server 2008 Service Pack 3 中所修复的 bug 列表

更多信息

有关 Windows 安装程序数据库 (.msi) 文件的详细信息,请访问下面的 Microsoft 开发人员网络 (MSDN) 网站:
安装程序数据库
有关 Windows 安装程序修补程序 (.msp 文件) 的文件的详细信息,请访问下面的 MSDN 网站:
修补程序包
有关 Windows 安装程序缓存的内部详细信息的详细信息,请参阅下面的 MSDN 博客:
Windows 安装程序缓存
有关修补过程的详细信息,请参阅下面的 MSDN 博客:
修补程序的工作原理
有关如何确定您缓存正确的平台的修补程序文件的详细信息,请参阅下面的 MSDN 博客:
SQL Server 安装程序提示"安装的产品与安装源不匹配"
为什么使用 Windows 安装程序的任何产品可能会遇到此问题的详细信息,请参阅下面的 MSDN 博客:
重新生成安装程序缓存
有关安装程序日志文件中显示的错误消息的不同组的详细信息的更多信息,请参阅下面的 MSDN 博客:
第一部分: SQL Server 2005 修补程序安装失败并出现错误"无法安装 Windows 安装程序的 MSP 文件"


有关产品或自动检查此条件和 SQL Server 产品的版本的 SQL Server 实例上的工具的详细信息,请参阅下表:
收起该表格展开该表格
规则软件规则标题规则说明对规则进行评估所依据的产品版本
SQL Server 2008 R2 最佳实践分析器 (SQL Server 2008 R2 BPA)安装程序的安装程序缓存是缺少 SQL 设置SQL Server 2008 R2 最佳实践分析工具 (SQL Server 2008 R2 BPA) 提供了一条规则来检测缺少安装 SQL Server 组件缓存文件。SQL Server 2008 R2 BPA 支持 SQL Server 2008年,SQL Server 2008 R2。如果您运行 BPA 工具和遇到的错误的设置-标题安装程序缓存缺少 SQL 安装,然后缓存丢失了文件高速缓存文件夹中。SQL Server 2008
SQL Server 2008 R2
SQL Server 2012年最佳实践分析工具 (SQL Server 2012 BPA)安装程序的安装程序缓存是缺少 SQL 设置SQL Server 2012年最佳实践分析器 (SQL Server 2012 BPA) 提供了一条规则来检测缺少安装 SQL Server 组件缓存文件。如果您运行 BPA 工具和遇到的错误的设置-标题安装程序缓存缺少 SQL 安装,然后缓存丢失了文件高速缓存文件夹中。SQL Server 2012



FindSQLInstalls.vbs 脚本

' Copyright ? Microsoft Corporation.  All Rights Reserved.
' This code released under the terms of the 
' Microsoft Public License (MS-PL, http://opensource.org/licenses/ms-pl.html.)
 
 
On Error Resume Next
 
Dim arrSubKeys, arrSubKeys2
Dim objFSO, objShell, objFile, objReg, objConn, objExec
Dim strComputer, strKeyPath, strNewSource
Dim strWorkstationName, strDBPath, strSubKey, strSubKey2(), strKeyPath02,  strRetValue00
Dim strRetValue01, strRetValue02, strRetValNew02, strRetValNew03, strRetValNew04, strRetValNew05, strRetValNew06, strRetValNew07, strRetValNew08, strRetValNew09, strRetValue10, strRetValNew10, strRetValNew11, strRetValNew12, strRetValNew13, strRetValNew14, strRetValNew14a, strRetValNew14b, strRetValNew15, strRetValNew15a, strRetValNew15b, strRetValNew16, strRetValNew17, strRetValNew18
 
Const HKCR = &H80000000 'HKEY_CLASSES_ROOT
Const HKLM = &H80000002 'HKEY_LOCAL_MACHINE
Const ForReading = 1, ForWriting = 2, ForAppEnding = 8
 
' Checking for Elevated permissions
Dim oShell, oExec
szStdOutszStdOut = ""
Set oShell = CreateObject("WScript.Shell")
Set oExec = oShell.Exec("whoami /groups")
 
Do While (oExec.Status = cnWshRunning)
    WScript.Sleep 100
       if not oExec.StdOut.AtEndOfStream Then
                szStdOut = szStdOut & oExec.StdOut.ReadAll
       end If
Loop
 select case oExec.ExitCode
   case 0
       if not oExec.StdOut.AtEndOfStream Then
           szStdOut = szStdOut & oExec.StdOut.ReadAll
       End If
       If instr(szStdOut,"Mandatory Label\High Mandatory Level") Then
                wscript.echo "Elevated, executing script and gathering requested data"
       Else
           if instr(szStdOut,"Mandatory Label\Medium Mandatory Level")  Then
          Wscript.echo "Not Elevated must run from Administrative commmand line."
       Else
          Wscript.echo "Gathering requested data..."
           end If
      End If
   case Else
       if not oExec.StdErr.AtEndOfStream Then
          wscript.echo oExec.StdErr.ReadAll
       end If
       end select
 
'
' Leaving strNewSource will result in no search path updating.
' Currently DO NOT EDIT these.
strNewSource = ""
strNewRTMSource = ""
 
' Define string values
strComputer = "."
strSQLName = "SQL"
strDotNetName = ".NET"
strVStudioName = "Visual Studio"
strXML = "XML"
strOWC = "Microsoft Office 2003 Web Components"
strKeyPath = "Installer\Products"
strKeyPath2 = "SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products"
strNValue00 = "ProductName"
strNValue01 = "PackageName"
strNValue02 = "LastUsedSource"
strNValue03 = "InstallSource"
strNValue04 = "LocalPackage"
strNValue05 = "DisplayVersion"
strNValue06 = "InstallDate"
strNValue07 = "UninstallString"
strNValue08 = "PackageCode"
strNValue09 = "MediaPackage"
strNValue10 = "InstallSource"
strNValue11 = "AllPatches"
strNValue12 = "NoRepair"
strNValue13 = "MoreInfoURL"
strNValue14 = "PackageName"
strNValue15 = "LastUsedSource"
strNValue16 = "Uninstallable"
strNValue17 = "DisplayName"
strNValue18 = "Installed"
 
If WScript.arguments.count <> 1 Then
   WScript.echo "Usage: cscript " & WScript.scriptname & " outputfilename.txt"
   WScript.quit
End If
 
'--Setup the output file
Set fso = CreateObject("Scripting.FileSystemObject")
Set txtFile = fso.OpenTextFile(WScript.arguments(0), ForWriting, True)
If err.number <> 0 Then
    WScript.echo "Error 0x" & myHex(err.number,8) & ": " & err.source & " - " & err.description
    WScript.quit
End If
 
txtFile.writeline "Products installed on the local system"
txtFile.writeline " "
txtFile.writeline " "
 
 
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objShell = WScript.CreateObject("WScript.Shell")
 
'--Set up the registry provider.
Set objReg = GetObject("winmgmts:\\" & strComputer & _
"\root\default:StdRegProv")
 
Set wiInstaller = CreateObject("WindowsInstaller.Installer")
 
'--Enumerate the "installer\products" key on HKCR
objReg.EnumKey HKCR, strKeyPath, arrSubKeys
 
For Each strSubKey In arrSubKeys
 
' Define the various registry paths
strProduct01 = "Installer\Products\" & strSubKey
strKeyPath02 = "Installer\Products\" & strSubKey & "\SourceList"
strKeyPath03 = "Installer\Products\" & strSubKey & "\SourceList\Media"
strInstallSource = "SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\" & strSubKey & "\InstallProperties\"
strInstallSource2 = "SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\" & strSubKey & "\patches\"
strInstallSource3 = "SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Patches"
strInstallSource5 = "SOFTWARE\Classes\Installer\Patches\"
strInstallSource6 = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\"
strInstallSource7 = "SOFTWARE\Microsoft\Microsoft SQL Server\"
strInstallSource8 = "SOFTWARE\Wow6432Node\Microsoft\Microsoft SQL Server\"
 
' Pull the intial values
objReg.GetStringValue HKCR, strProduct01, strNValue00, strRetValue00
objReg.GetStringValue HKCR, strKeyPath02, strNValue01, strRetValue01
objReg.GetStringValue HKCR, strKeyPath02, strNValue02, strRetValue02
strRetValNew02 = Mid(strRetValue02, 5)
objReg.GetStringValue HKCR, strKeyPath03, strNValue09, strRetValue09
strRetValue10 = strNewRTMSource & strRetValue09
objReg.GetStringValue HKLM, strInstallSource, strNValue03, strRetValNew03
objReg.GetStringValue HKLM, strInstallSource, strNValue04, strRetValNew04
objReg.GetStringValue HKLM, strInstallSource, strNValue05, strRetValNew05
objReg.GetStringValue HKLM, strInstallSource, strNValue06, strRetValNew06
objReg.GetStringValue HKLM, strInstallSource, strNValue07, strRetValNew07
objReg.GetStringValue HKLM, strInstallSource, strNValue10, strRetValNew10
objReg.GetStringValue HKLM, strInstallSource, strNValue12, strRetValNew12
objReg.GetStringValue HKLM, strInstallSource, strNValue13, strRetValNew13
objReg.GetStringValue HKLM, strInstallSource2, strNValue11, strRetValNew11
 
' Pull the Product Code from the Uninstall String
strProdCode = strRetValNew07
  ProdCodeLen = Len(strProdCode)
  ProdCodeLen = ProdCodeLen - 14
strRetValNew08 = Right(strProdCode, ProdCodeLen)
 
' Pull out path from LastUsedSource
strGetRealPath = strRetValue02
  GetRealPath = Len(strRetValue02)
strRealPath = Mid(strRetValue02, 5, GetRealPath)
 
' Identifie the string in the ProductName
If instr(1, strRetValue00, strSQLName, 1) Then
' Start the log output
    txtFile.writeline "================================================================================"
    txtFile.writeline "PRODUCT NAME   : " & strRetValue00
    txtFile.writeline "================================================================================"
    txtFile.writeline "  Product Code: " & strRetValNew08
    txtFile.writeline "  Version     : " & strRetValNew05
    txtFile.writeline "  Most Current Install Date: " & strRetValNew06
    txtFile.writeline "  Target Install Location: "  & strRetValNew13
    txtFile.writeline "  Registry Path: "
    txtFile.writeline "   HKEY_CLASSES_ROOT\" & strKeyPath02
    txtFile.writeline "     Package    : " & strRetValue01
    txtFile.writeline "  Install Source: " & strRetValue10
    txtFile.writeline "  LastUsedSource: " & strRetValue02
'   txtFile.writeline "Does this file on this path exist? " & strRetValNew02 & "\" & strRetValue01
    If fso.fileexists(strRetValNew02 & "\" & strRetValue01) Then
    txtFile.writeline  " "
        txtFile.writeline "    " & strRetValue01 & " exists on the LastUsedSource path, no actions needed."
    Else
        txtFile.writeline " "
        txtFile.writeline " !!!! " & strRetValue01 & " DOES NOT exist on the path in the path " & strRealPath & " !!!!"
        txtFile.writeline " "
        txtFile.writeline " Action needed, re-establish the path to " & strRealPath
' Placeholder for altering the LastUsedSource by adding source location and Forcing search of list
'        If strNewSource <> "" Then
'        txtFile.writeline "      New Install Source Path Added: " & strNewSource
'        wiInstaller.AddSource strRetValNew08, "", strNewSource
'        Else
'        If strNewRTMSource <> "" Then
'        wiInstaller.AddSource strRetValNew08, "", strNewRTMSource
'        txtFile.writeline "      Forcing SourceList Resolution For: " & strRetValNew08
'        wiInstaller.ForceSourceListResolution strRetValNew08, ""
'        End If
'        End If
    End If
        txtFile.writeline " "
        txtFile.writeline "Installer Cache File: " & strRetValNew04
    If fso.fileexists(strRetValNew04) Then
        txtFile.writeline " "
        txtFile.writeline "    Package exists in the Installer cache, no actions needed."
        txtFile.writeline "    Any missing packages will update automatically if needed assuming that"
        txtFile.writeline "    the LastUsedSource exists."
        txtFile.writeline " "
        txtFile.writeline "    Should you get errors about " & strRetValNew04 & " or " & strRealPath & strRetValue01 & " then you"
        txtFile.writeline "    may need to manually copy the file, if file exists replace the problem file, " 
        txtFile.writeline "    Copy and paste the following command line into an administrative command prompt:"
        txtFile.writeline " "
        txtFile.writeline "     Copy " & chr(34) & strRealPath  & strRetValue01 & chr(34) & " " &strRetValNew04
        txtFile.writeline " "
    ElseIf fso.fileexists(strRetValNew02 & "\" & strRetValue01) Then
              fso.CopyFile strRetValNew02 & "\" & strRetValue01, strRetValNew04
        If fso.fileexists(strRetValNew04) Then
          txtFile.writeline " "
          txtFile.writeline "     Missing cache file replaced by copying " & strRealPath  & strRetValue01 & " to " & strRetValNew04
          txtFile.writeline "     Previously missing package " & strRetValNew04 &  " now exists in the Installer cache."
          txtFile.writeline " "
        End If
    Else
        txtFile.writeline " "
        txtFile.writeline " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
        txtFile.writeline " !!!! " & strRetValNew04 & " DOES NOT exist in the Installer cache. !!!!"
        txtFile.writeline " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
        txtFile.writeline " "
        txtFile.writeline "     Action needed, recreate or re-establish path to the directory:"
        txtFile.writeline "       " & strRealPath & "then rerun this script to update installer cache and results"
        txtFile.writeline "     The path on the line above must exist at the root location to resolve"
        txtFile.writeline "     this problem with your msi/msp file not being found or corrupted,"
        txtFile.writeline "     In some cases you may need to manually copy the missing file or manually"
        txtFile.writeline "     replace the problem file overwriting it is exist: " 
        txtFile.writeline " "
        txtFile.writeline "     Copy " & chr(34) & strRealPath  & strRetValue01 & chr(34) & " " &strRetValNew04
        txtFile.writeline " "
        txtFile.writeline "     Replace the existing file if prompted to do so."
        txtFile.writeline " "
    End If
    txtFile.writeline " "
    txtFile.writeline strRetValue00 & " Patches Installed "
    txtFile.writeline "--------------------------------------------------------------------------------"
 
    err.clear
    objReg.EnumKey HKLM, strInstallSource2, arrSubKeys2
    uUpperBounds = UBound(arrSubKeys2,1)
     If err.number = 0  Then
        For Each strSubKey2 in arrSubKeys2
    '    WScript.echo "value = " & strSubKey2
 
strKeyPath04 = "Installer\Patches\" & strSubKey2 & "\SourceList"
 
     objReg.GetDWORDValue HKLM, strInstallSource2 & "\" & strSubKey2 & "\", strNValue16, strRetValue16
     objReg.GetStringValue HKCR, strKeyPath04, strNValue15, strRetValue15a
     objReg.GetStringValue HKCR, strKeyPath04, strNValue14, strRetValue14a
     objReg.GetStringValue HKCR, strKeyPath02, strNValue15, strRetValue15b
     objReg.GetStringValue HKCR, strKeyPath02, strNValue14, strRetValue14b
     objReg.GetStringValue HKLM, strInstallSource2 & "\" & strSubKey2 & "\", strNValue17, strRetValue17
     objReg.GetStringValue HKLM, strInstallSource2 & "\" & strSubKey2 & "\", strNValue18, strRetValue18
     objReg.GetStringValue HKLM, strInstallSource2 & "\" & strSubKey2 & "\", strNValue13, strRetValue13a
     objReg.GetStringValue HKLM, strInstallSource3 & "\" & strSubKey2 & "\", strNValue04, strRetValue04a
 
' Pull the URL from the MoreInfoURL String
strMoreInfoURL = strRetValue13a
  MoreInfoURLLen = Len(strMoreInfoURL)
strRetValue13b = Right(strMoreInfoURL, 42)
 
' Pull the URL from the LastUsedPath String
strLastUsedPath = strRetValue15a
  LastUsedPathLen = Len(strLastUsedPath)
  'LastUsedPathLen = LastUsedPathLen - 15
strRetValue15c = Mid(strLastUsedPath, 5)
 
      txtFile.writeline " Display Name:    " & strRetValue17 
      txtFile.writeline " KB Article URL:  " & strRetValue13b
      txtFile.writeline " Install Date:    " & strRetValue18 
              txtFile.writeline "   Uninstallable:   " & strRetValue16 
      txtfile.writeline " Patch Details: "
      txtFile.writeline "   HKEY_CLASSES_ROOT\Installer\Patches\" & strSubKey2
              txtFile.writeline "   PackageName:   " & strRetValue14a
' Determine if someone has modified the Uninstallable state from 0 to 1 allowing possible unexpected uninstalls
              txtFile.writeline "    Patch LastUsedSource: " & strRetValue15a 
              txtFile.writeline "   Installer Cache File Path:     " & strRetValue04a 
        txtFile.writeline "     Per " & strInstallSource3 & "\" & strSubKey2 & "\" & strNValue04
              mspFileName = (strRetValue15c  & strRetValue14a)
      If strRetValue14a <> "" Then
      If fso.fileexists(strRetValue04a) Then
        txtFile.writeline " "
        txtFile.writeline "    Package exists in the Installer cache, no actions needed."
        txtFile.writeline "    Package will update automatically if needed assuming that"
        txtFile.writeline "    the LastUsedSource exists."
        txtFile.writeline " "
        txtFile.writeline "    Should you get errors about " & strRetValue04a & " or " & strRetValue15c  & strRetValue14a & " then you"
        txtFile.writeline "    may need to manually copy missing files, if file exists replace the problem file, " 
        txtFile.writeline "    Copy and paste the following command line into an administrative command prompt."
        txtFile.writeline " "
        txtFile.writeline "     Copy " & chr(34) & strRetValue15c  & strRetValue14a & chr(34) & " " & strRetValue04a
        txtFile.writeline " "
      ElseIf fso.fileexists(mspFileName) Then
              fso.CopyFile mspFileName, strRetValue04a
          If fso.fileexists(strRetValue04a) Then
          txtFile.writeline " "
          txtFile.writeline " Missing cache file replaced by copying " & strRetValue15c  & strRetValue14a & " to " & strRetValue04a
          txtFile.writeline " Previously missing package " & strRetValNew04 &  " now exists in the Installer cache."
          txtFile.writeline " "
          End If
'        End If
      Else
        txtFile.writeline " "
        txtFile.writeline "!!!! " & strRetValue04a & " package DOES NOT exist in the Installer cache. !!!!"
        txtFile.writeline " "
        txtFile.writeline "     Action needed, recreate or re-establish path to the directory:"
        txtFile.writeline "       " & strRetValue15c & " then rerun this script to update installer cache and results"
        txtFile.writeline "     The path on the line above must exist at the root location to resolve"
        txtFile.writeline "     this problem with your msi/msp file not being found or corrupted,"
        txtFile.writeline "     In some cases you may need to manually copy missing files or manually"
        txtFile.writeline "     replace the problem file, " 
        txtFile.writeline " "
        txtFile.writeline "     Copy " & chr(34) & strRetValue15c  & strRetValue14a & chr(34) & " " & strRetValue04a
        txtFile.writeline " "
        txtFile.writeline "     Replace the existing file if prompted to do so."
        txtFile.writeline " "
        txtFile.writeline "     Use the following URL to assist with downloading the patch:"
        txtFile.writeline "      " & strRetValue13b
        txtFile.writeline " "
        txtFile.writeline " "
      End If
       Else
        txtFile.writeline " "
     End If
        next
     Else
        txtfile.writeline " "
        txtfile.Writeline "  No Patches Found"
        txtfile.writeline " "
    End If
 
    End If
 
 
Next
txtFile.Close
Set txtFile = Nothing
Set fso = Nothing

属性

文章编号: 969052 - 最后修改: 2013年10月22日 - 修订: 12.0
这篇文章中的信息适用于:
  • Microsoft SQL Server 2008 Developer
  • Microsoft SQL Server 2008 Enterprise
  • Microsoft SQL Server 2008 Enterprise Evaluation
  • Microsoft SQL Server 2008 Express
  • Microsoft SQL Server 2008 Express with Advanced Services
  • Microsoft SQL Server 2008 Standard
  • Microsoft SQL Server 2008 Standard Edition for Small Business
  • Microsoft SQL Server 2008 Web
  • Microsoft SQL Server 2008 Workgroup
  • Microsoft SQL Server 2008 R2 Datacenter
  • Microsoft SQL Server 2008 R2 Developer
  • Microsoft SQL Server 2008 R2 Enterprise
  • Microsoft SQL Server 2008 R2 Express
  • Microsoft SQL Server 2008 R2 Express with Advanced Services
  • Microsoft SQL Server 2008 R2 Standard
  • Microsoft SQL Server 2008 R2 Standard Edition for Small Business
  • Microsoft SQL Server 2008 R2 Web
  • Microsoft SQL Server 2008 R2 Workgroup
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL 2005 Server Enterprise
  • Microsoft SQL Server 2005 Enterprise Edition for Itanium Based Systems
  • Microsoft SQL Server 2005 Enterprise X64 Edition
  • Microsoft SQL Server 2005 Evaluation Edition
  • Microsoft SQL Server 2005 Express Edition
  • Microsoft SQL Server 2005 Express Edition with Advanced Services
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL Server 2005 Standard X64 Edition
  • Microsoft SQL 2005 Server Workgroup
  • Microsoft SQL Server 2005 Standard Edition for Itanium Based Systems
  • Microsoft SQL Server 2012 Developer
  • Microsoft SQL Server 2012 Enterprise
  • Microsoft SQL Server 2012 Express
  • Microsoft SQL Server 2012 Standard
  • Microsoft SQL Server 2012 Web
关键字:?
kbtshoot kbexpertiseinter kbprb kbsurveynew kbmt KB969052 KbMtzh
机器翻译
重要说明:本文是由 Microsoft 机器翻译软件进行的翻译并可能由 Microsoft 社区通过社区翻译机构(CTF)技术进行后期编辑,或可能是由人工进行的翻译。Microsoft 同时向您提供机器翻译、人工翻译及社区后期编辑的文章,以便对我们知识库中的所有文章以多种语言提供访问。翻译的文章可能存在词汇、句法和/或语法方面的错误。Microsoft 对由于内容的误译或客户对内容的使用所导致的任何不准确、错误或损失不承担责任。
点击这里察看该文章的英文版: 969052
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com