系统修复教程 | 从注册表清理到依赖包重装、D 盘迁移的完整实操记录

目录

  1. 概述与最终结果
  2. 问题诊断与根因分析
  3. 阶段一:系统文件修复 (SFC + DISM)
  4. 阶段二:注册表深度清理
  5. 阶段三:创建缺失的 Packages 文件夹
  6. 阶段四:暂存依赖包 (ProvisionedPackage)
  7. 阶段五:以管理员身份注册依赖包
  8. 阶段六:安装 Microsoft Store
  9. 阶段七:修复 Store 搜索功能
  10. 阶段八:固定 Store 到任务栏
  11. 阶段九:将安装目录迁移到 D 盘
  12. 阶段十:最终配置与验证
  13. 附录 A:错误代码速查表
  14. 附录 B:完整命令清单
  15. 附录 C:依赖包清单

概述与最终结果

本教程记录了在一台 Windows 10 (19045.6466) 电脑上,Microsoft Store 被彻底卸载删除后的完整恢复过程。恢复过程中遇到了 0x80070003(AppContainer 配置文件创建失败)、0x80073CF6(无法注册包)、0x80073CF3(依赖包缺失)等多个错误,最终通过 10 个阶段的系统级修复成功恢复。

最终恢复结果

项目 状态 详情
Microsoft Store ✅ 已安装 v12107.1001.15.0,正常运行
Microsoft.UI.Xaml.2.8 ✅ 已安装 v8.2501.31001.0 (x64 + x86)
Microsoft.UI.Xaml.2.4 ✅ 已安装 v2.42007.9001.0 (x64 + x86)
Microsoft.NET.Native.Framework.2.2 ✅ 已安装 v2.2.29512.0 (x64 + x86)
Microsoft.NET.Native.Runtime.2.2 ✅ 已安装 v2.2.28604.0 (x64 + x86)
Store 搜索 ✅ 已修复 开始菜单可搜索到 Store
任务栏固定 ✅ 已完成 开始菜单快捷方式已创建
安装目录 ✅ 已迁移 新应用安装到 D 盘
TEMP/TMP ✅ 已迁移 D:\User\AppData\Local\Temp

修复时间线

时间 事件
19:05 初始尝试 Add-AppxPackage -RegisterByFamilyName,遭遇 0x80070003 错误
19:27 深度诊断:发现注册表残留与 AppData 重定向到 D 盘
19:31 运行 SFC + DISM 系统修复,重启相关服务
19:35 使用 Add-AppxProvisionedPackage 暂存所有依赖包
19:49 综合修复:清理注册表 + 暂存依赖 + 安装 Store(但依赖未注册)
19:58 以 SYSTEM 权限创建缺失的 Packages 文件夹,DISM 暂存成功
20:01 以管理员身份从 AppXManifest.xml 注册所有依赖包,Store 成功启动
20:17 重置 Store 缓存,创建开始菜单快捷方式
20:22 创建 D 盘 WindowsApps 文件夹,设置 StoragePolicy
20:24 最终配置:迁移 TEMP 到 D 盘,重新注册 Store,验证完成

问题诊断与根因分析

2.1 症状描述

Microsoft Store 被彻底卸载删除后,尝试通过常规方法重装时,所有 Add-AppxPackage 命令均失败,报错 0x80073CF60x80070003。Store 无法在开始菜单搜索中找到,也无法通过 wingetGet-AppxPackage 检测到。

2.2 错误代码解析

错误代码 含义 触发场景
0x80073CF6 无法注册包 Add-AppxPackage 安装任何 AppX 包时
0x80070003 系统找不到指定的路径 Windows 尝试为包创建 AppContainer 配置文件时
0x80073CF3 包依赖验证失败 安装 Store 时缺少 .NET Native Framework 1.7
0x80073CF9 拒绝安装请求 使用 SYSTEM 账户尝试注册包时(不允许)
0x80070005 拒绝访问 尝试删除 TrustedInstaller 保护的 staged 包时

2.3 根因分析

❌ 根因 1:AppData 重定向到 D 盘

用户通过注册表将 AppDataLocal AppData 重定向到了 D 盘(D:\User\AppData\RoamingD:\User\AppData\Local),但 Windows 的 AppX 部署系统在为 UWP 包创建 AppContainer 配置文件时,无法在 D 盘路径下找到或创建所需的 Packages 文件夹。

注册表中的 Shell Folders 指向:

1
2
3
4
5
6
7
8
9
10
# 注册表 HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer
# Shell Folders
Local AppData = D:\User\AppData\Local
AppData = D:\User\AppData\Roaming



# User Shell Folders
Local AppData = d:\User\AppData\Local
AppData = d:\User\AppData\Roaming

❌ 根因 2:孤立的注册表条目

Store 被删除后,注册表中残留了多个旧版本的注册信息,包括 AppxAllUserStore 下的用户注册项、SystemAppDataPolicyCache 等位置。这些残留阻止了新版本的安装。

发现的孤立条目:

  • Microsoft.WindowsStore_11910.1002.513.0 — 用户注册项残留
  • Microsoft.WindowsStore_22603.1401.17.0 — 用户注册项残留
  • Microsoft.NET.Native.Framework.1.7_8wekyb3d8bbwe — Config 残留
  • Microsoft.NET.Native.Runtime.1.7_8wekyb3d8bbwe — Config 残留
  • Microsoft.WindowsStore_8wekyb3d8bbwe — SystemAppData + PolicyCache 残留

❌ 根因 3:Packages 文件夹缺失

由于 AppData 重定向,以下关键文件夹不存在,导致 AppContainer 配置文件创建失败:

  • D:\User\AppData\Local\Packages\Microsoft.NET.Native.Framework.2.2_8wekyb3d8bbwe
  • D:\User\AppData\Local\Packages\Microsoft.NET.Native.Runtime.2.2_8wekyb3d8bbwe
  • D:\User\AppData\Local\Packages\Microsoft.UI.Xaml.2.4_8wekyb3d8bbwe
  • D:\User\AppData\Local\Packages\Microsoft.UI.Xaml.2.8_8wekyb3d8bbwe
  • 以及 C 盘对应的 C:\Users\NP\AppData\Local\Packages\ 下的同名文件夹

2.4 修复策略总览

由于 Add-AppxPackage 在用户级别无法创建 AppContainer 配置文件,修复策略采用了 分层递进 的方式:

  1. 系统层面:先运行 SFC + DISM 修复系统文件
  2. 注册表层面:清理所有孤立条目,消除冲突
  3. 文件系统层面:以 SYSTEM 权限创建缺失的 Packages 文件夹
  4. 暂存层面:使用 Add-AppxProvisionedPackage 将依赖包暂存到系统
  5. 用户层面:以管理员身份从 manifest 注册包到当前用户
  6. 应用层面:安装 Store、修复搜索、固定任务栏
  7. 配置层面:迁移安装目录到 D 盘

阶段一:系统文件修复 (SFC + DISM)

ℹ️ 目的

在深入修复之前,先确保 Windows 系统文件完整性,排除系统文件损坏导致的部署失败。同时重启 AppX 相关服务以确保部署管道正常工作。

1.1 重启 AppX 相关服务

管理员身份 打开 PowerShell,执行以下命令重启 4 个关键服务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# 需要管理员权限

$services = @(
"ClipSvc", # 客户端许可证服务
"wuauserv", # Windows 更新服务
"AppXSvc", # AppX 部署服务
"InstallService" # Microsoft Store 安装服务
)

foreach ($svc in $services) {
$s = Get-Service $svc -ErrorAction SilentlyContinue
if ($s) {
if ($s.Status -eq 'Running') {
Stop-Service $svc -Force -ErrorAction SilentlyContinue
Start-Sleep -Seconds 2
}
Start-Service $svc -ErrorAction SilentlyContinue
Write-Host "$svc : $((Get-Service $svc).Status)"
}
}

1.2 运行 SFC 系统文件检查器

1
2
3
4
5

# 扫描并修复系统文件(可能需要几分钟)

sfc /scannow

1.3 运行 DISM 映像修复

1
2
3
4
5

# 修复 Windows 映像

DISM /Online /Cleanup-Image /RestoreHealth

✅ 预期结果

SFC 和 DISM 完成后,4 个服务均应处于 Running 状态。此步骤确保后续 AppX 部署操作有干净的系统环境。


阶段二:注册表深度清理

⚠️ 警告

以下操作涉及修改系统注册表,操作前建议先备份注册表。错误修改可能导致系统不稳定。

ℹ️ 目的

清理 Store 被删除后残留的注册表条目,包括用户级注册项、SystemAppData、PolicyCache 和 Config 中的孤立记录。这些残留会阻止新版本包的安装。

2.1 获取当前用户 SID

1
2
3
4
$currentUser = [System.Security.Principal.WindowsIdentity]::GetCurrent()
$userSid = $currentUser.User.Value
Write-Host "User SID: $userSid"

2.2 清理 AppxAllUserStore 中的孤立用户注册项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

# 清理用户级注册中的旧 Store 版本

$userStorePath = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\$userSid"
if (Test-Path $userStorePath) {
$userApps = Get-ChildItem $userStorePath -ErrorAction SilentlyContinue
foreach ($app in $userApps) {
if ($app.PSChildName -like "Microsoft.WindowsStore*") {
Write-Host "Removing: $($app.PSChildName)"
try {
Remove-Item -Path $app.PSPath -Recurse -Force -ErrorAction Stop
Write-Host " SUCCESS"
} catch {
# 如果权限不足,先夺取所有权再删除
$key = [Microsoft.Win32.Registry]::LocalMachine.OpenSubKey(
"SOFTWARE\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\$userSid\$($app.PSChildName)",
[Microsoft.Win32.RegistryKeyPermissionCheck]::ReadWriteSubTree,
[System.Security.AccessControl.RegistryRights]::TakeOwnership
)
$acl = $key.GetAccessControl()
$acl.SetOwner([System.Security.Principal.NTAccount]"Administrators")
$key.SetAccessControl($acl)
$key.Close()

$key2 = [Microsoft.Win32.Registry]::LocalMachine.OpenSubKey(
"SOFTWARE\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\$userSid\$($app.PSChildName)",
[Microsoft.Win32.RegistryKeyPermissionCheck]::ReadWriteSubTree,
[System.Security.AccessControl.RegistryRights]::ChangePermissions
)
$acl2 = $key2.GetAccessControl()
$rule = New-Object System.Security.AccessControl.RegistryAccessRule(
"Administrators", "FullControl", "ContainerInherit", "None", "Allow"
)
$acl2.AddAccessRule($rule)
$key2.SetAccessControl($acl2)
$key2.Close()

Remove-Item -Path $app.PSPath -Recurse -Force -ErrorAction Stop
Write-Host " SUCCESS (after ownership change)"
}
}
}
}

2.3 清理 Applications 注册表

1
2
3
4
5
6
7
8
9
10
$appsPath = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\Applications"
if (Test-Path $appsPath) {
$apps = Get-ChildItem $appsPath -ErrorAction SilentlyContinue
foreach ($app in $apps) {
if ($app.PSChildName -like "Microsoft.WindowsStore*") {
Remove-Item -Path $app.PSPath -Recurse -Force -ErrorAction SilentlyContinue
}
}
}

2.4 清理 Config 中的孤立框架注册

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 清理 Config 中的 NET Native 框架残留

$configPath = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\Config"
$configOrphans = @(
"Microsoft.NET.Native.Framework.1.7_8wekyb3d8bbwe",
"Microsoft.NET.Native.Runtime.1.7_8wekyb3d8bbwe",
"Microsoft.NET.Native.Framework.2.2_8wekyb3d8bbwe",
"Microsoft.NET.Native.Runtime.2.2_8wekyb3d8bbwe"
)
foreach ($orphan in $configOrphans) {
$path = "$configPath\$orphan"
if (Test-Path $path) {
Remove-Item -Path $path -Recurse -Force -ErrorAction SilentlyContinue
Write-Host "Removed Config: $orphan"
}
}

2.5 清理 SystemAppData 和 PolicyCache

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# 清理 SystemAppData

$sysAppDataPath = "HKCU:\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\AppModel\SystemAppData"
if (Test-Path $sysAppDataPath) {
Get-ChildItem $sysAppDataPath -ErrorAction SilentlyContinue | Where-Object {
$_.PSChildName -like "*WindowsStore*" -or $_.PSChildName -like "*NET.Native*"
} | ForEach-Object {
Remove-Item -Path $_.PSPath -Recurse -Force -ErrorAction SilentlyContinue
}
}

# 清理 PolicyCache

$policyCachePath = "HKCU:\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\AppModel\PolicyCache"
if (Test-Path $policyCachePath) {
Get-ChildItem $policyCachePath -ErrorAction SilentlyContinue | Where-Object {
$_.PSChildName -like "*WindowsStore*"
} | ForEach-Object {
Remove-Item -Path $_.PSPath -Recurse -Force -ErrorAction SilentlyContinue
}
}

2.6 清理孤立的包数据文件夹

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 清理 D 盘和 C 盘的孤立 Packages 文件夹

$pkgPaths = @(
"D:\User\AppData\Local\Packages",
"C:\Users\NP\AppData\Local\Packages"
)

foreach ($pkgBasePath in $pkgPaths) {
if (Test-Path $pkgBasePath) {
Get-ChildItem $pkgBasePath -Directory -ErrorAction SilentlyContinue | Where-Object {
$_.Name -like "*WindowsStore*" -or
$_.Name -like "*UI.Xaml.2.8*" -or
$_.Name -like "*NET.Native.Framework*" -or
$_.Name -like "*NET.Native.Runtime*"
} | ForEach-Object {
Remove-Item -Path $_.FullName -Recurse -Force -ErrorAction SilentlyContinue
}
}
}

✅ 本阶段清理结果

  • 用户注册项:删除 2 个旧版本 ✅
  • Config 残留:删除 4 个框架条目 ✅
  • SystemAppData:删除 1 个 ✅
  • PolicyCache:删除 1 个 ✅

阶段三:创建缺失的 Packages 文件夹

ℹ️ 目的

这是解决 0x80070003(AppContainer 配置文件创建失败)的 关键步骤。由于 AppData 重定向到 D 盘,Windows 无法自动在 D 盘路径下创建 Packages 文件夹,需要手动创建。

⚠️ 重要说明

此步骤在实际操作中是以 SYSTEM 权限(通过 PsExec 或计划任务)执行的,因为普通管理员权限在某些情况下仍然无法创建这些受保护的文件夹。如果以管理员权限即可创建,则无需 SYSTEM 权限。

3.1 在 D 盘创建缺失的 Packages 文件夹

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# D 盘 Packages 路径(AppData 重定向目标)

$dPackagesPath = "D:\User\AppData\Local\Packages"

$missingFolders = @(
"Microsoft.NET.Native.Framework.2.2_8wekyb3d8bbwe",
"Microsoft.NET.Native.Runtime.2.2_8wekyb3d8bbwe",
"Microsoft.UI.Xaml.2.4_8wekyb3d8bbwe",
"Microsoft.UI.Xaml.2.8_8wekyb3d8bbwe"
)

foreach ($folder in $missingFolders) {
$fullPath = Join-Path $dPackagesPath $folder
if (-not (Test-Path $fullPath)) {
New-Item -Path $fullPath -ItemType Directory -Force | Out-Null
Write-Host "CREATED: $folder"
} else {
Write-Host "EXISTS: $folder"
}
}

3.2 在 C 盘同步创建

1
2
3
4
5
6
7
8
9
10
11
12
13

# C 盘 Packages 路径(默认路径,也需要存在)

$cPackagesPath = "C:\Users\NP\AppData\Local\Packages"

foreach ($folder in $missingFolders) {
$fullPath = Join-Path $cPackagesPath $folder
if (-not (Test-Path $fullPath)) {
New-Item -Path $fullPath -ItemType Directory -Force | Out-Null
Write-Host "CREATED (C:): $folder"
}
}

✅ 执行结果

D 盘创建 4 个文件夹 ✅,C 盘创建 4 个文件夹 ✅。这些文件夹创建后,Add-AppxPackage0x80070003 错误被消除。


阶段四:暂存依赖包 (ProvisionedPackage)

ℹ️ 目的

使用 Add-AppxProvisionedPackage(或 DISM 等效命令)将依赖包暂存到系统映像中。此方法绕过用户级 Add-AppxPackage 的 AppContainer 限制,将包文件部署到 C:\Program Files\WindowsApps,状态为 Staged

4.1 下载依赖包

从微软官方服务器或可信源下载以下 .appx 包文件,放到一个本地目录(例如 C:\StorePackages):

包名 架构 版本
Microsoft.NET.Native.Framework.1.7 x64 1.7.27413.0
Microsoft.NET.Native.Framework.1.7 x86 1.7.27413.0
Microsoft.NET.Native.Runtime.1.7 x64 1.7.27422.0
Microsoft.NET.Native.Runtime.1.7 x86 1.7.27422.0
Microsoft.NET.Native.Framework.2.2 x64 2.2.29512.0
Microsoft.NET.Native.Framework.2.2 x86 2.2.29512.0
Microsoft.NET.Native.Runtime.2.2 x64 2.2.28604.0
Microsoft.NET.Native.Runtime.2.2 x86 2.2.28604.0
Microsoft.UI.Xaml.2.8 x64 8.2501.31001.0
Microsoft.UI.Xaml.2.8 x86 8.2501.31001.0
Microsoft.VCLibs.140.00 x64 14.0.33519.0
Microsoft.VCLibs.140.00 x86 14.0.33519.0

4.2 安装顺序

⚠️ 安装顺序很重要

必须先安装 Framework,再安装 Runtime,最后安装 UI.Xaml。Store 的 appxbundle 最后安装。

4.3 使用 Add-AppxProvisionedPackage 暂存

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
$pkgDir = "C:\StorePackages"

# 按顺序安装依赖包

$depOrder = @(
"Microsoft.NET.Native.Framework.1.7_1.7.27413.0_x64__8wekyb3d8bbwe.appx",
"Microsoft.NET.Native.Framework.1.7_1.7.27413.0_x86__8wekyb3d8bbwe.appx",
"Microsoft.NET.Native.Runtime.1.7_1.7.27422.0_x64__8wekyb3d8bbwe.appx",
"Microsoft.NET.Native.Runtime.1.7_1.7.27422.0_x86__8wekyb3d8bbwe.appx",
"Microsoft.NET.Native.Framework.2.2_2.2.29512.0_x64__8wekyb3d8bbwe.appx",
"Microsoft.NET.Native.Framework.2.2_2.2.29512.0_x86__8wekyb3d8bbwe.appx",
"Microsoft.NET.Native.Runtime.2.2_2.2.28604.0_x64__8wekyb3d8bbwe.appx",
"Microsoft.NET.Native.Runtime.2.2_2.2.28604.0_x86__8wekyb3d8bbwe.appx",
"Microsoft.UI.Xaml.2.8_8.2501.31001.0_x64__8wekyb3d8bbwe.appx",
"Microsoft.UI.Xaml.2.8_8.2501.31001.0_x86__8wekyb3d8bbwe.appx"
)

foreach ($dep in $depOrder) {
$depPath = Join-Path $pkgDir $dep
if (Test-Path $depPath) {
try {
# 方法 1:Add-AppxPackage(会因 AppContainer 失败)
Add-AppxPackage -Path $depPath -ErrorAction Stop
} catch {
try {
# 方法 2:Add-AppxProvisionedPackage(暂存到系统)
Add-AppxProvisionedPackage -Online -PackagePath $depPath -SkipLicense -ErrorAction Stop | Out-Null
Write-Host "Staged: $dep"
} catch {
Write-Host "Failed: $dep - $($_.Exception.Message)"
}
}
}
}

也可以使用 DISM 命令等效操作:

1
2
3
4
5

# DISM 等效命令

DISM /Online /Add-ProvisionedAppxPackage /PackagePath:"C:\StorePackages\Microsoft.NET.Native.Framework.2.2_2.2.29512.0_x64__8wekyb3d8bbwe.appx" /SkipLicense

✅ 执行结果

10 个依赖包全部通过 Add-AppxProvisionedPackage 成功暂存到系统。状态为 Staged,包文件已部署到 C:\Program Files\WindowsApps,但尚未注册到用户。

⚠️ 注意

暂存后,Get-AppxPackage 仍然查不到这些包,因为它们只是 Staged 状态,还需要在用户级别注册。


阶段五:以管理员身份注册依赖包

ℹ️ 目的

依赖包暂存到 C:\Program Files\WindowsApps 后,需要以 管理员身份(但不能是 SYSTEM 账户)从 AppXManifest.xml 注册到当前用户。SYSTEM 账户无法执行此操作(会报 0x80073CF9)。

5.1 从 AppXManifest.xml 注册

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

# 需要以管理员身份运行(非 SYSTEM)

$packagesToRegister = @(
"Microsoft.NET.Native.Framework.2.2_2.2.29512.0_x64__8wekyb3d8bbwe",
"Microsoft.NET.Native.Framework.2.2_2.2.29512.0_x86__8wekyb3d8bbwe",
"Microsoft.NET.Native.Runtime.2.2_2.2.28604.0_x64__8wekyb3d8bbwe",
"Microsoft.NET.Native.Runtime.2.2_2.2.28604.0_x86__8wekyb3d8bbwe",
"Microsoft.UI.Xaml.2.8_8.2501.31001.0_x64__8wekyb3d8bbwe",
"Microsoft.UI.Xaml.2.8_8.2501.31001.0_x86__8wekyb3d8bbwe",
"Microsoft.UI.Xaml.2.4_2.42007.9001.0_x64__8wekyb3d8bbwe",
"Microsoft.UI.Xaml.2.4_2.42007.9001.0_x86__8wekyb3d8bbwe"
)

foreach ($pkgName in $packagesToRegister) {
$manifestPath = "C:\Program Files\WindowsApps\$pkgName\AppXManifest.xml"
if (Test-Path $manifestPath) {
try {
Add-AppxPackage -Path $manifestPath -DisableDevelopmentMode -Register -ErrorAction Stop
Write-Host "SUCCESS: $pkgName"
} catch {
Write-Host "FAILED: $pkgName"
}
} else {
Write-Host "Manifest not found: $pkgName"
}
}

5.2 验证依赖包安装状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$deps = @(
"Microsoft.UI.Xaml.2.4",
"Microsoft.UI.Xaml.2.8",
"Microsoft.NET.Native.Framework.2.2",
"Microsoft.NET.Native.Runtime.2.2"
)

foreach ($dep in $deps) {
$pkg = Get-AppxPackage $dep -ErrorAction SilentlyContinue
if ($pkg) {
Write-Host "$dep : INSTALLED ($($pkg.Version))"
} else {
Write-Host "$dep : Not installed"
}
}

✅ 执行结果

8 个包全部注册成功 ✅ (8/8)。验证输出:

1
2
3
4
Microsoft.UI.Xaml.2.4 : INSTALLED (2.42007.9001.0)
Microsoft.UI.Xaml.2.8 : INSTALLED (8.2501.31001.0)
Microsoft.NET.Native.Framework.2.2 : INSTALLED (2.2.29512.0)
Microsoft.NET.Native.Runtime.2.2 : INSTALLED (2.2.28604.0)

❌ 常见错误:0x80073CF9

如果以 SYSTEM 账户(通过 PsExec -s 或计划任务以 SYSTEM 运行)执行注册,会报 0x80073CF9:「不允许使用本地系统帐户执行此操作」。必须以 管理员用户身份 运行。


阶段六:安装 Microsoft Store

ℹ️ 目的

依赖包注册成功后,安装 Microsoft Store 的 appxbundle 包。

6.1 使用 Add-AppxProvisionedPackage 安装 Store

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$storeBundle = "C:\StorePackages\Microsoft.WindowsStore_12107.1001.15.0_neutral_~_8wekyb3d8bbwe.appxbundle"

# 方法 1:Add-AppxPackage(可能因 AppContainer 失败)

try {
Add-AppxPackage -Path $storeBundle -ErrorAction Stop
Write-Host "SUCCESS via Add-AppxPackage"
} catch {
# 方法 2:Add-AppxProvisionedPackage
try {
Add-AppxProvisionedPackage -Online -PackagePath $storeBundle -SkipLicense -ErrorAction Stop | Out-Null
Write-Host "SUCCESS via Add-AppxProvisionedPackage"
} catch {
Write-Host "FAILED: $($_.Exception.Message)"
}
}

6.2 通过 RegisterByFamilyName 注册

1
2
3
4
5

# 如果 Store 包已暂存但未注册到用户,使用此命令

Add-AppxPackage -RegisterByFamilyName -MainPackage "Microsoft.WindowsStore_8wekyb3d8bbwe"

6.3 验证 Store 安装

1
2
3
4
5
6
7
8
9
$store = Get-AppxPackage Microsoft.WindowsStore -ErrorAction SilentlyContinue
if ($store) {
Write-Host "Microsoft Store INSTALLED!"
Write-Host " Version: $($store.Version)"
Write-Host " Status: $($store.Status)"
} else {
Write-Host "Microsoft Store NOT INSTALLED"
}

6.4 启动 Store

1
2
3
4
5
6
7
8
9
10
11
12
13

# 启动 Microsoft Store

Start-Process "shell:appsFolder\Microsoft.WindowsStore_8wekyb3d8bbwe!App"

# 等待并检查进程

Start-Sleep -Seconds 5
$proc = Get-Process -Name "WinStore*" -ErrorAction SilentlyContinue
if ($proc) {
Write-Host "Store is RUNNING! PID: $($proc.Id)"
}

✅ 执行结果

Microsoft Store v12107.1001.15.0 安装成功,状态 Ok,进程 PID: 4660 正在运行 ✅


阶段七:修复 Store 搜索功能

ℹ️ 目的

Store 安装后可能无法在开始菜单搜索中找到。需要创建开始菜单快捷方式并重启 Windows Search 服务。

7.1 创建开始菜单快捷方式

1
2
3
4
5
6
7
$shortcutPath = "$env:APPDATA\Microsoft\Windows\Start Menu\Programs\Microsoft Store.lnk"
$shell = New-Object -ComObject WScript.Shell
$shortcut = $shell.CreateShortcut($shortcutPath)
$shortcut.TargetPath = "shell:appsFolder\Microsoft.WindowsStore_8wekyb3d8bbwe!App"
$shortcut.Save()
Write-Host "Created shortcut: $shortcutPath"

7.2 重启 Windows Search 服务

1
2
3
4
5
Stop-Service -Name WSearch -Force -ErrorAction SilentlyContinue
Start-Sleep -Seconds 3
Start-Service -Name WSearch -ErrorAction SilentlyContinue
Write-Host "Windows Search restarted"

✅ 执行结果

开始菜单快捷方式创建成功,路径:%APPDATA%\Microsoft\Windows\Start Menu\Programs\Microsoft Store.lnk。重启搜索服务后,可在开始菜单搜索到 Microsoft Store。


阶段八:固定 Store 到任务栏

ℹ️ 目的

重置 Store 缓存以修复下载问题,并尝试将 Store 固定到任务栏。

8.1 清理 Store 缓存

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

# 关闭 Store 进程

Get-Process -Name "WinStore*" -ErrorAction SilentlyContinue | Stop-Process -Force
Get-Process -Name "ApplicationFrameHost" -ErrorAction SilentlyContinue | Stop-Process -Force
Start-Sleep -Seconds 2

# 清理缓存目录(D 盘和 C 盘都清理)

$cacheBases = @(
"D:\User\AppData\Local\Packages\Microsoft.WindowsStore_8wekyb3d8bbwe",
"C:\Users\NP\AppData\Local\Packages\Microsoft.WindowsStore_8wekyb3d8bbwe"
)
$cacheFolders = @("LocalCache", "AC\Temp", "AC\INetCache", "AC\PRICache", "AC\BackgroundTransferApi", "TempState")

foreach ($base in $cacheBases) {
if (Test-Path $base) {
foreach ($folder in $cacheFolders) {
$fullPath = Join-Path $base $folder
if (Test-Path $fullPath) {
Get-ChildItem $fullPath -Recurse -ErrorAction SilentlyContinue |
Remove-Item -Recurse -Force -ErrorAction SilentlyContinue
}
}
}
}

8.2 运行 wsreset 重置 Store

1
2
3
4
$p = Start-Process "wsreset.exe" -PassThru -WindowStyle Hidden
$p | Wait-Process -Timeout 15 -ErrorAction SilentlyContinue
Write-Host "wsreset completed (exit: $($p.ExitCode))"

8.3 尝试固定到任务栏

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$shellApp = New-Object -ComObject Shell.Application
$folder = $shellApp.NameSpace((Split-Path $shortcutPath))
$item = $folder.ParseName((Split-Path $shortcutPath -Leaf))

# 查找"固定到任务栏"动词并执行

$verbs = $item.Verbs()
foreach ($verb in $verbs) {
if ($verb.Name -like "*任务栏*" -or $verb.Name -like "*Pin*") {
$verb.DoIt()
Write-Host "PINNED: $($verb.Name)"
break
}
}

⚠️ 关于任务栏固定

在 Windows 10 某些版本中,PowerShell 通过 Shell Verbs 固定到任务栏的功能可能被禁用或被第三方安全软件拦截。如果自动固定失败,可以手动右键点击开始菜单中的 Store 快捷方式,选择「固定到任务栏」。


阶段九:将安装目录迁移到 D 盘

ℹ️ 目的

将 Microsoft Store 下载和安装应用的目录从 C 盘迁移到 D 盘,包括创建 D 盘 WindowsApps 文件夹、设置 StoragePolicy、迁移 TEMP 环境变量。

9.1 创建 D 盘 WindowsApps 文件夹

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$newWaPath = "D:\Program Files\WindowsApps"

# 创建目录

if (-not (Test-Path $newWaPath)) {
New-Item -Path $newWaPath -ItemType Directory -Force | Out-Null
}

# 从 C 盘 WindowsApps 复制 ACL 权限

$sourceAcl = Get-Acl "C:\Program Files\WindowsApps"
$newAcl = Get-Acl $newWaPath
$newAcl.SetSecurityDescriptorSddlForm($sourceAcl.Sddl)
Set-Acl -Path $newWaPath -AclObject $newAcl

# 设置隐藏属性(与 C 盘一致)

$item = Get-Item $newWaPath -Force
$item.Attributes = $item.Attributes -bor [System.IO.FileAttributes]::Hidden

ACL 权限说明 — 从 C 盘复制的 ACL 包含以下关键权限:

身份 权限
NT SERVICE\TrustedInstaller FullControl(所有者)
NT AUTHORITY\SYSTEM FullControl
BUILTIN\Administrators ReadAndExecute
BUILTIN\Users ReadAndExecute
NT AUTHORITY\RESTRICTED ReadAndExecute
ALL APPLICATION PACKAGES (SID) ReadAndExecute

9.2 设置 StoragePolicy(新应用安装到 D 盘)

1
2
3
4
5
6
7
$storagePath = "HKCU:\Software\Microsoft\Windows\CurrentVersion\StorageSense\Parameters\StoragePolicy"

# 2048 = 新应用安装位置 (0=C盘, 1=D盘)

Set-ItemProperty -Path $storagePath -Name "2048" -Value 1 -Type DWord
Write-Host "StoragePolicy 2048 = 1 (D: drive for new apps)"

9.3 迁移 TEMP/TMP 到 D 盘

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

# 创建 D 盘 Temp 目录

$dTempPath = "D:\User\AppData\Local\Temp"
if (-not (Test-Path $dTempPath)) {
New-Item -Path $dTempPath -ItemType Directory -Force | Out-Null
}

# 修改系统环境变量

$sysEnv = "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
Set-ItemProperty -Path $sysEnv -Name "TEMP" -Value $dTempPath -Type ExpandString
Set-ItemProperty -Path $sysEnv -Name "TMP" -Value $dTempPath -Type ExpandString

# 修改用户环境变量

$userEnv = "HKCU:\Environment"
Set-ItemProperty -Path $userEnv -Name "TEMP" -Value $dTempPath -Type ExpandString
Set-ItemProperty -Path $userEnv -Name "TMP" -Value $dTempPath -Type ExpandString

# 广播环境变量更改通知

$sig = @"
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern IntPtr SendMessageTimeout(IntPtr hWnd, uint Msg, IntPtr wParam, string lParam, uint fuFlags, uint uTimeout, out IntPtr lpdwResult);
"@
Add-Type -MemberDefinition $sig -Name "Win32SendMessageTimeout" -Namespace "NativeMethods"
$HWND_BROADCAST = [IntPtr]0xffff
$WM_SETTINGCHANGE = 0x1A
$result = [IntPtr]::Zero
[NativeMethods.Win32SendMessageTimeout]::SendMessageTimeout(
$HWND_BROADCAST, $WM_SETTINGCHANGE, [IntPtr]::Zero, "Environment", 2, 5000, [ref]$result
) | Out-Null

9.4 确保 Store 下载缓存在 D 盘

1
2
3
4
5
6
7
8
$storePkgPath = "D:\User\AppData\Local\Packages\Microsoft.WindowsStore_8wekyb3d8bbwe"
$dlCachePath = Join-Path $storePkgPath "LocalCache\Microsoft\WindowsStore\Downloads"

if (-not (Test-Path $dlCachePath)) {
New-Item -Path $dlCachePath -ItemType Directory -Force | Out-Null
Write-Host "Created download cache: $dlCachePath"
}

9.5 手动迁移已安装应用到 D 盘

已安装在 C 盘的应用可以通过 Windows 设置手动迁移:

路径:设置 > 应用 > 已安装的应用 > 选择应用 > 移动 > 选择 D 盘

以下应用支持迁移:

  • 903DB504.SDK
  • Microsoft.BingSearch
  • Microsoft.DesktopAppInstaller
  • Microsoft.LanguageExperiencePack zh-CN
  • Microsoft.WindowsStore
  • Microsoft.Winget.Fonts.Source
  • Microsoft.Winget.Source
  • NVIDIACorp.NVIDIAControlPanel
  • OpenAI.Codex

✅ 执行结果

  • D:\Program Files\WindowsApps 文件夹创建 ✅
  • ACL 权限从 C 盘复制 ✅
  • StoragePolicy 2048 = 1 ✅
  • 系统/用户 TEMP/TMP 迁移到 D 盘 ✅
  • Store 下载缓存在 D 盘 ✅

阶段十:最终配置与验证

ℹ️ 目的

启动所有必要服务、重新注册 Store、运行 wsreset,并验证所有配置是否正确。

10.1 启动必要服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$services = @(
"BITS", # 后台智能传输服务(下载必需)
"wuauserv", # Windows 更新
"AppXSvc", # AppX 部署
"InstallService", # Store 安装
"LicenseManager", # 许可证管理
"StateRepository" # 状态存储库
)

foreach ($svc in $services) {
$s = Get-Service $svc -ErrorAction SilentlyContinue
if ($s -and $s.Status -ne 'Running') {
Start-Service $svc -ErrorAction SilentlyContinue
}
}

10.2 重新注册 Store

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

# 关闭 Store

Get-Process -Name "WinStore*" -ErrorAction SilentlyContinue | Stop-Process -Force
Start-Sleep -Seconds 2

# 从 manifest 重新注册

$store = Get-AppxPackage Microsoft.WindowsStore -ErrorAction SilentlyContinue
if ($store) {
$manifestPath = Join-Path $store.InstallLocation "AppXManifest.xml"
Add-AppxPackage -Path $manifestPath -DisableDevelopmentMode -Register
Write-Host "Re-registered: $($store.PackageFullName)"
}

# 运行 wsreset

$p = Start-Process "wsreset.exe" -PassThru -WindowStyle Hidden
$p | Wait-Process -Timeout 10 -ErrorAction SilentlyContinue

# 启动 Store

Start-Process "shell:appsFolder\Microsoft.WindowsStore_8wekyb3d8bbwe!App"

10.3 最终验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

# === 验证清单 ===

# 1. Store 安装状态

Get-AppxPackage Microsoft.WindowsStore | Select Name, Version, Status

# 结果: Microsoft.WindowsStore, 12107.1001.15.0, Ok

# 2. D 盘 WindowsApps

Test-Path "D:\Program Files\WindowsApps"

# 结果: True

# 3. StoragePolicy

(Get-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\StorageSense\Parameters\StoragePolicy" -Name "2048").'2048'

# 结果: 1 (D盘)

# 4. TEMP 路径

$env:TEMP

# 结果: D:\User\AppData\Local\Temp

# 5. Store 缓存位置

Test-Path "D:\User\AppData\Local\Packages\Microsoft.WindowsStore_8wekyb3d8bbwe"

# 结果: True

# 6. Store 进程

Get-Process -Name "WinStore*"

# 结果: PID 4660 运行中

✅ 全部验证通过

所有 6 项验证均通过,Microsoft Store 已完全恢复并配置为使用 D 盘。


附录 A:错误代码速查表

错误代码 含义 根因 解决方案
0x80073CF6 无法注册包 AppContainer 配置文件创建失败 创建缺失的 Packages 文件夹(阶段三)
0x80070003 系统找不到指定的路径 AppData 重定向到 D 盘,Packages 文件夹不存在 手动创建 D 盘和 C 盘的 Packages 文件夹
0x80073CF3 包依赖验证失败 缺少 .NET Native Framework 等依赖 先安装所有依赖包再安装 Store
0x80073CF9 拒绝安装请求 使用 SYSTEM 账户注册包 改用管理员用户身份注册(非 SYSTEM)
0x80070005 拒绝访问 尝试删除 TrustedInstaller 保护的包 使用 Add-AppxProvisionedPackage 暂存替代删除
0x80070003 (DISM 1168) 找不到元素 DISM 无法找到 appxbundle 的 license 文件 使用 -SkipLicense 参数

附录 B:完整命令清单

检查与诊断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 检查 Store 是否已安装

Get-AppxPackage Microsoft.WindowsStore

# 检查所有依赖包

Get-AppxPackage -AllUsers | Where-Object { $_.Name -like "*NET.Native*" -or $_.Name -like "*UI.Xaml*" }

# 检查注册表残留

Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\Config" | Where-Object { $_.PSChildName -like "*WindowsStore*" }

# 检查 AppData 重定向

Get-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"

# 检查事件日志中的 AppX 错误

Get-WinEvent -LogName "Microsoft-Windows-AppXDeploymentServer/Operational" -MaxEvents 10

安装与注册

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 暂存包到系统(不需要用户级 Packages 文件夹)

Add-AppxProvisionedPackage -Online -PackagePath "path\to\package.appx" -SkipLicense

# 从 manifest 注册到用户(需要管理员,非 SYSTEM)

Add-AppxPackage -Path "C:\Program Files\WindowsApps\PackageName\AppXManifest.xml" -DisableDevelopmentMode -Register

# 通过 FamilyName 注册 Store

Add-AppxPackage -RegisterByFamilyName -MainPackage "Microsoft.WindowsStore_8wekyb3d8bbwe"

# 启动 Store

Start-Process "shell:appsFolder\Microsoft.WindowsStore_8wekyb3d8bbwe!App"

# 重置 Store 缓存

wsreset.exe

D 盘配置

1
2
3
4
5
6
7
8
9
10
11
12
13

# 设置新应用安装到 D 盘

Set-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\StorageSense\Parameters\StoragePolicy" -Name "2048" -Value 1 -Type DWord

# 设置系统 TEMP

Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" -Name "TEMP" -Value "D:\User\AppData\Local\Temp" -Type ExpandString

# 设置用户 TEMP

Set-ItemProperty -Path "HKCU:\Environment" -Name "TEMP" -Value "D:\User\AppData\Local\Temp" -Type ExpandString


附录 C:依赖包清单

Microsoft Store 及其依赖包的完整清单(按安装顺序排列):

序号 包名 架构 版本 安装方式
1 Microsoft.NET.Native.Framework.1.7 x64 1.7.27413.0 ProvisionedPackage
2 Microsoft.NET.Native.Framework.1.7 x86 1.7.27413.0 ProvisionedPackage
3 Microsoft.NET.Native.Runtime.1.7 x64 1.7.27422.0 ProvisionedPackage
4 Microsoft.NET.Native.Runtime.1.7 x86 1.7.27422.0 ProvisionedPackage
5 Microsoft.NET.Native.Framework.2.2 x64 2.2.29512.0 ProvisionedPackage
6 Microsoft.NET.Native.Framework.2.2 x86 2.2.29512.0 ProvisionedPackage
7 Microsoft.NET.Native.Runtime.2.2 x64 2.2.28604.0 ProvisionedPackage
8 Microsoft.NET.Native.Runtime.2.2 x86 2.2.28604.0 ProvisionedPackage
9 Microsoft.UI.Xaml.2.8 x64 8.2501.31001.0 ProvisionedPackage
10 Microsoft.UI.Xaml.2.8 x86 8.2501.31001.0 ProvisionedPackage
11 Microsoft.UI.Xaml.2.4 x64 2.42007.9001.0 Register from manifest
12 Microsoft.UI.Xaml.2.4 x86 2.42007.9001.0 Register from manifest
13 Microsoft.WindowsStore x64 12107.1001.15.0 ProvisionedPackage + Register

ℹ️ 关于 VCLibs

Microsoft.VCLibs.140.00 (v14.0.33519.0) 在系统中已预装,无需额外安装。但如果你的系统中缺少此包,也需要按相同方式暂存和注册。


关键经验总结

1. AppData 重定向是 AppContainer 错误的隐藏根因

AppData 通过注册表重定向到非默认路径时,Windows 的 AppX 部署系统可能无法在目标路径创建 Packages 文件夹,导致所有 Add-AppxPackage 操作失败并报 0x80070003。解决方案是手动创建这些文件夹。

2. Add-AppxProvisionedPackage 是绕过 AppContainer 限制的关键

Add-AppxPackage 因 AppContainer 失败时,Add-AppxProvisionedPackage 可以将包暂存到系统映像(Staged 状态),不依赖用户级 Packages 文件夹。之后再以管理员身份从 AppXManifest.xml 注册即可。

3. SYSTEM 账户不能注册 AppX 包

使用 PsExec -s 或计划任务以 SYSTEM 身份运行 Add-AppxPackage -Register 会报 0x80073CF9。必须以 管理员用户身份(如 NP 用户)运行注册命令。

4. 注册表残留必须彻底清理

Store 被删除后,AppxAllUserStoreSystemAppDataPolicyCacheConfig 等多个注册表位置会残留旧版本条目。这些残留会导致新版本安装冲突,必须逐一清理。

5. D 盘迁移需要多层面配合

将 Store 安装目录迁移到 D 盘不仅仅是修改 StoragePolicy,还需要:创建 D 盘 WindowsApps 文件夹并复制 ACL 权限、迁移 TEMP/TMP 环境变量、确保 Store 缓存在 D 盘路径。缺少任何一步都可能导致下载失败。


本教程基于实际修复操作编写,系统环境为 Windows 10 (19045.6466)。操作涉及系统注册表和权限修改,请确保在执行前备份重要数据。