如何恢复丢失的 Windows 安装程序缓存文件和解决 SQL Server 更新过程中出现的问题

重要说明:本文是由 Microsoft 机器翻译软件进行的翻译并可能由 Microsoft 社区通过社区翻译机构(CTF)技术进行后期编辑,或可能是由人工进行的翻译。Microsoft 同时向您提供机器翻译、人工翻译及社区后期编辑的文章,以便对我们知识库中的所有文章以多种语言提供访问。翻译的文章可能存在词汇、句法和/或语法方面的错误。Microsoft 对由于内容的误译或客户对内容的使用所导致的任何不准确、错误或损失不承担责任。

点击这里察看该文章的英文版: 969052
症状
本文中描述的过程提供了紧急止裂槽但并不永久修复。使用此紧急流程的客户应按照知识库文章中的说明验证使用Windows 安装程序缓存验证程序软件包,其 Windows 安装程序缓存 2667628.

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

设置 SQL Server 时,theWindows 安装程序会将重要文件存储在 Windows 安装程序缓存 (默认值为 C:\Windows\Installer)。这些文件是卸载和更新应用程序所必需的。因为它们是唯一无法台计算机之间复制缺少的文件。

Microsoft 建议为 SQL Server 安装您首先使用来验证当前安装了以下文章中介绍了修复过程 ︰

应从原始安装媒体中,运行修复,使用以下命令行 ︰

setup.exe /ACTION = 修复 /INDICATEPROGRESS = TRUE

首先,修复公共的共享的组件和功能,然后重复命令修复安装的实例。在修复过程中,安装程序对话框中消失。只要进度窗口不会显示错误,修复过程将继续如预期的那样。

注意:下面的错误消息可在事件日志中或位于某个中的以下文件夹,安装程序日志中找到以短信形式,它们表明您应修复受影响的实例正在进行更多操作 ︰
  • 对于 SQL Server 2008年和 SQL Server 2008 r2:
    C:\Program 该 SQL Server\100\Setup 引导
  • 对于 SQL Server 2012年:
    C:\Program Files\Microsoft SQL Server\110\Setup Bootstrap
SQL 2005 年 (所有分支)
产品版本缺少安装程序程序包 (MSI) 时出现错误信息缺少安装缓存包 (MSP) 时出现错误信息
SQL 2005 Server
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"语言菜单。</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"语言菜单。</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 错误 ︰ 1714 不能删除旧版本的 Microsoft SQL Server 2012年安装 (英语)。与技术支持组联系。
<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>
注意:某些情况下 SQL Server 2012年中,RTM 媒体可能注册不正确。当您卸载累积更新或服务包在这些情况下,安装程序可能会提示您输入 RTM 媒体。若要变通解决此问题,请提供修补程序拆卸过程 RTM 介质路径。
原因
Windows 安装程序数据库文件 (.msi) 或 Windows 安装程序修补程序文件 (.msp) 丢失时从 Windows 安装程序缓存,则可能会出现这些问题。Windows 安装程序缓存文件位于以下文件夹中 ︰
%windir%\installer
通过使用 Windows 安装程序安装产品时,去除原始.msi 文件的版本存储在 Windows 安装程序缓存中。对产品例如修补程序是累积性更新、 服务包安装程序,每次更新还在 Windows 安装程序缓存中存储的有关.msp 或.msi 文件

修补程序是累积性更新、 服务包安装程序,如产品对任何未来更新依赖于 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。如果从一个文件夹或网络共享上,行开头的n;项目,"LastUsedSource"进行安装后跟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 安装程序缓存所需的结构。而异的实际位置,例如 service pack 的单个修补程序可能需要被提取到多个位置。每个已安装的产品包括一个部分,包含"已安装的修补程序"的以下信息 ︰
    Display name:KB Article URL:  http://support.microsoft.com/?kbid=<value>Patch LastUsedSource: 

    "知识库文章 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 1635This 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 博客 ︰有关修补过程的详细信息,请参阅下面的 MSDN 博客 ︰有关如何确保您缓存正确平台的修补程序文件的详细信息,请参阅以下 MSDN 博客 ︰为什么使用 Windows 安装程序的任何产品可能会遇到此问题的详细信息,请参阅下面的 MSDN 博客 ︰有关安装程序日志文件中显示的错误消息的不同组的详细信息的更多信息,请参阅下面的 MSDN 博客 ︰

有关产品或工具,自动检查此条件和产品版本的 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, arrSubKeys2Dim objFSO, objShell, objFile, objReg, objConn, objExecDim strComputer, strKeyPath, strNewSourceDim strWorkstationName, strDBPath, strSubKey, strSubKey2(), strKeyPath02,  strRetValue00Dim 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_ROOTConst HKLM = &H80000002 'HKEY_LOCAL_MACHINEConst ForReading = 1, ForWriting = 2, ForAppEnding = 8 ' Checking for Elevated permissionsDim oShell, oExecszStdOutszStdOut = ""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 IfLoop 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 valuesstrComputer = "."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.quitEnd If '--Setup the output fileSet 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.quitEnd 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 HKCRobjReg.EnumKey HKCR, strKeyPath, arrSubKeys For Each strSubKey In arrSubKeys ' Define the various registry pathsstrProduct01 = "Installer\Products\" & strSubKeystrKeyPath02 = "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 valuesobjReg.GetStringValue HKCR, strProduct01, strNValue00, strRetValue00objReg.GetStringValue HKCR, strKeyPath02, strNValue01, strRetValue01objReg.GetStringValue HKCR, strKeyPath02, strNValue02, strRetValue02strRetValNew02 = Mid(strRetValue02, 5)objReg.GetStringValue HKCR, strKeyPath03, strNValue09, strRetValue09strRetValue10 = strNewRTMSource & strRetValue09objReg.GetStringValue HKLM, strInstallSource, strNValue03, strRetValNew03objReg.GetStringValue HKLM, strInstallSource, strNValue04, strRetValNew04objReg.GetStringValue HKLM, strInstallSource, strNValue05, strRetValNew05objReg.GetStringValue HKLM, strInstallSource, strNValue06, strRetValNew06objReg.GetStringValue HKLM, strInstallSource, strNValue07, strRetValNew07objReg.GetStringValue HKLM, strInstallSource, strNValue10, strRetValNew10objReg.GetStringValue HKLM, strInstallSource, strNValue12, strRetValNew12objReg.GetStringValue HKLM, strInstallSource, strNValue13, strRetValNew13objReg.GetStringValue HKLM, strInstallSource2, strNValue11, strRetValNew11 ' Pull the Product Code from the Uninstall StringstrProdCode = strRetValNew07  ProdCodeLen = Len(strProdCode)  ProdCodeLen = ProdCodeLen - 14strRetValNew08 = Right(strProdCode, ProdCodeLen) ' Pull out path from LastUsedSourcestrGetRealPath = strRetValue02  GetRealPath = Len(strRetValue02)strRealPath = Mid(strRetValue02, 5, GetRealPath) ' Identifie the string in the ProductNameIf 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 StringstrMoreInfoURL = strRetValue13a  MoreInfoURLLen = Len(strMoreInfoURL)strRetValue13b = Right(strMoreInfoURL, 42) ' Pull the URL from the LastUsedPath StringstrLastUsedPath = strRetValue15a  LastUsedPathLen = Len(strLastUsedPath)  'LastUsedPathLen = LastUsedPathLen - 15strRetValue15c = 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  NexttxtFile.CloseSet txtFile = NothingSet fso = Nothing

警告:本文已自动翻译

內容

文章識別碼:969052 - 最後檢閱時間:04/10/2016 03:27:00 - 修訂: 17.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
意見反應