本文介绍如何解决在 Windows 或 Windows Server 就地升级的“进程驱动程序迁移”作期间出现“0x80070003”错误的问题。
症状
尝试将基于 Windows Server 的计算机或基于 Windows 客户端的计算机升级到较新版本的作系统( 就地升级),升级过程将失败。 发生此错误时,升级过程将生成“0x80070003”错误。
原因
WinSxS 系统文件夹中服务堆栈文件夹的内容丢失或损坏。 如果没有此文件夹中的信息,DISM 和升级引擎将无法迁移驱动程序。 升级失败并生成“0x80070003”错误。
决议
重要
在执行任何升级作之前,请备份系统。
步骤 1:验证问题
若要收集有关此问题的其他信息,请检查相关日志。 可以使用文本编辑器(如记事本)查看日志文件。 使用 Find 命令(Ctrl+F)搜索特定字符串,如前所述。 下表列出了最有用的日志文件。 它们还会列出每个文件中可能提供有关错误的详细信息的字符串。
| 日志文件 | 位置 | Description |
|---|---|---|
| SetupAct.log | C:$WINDOWS.~BT\Sources\Panther | 此日志记录升级过程的早期阶段的设置活动。 |
| 升级引擎 (MOUPG) 日志例如以下文件: - setuperr.log - setupdiagresults.xml - 文件名以“MOSetup”或“MOU”开头的其他日志。 |
C:$WINDOWS.~BT\Sources\Panther | 这些日志显示高级升级决策和阶段转换。 |
| DISM.log | C:\Windows\Logs\DISM | 此日志提供 DISM(部署映像服务和管理)命令失败时的详细信息。 |
| CBS.log(基于组件的服务日志) | C:\Windows\Logs\CBS | Windows 使用CBS日志来跟踪维护操作,例如更新和升级。注意: 如果此文件很大,则使用备用文本编辑器(如记事本 ++)可能更易于管理。 |
| 日志文件 | 要搜索的字符串 |
|---|---|
| SetupAct.log | “0x80070003”或类似于以下字符串的文本: - “无法打开新会话:(DISM_{GUID})” - 操作失败:迁移的驱动程序进程。 错误:0x80070003” |
| MOUPG 日志 | 类似于以下字符串的文本: - MoSetupPlatform: 使用操作错误代码:[0x80070003] - “CDlpActionDriverMigrate::ExecuteRoutine: Result = 0x80070003” - “设置阶段更改:[SetupPhaseInstall] -> [SetupPhaseError]” |
| DISM.log | “0x80070003”或类似于“无法绑定联机服务堆栈 - CDISMOSServiceManager: get_ServicingStackDirectory(hr:0x80070003)”的文本 |
| CBS.log | 无法创建工作器会话或重复提及服务故障的字符串 |
此外,还可以手动检查损坏的服务堆栈文件夹。 在 C:\Windows\WinSxS 文件夹中,查找至少一个包含“serviceingstack”字符串的名称的文件夹。 例如,你可能会找到名称类似于以下字符串的文件夹:
- amd64_microsoft-windows-servicingstack_31bf3856ad364e35_10.0.26100.5074_none_a5532eb7772ad4c4
- amd64_microsoft-windows-servicingstack-inetsrv_31bf3856ad364e35_10.0.26100.5074_none_d120fd2616d820ec
- amd64_microsoft-windows-servicingstack-onecore_31bf3856ad364e35_10.0.26100.5074_none_da44c3c8cf2df25a
- x86_microsoft-windows-servicingstack_31bf3856ad364e35_10.0.26100.5074_none_49349333becd638e
- x86_microsoft-windows-servicingstack-inetsrv_31bf3856ad364e35_10.0.26100.5074_none_750261a25e7aafb6
- x86_microsoft-windows-servicingstack-onecore_31bf3856ad364e35_10.0.26100.5074_none_7e26284516d08124
此类文件夹不应为空。
步骤 2:从最新的 SSU 下载和提取文件
-
在受影响的计算机上,打开管理命令提示符窗口,然后运行以下命令:
reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\Version"命令输出确认计算机上的服务堆栈的当前版本。
-
在受影响的计算机上,创建一个临时文件夹(例如 C:\TemporaryFolder)。
-
从服务堆栈更新(SSU):常见问题解答下载适合您的 Windows 版本的最新服务堆栈更新(SSU)。
-
将 .msu 包中的更新文件提取到临时文件夹。 例如,在命令提示符处运行以下命令:
expand -F:* C:\<Path>\update.msu C:\TemporaryFolder注释
在此命令中, <Path> 表示 .msu 包的路径。
步骤 3:替换损坏的文件
注意
- 不要获取 WinSxS 文件夹或其子文件夹的所有权,也不会更改文件夹权限。
- 此过程使用
robocopy /B命令将 WinSxS 文件夹中的服务堆栈文件夹替换为下载的 SSU 中的服务堆栈文件夹。Robocopy /B保留文件和文件夹权限。
-
打开管理 PowerShell 窗口。 若要为 robocopy 操作定义一组变量,请按顺序运行以下命令:
$src = "C:\TemporaryFolder" $dst = "C:\Windows\WinSxS" $log = "C:\Repair\WinSxS_Repair.log" New-Item -ItemType Directory -Force -Path (Split-Path $log) | Out-Null注释
这些命令继续使用上一节中引入的 C:\TemporaryFolder 文件夹。 他们还引入了用于存储日志文件的 C:\Repair 文件夹。
-
若要查看项列表而不实际复制它们,请运行以下命令:
Get-ChildItem -Path $src -Directory -Force | ForEach-Object { & robocopy $_.FullName $dst /E /COPYALL /B /R:0 /W:0 /L /NFL /NDL /NP /NJH /NJS }注释
- 该
Get-ChildItem -Directorycmdlet 仅选择子文件夹。 因此,robocopy 操作会跳过根级文件,例如 mum 和 manifest 文件。 - 有关
Get-ChildItemcmdlet及其选项的详细信息,请参阅Get-ChildItem。 - 有关
robocopy命令及其开关的详细信息,请参阅 robocopy。
- 该
-
若要复制子文件夹并记录作,请运行以下命令:
Get-ChildItem -Path $src -Directory -Force | ForEach-Object { & robocopy $_.FullName $dst /E /COPYALL /B /R:0 /W:0 /LOG+:$log }作为上述步骤的替代方法,可以在管理命令提示符处运行以下命令:
for /d %i in (C:\TemporaryFolder\*) do robocopy "%i" "C:\Windows\WinSxS" /E /COPYALL /B /R:0 /W:0 -
复制完 SSU 文件后,请重试升级 Windows。
第三方信息免责声明
本文讨论的第三方产品由独立于微软的公司制造。 Microsoft对这些产品的性能或可靠性不作任何明示或暗示的保证。