Office开启时弹出"Microsoft Office无法验证此应用程序的许可证"的解决办法

Eason3Blue/OfficeActiveRepair

问题描述

  1. Office已经通过如 KMS ,激活码等方式激活成功了
  2. 每次打开Office时会弹出Microsoft Office无法验证此应用程序的许可证的弹窗
  3. 进入Office的账户界面,显示Office已激活
  4. (可选) 进入注册表编辑器,找不到 HKEY_USERS\S-1-5-20

温馨提示

  1. 请千万慎重修改任何注册表内容,包括权限,这可能导致你的账户无法访问。
  2. 在你编辑注册表之前请先备份一份原始的注册表。

解决方案

原理说明

弹出这个提示的真正原因就是因为Office无法访问NETWORK SERVICE这个安全主体。

解决方案

那我们从两个方面看问题:有没有能不能

有没有

  1. 打开注册表编辑器,步骤如下
  2. 按下Win+R
  3. 输入regedit
  4. 索引到HKEY_USERS\
  5. 逐项检查有无S-1-5-20这一项
注册表截图 6. 若不存在请继续往下看;若存在请跳转到 [能不能](#能不能)

不存在这一项,说明系统无法读取NETWORK SERVICE这一安全主体的NTUSER.dat,此时你通过以下代码尝试重新挂载,很可能是失败的。

1
reg load hkulS-1-5-20 C:\Windows\ServiceProfiles\NetworkService\NTUSER.DAT

也就是说原来的NTUSER.dat已经损坏了,那么现在我们尝试修复。

首先要搞清楚NTUSER.dat都负责着哪些功能:

点击我跳过

  1. 它是HKEY_CURRENT_USER的后端文件,它包含了用户所有**“个人化”**配置,比如:
    1. 桌面布局(图标位置、壁纸、主题、分辨率)
    2. 文件资源管理器行为(显示隐藏文件、排序方式)
    3. 输入法配置、语言栏设置
    4. 快捷方式、任务栏固定项目
    5. 文件关联(例如 .txt 打开方式)
    6. 网络驱动器映射
  2. 加载为用户登录会话的配置快照
  3. 保存用户凭据、应用 Token 与 COM 组件注册信息
  4. 应用沙盒隔离的根依据(UWP 与 MSIX)
  5. 权限与账户 SID 绑定(尤其与 S-1-5-21 / S-1-20 关系)
  6. UsrClass.dat联合作为“完整用户配置集”

NETWORK SERVICE作为一个安全主体,不存在任何个人化配置,也不会保存任何凭据,不会安装任何的UWP类应用,所特殊的只有它存储着S-1-5-20sid

所以,我们只需要用一份原始的、默认的NTUSER.dat来替换损坏的,并给新的设置好S-1-5-20sid即可。

那么具体的代码实现可以交给AI实现:

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
@echo off
title Office 激活修复工具 - 修复 NetworkService 注册表问题
color 0A
setlocal enabledelayedexpansion

:: =====================================================
:: 自动提权部分
:: =====================================================
:: 检查管理员权限
net session >nul 2>&1
if %errorLevel% neq 0 (
echo [提示] 当前未以管理员身份运行,正在尝试自动提权...
powershell -Command "Start-Process '%~f0' -Verb runAs"
exit /b
)

echo =====================================================
echo Office 激活修复工具 - NetworkService 修复
echo =====================================================
echo.

set "nsPath=%SystemRoot%\ServiceProfiles\NetworkService"
set "backupPath=%SystemRoot%\ServiceProfiles\NetworkService.backup"
set "timeTag=%date:~-4,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%"

:: =====================================================
:: 1. 停止可能占用的服务
:: =====================================================
echo [1] 停止 sppsvc 与 ClipSVC 服务...
net stop sppsvc >nul 2>&1
net stop ClipSVC >nul 2>&1
timeout /t 3 /nobreak >nul

:: =====================================================
:: 2. 检查并卸载残留注册表配置单元
:: =====================================================
reg query "HKU\S-1-5-20" >nul 2>&1
if %errorlevel% equ 0 (
echo [2] 检测到已加载的注册表配置单元,正在卸载...
reg unload "HKU\S-1-5-20" >nul 2>&1
if %errorlevel% neq 0 (
echo [警告] 无法卸载,可能被系统进程锁定。
echo 尝试继续修复。
)
)

:: =====================================================
:: 3. 备份原始 NTUSER.DAT
:: =====================================================
echo [3] 备份当前 NTUSER.DAT...
if exist "%nsPath%\NTUSER.DAT" (
if not exist "%backupPath%" mkdir "%backupPath%"
copy "%nsPath%\NTUSER.DAT" "%backupPath%\NTUSER.DAT.backup.%timeTag%" >nul
echo ✅ 已备份至 %backupPath%
) else (
echo ⚠ 未找到原始文件,将重新生成。
)

:: =====================================================
:: 4. 重建 NTUSER.DAT
:: =====================================================
echo [4] 正在重建 NetworkService 的 NTUSER.DAT...
set "sourceFound=0"
for %%s in (
"%SystemDrive%\Users\Default\NTUSER.DAT"
"%SystemRoot%\System32\config\systemprofile\NTUSER.DAT"
"%SystemRoot%\ServiceProfiles\LocalService\NTUSER.DAT"
) do (
if exist "%%s" if !sourceFound! equ 0 (
copy "%%s" "%nsPath%\NTUSER.DAT" /Y >nul
if !errorlevel! equ 0 (
set "sourceFound=1"
echo ✅ 使用模板: %%~s
)
)
)
if !sourceFound! equ 0 (
echo ⚠ 无可用模板,创建空文件...
type nul > "%nsPath%\NTUSER.DAT"
)

:: =====================================================
:: 5. 设置 NTUSER.DAT 文件权限
:: =====================================================
echo [5] 设置 NTUSER.DAT 文件权限...
icacls "%nsPath%\NTUSER.DAT" /inheritance:r >nul
icacls "%nsPath%\NTUSER.DAT" /grant:r "SYSTEM":F >nul
icacls "%nsPath%\NTUSER.DAT" /grant:r "NETWORK SERVICE":F >nul
icacls "%nsPath%\NTUSER.DAT" /grant:r "Administrators":F >nul
icacls "%nsPath%\NTUSER.DAT" /setowner "SYSTEM" >nul
echo ✅ 文件权限已修复

:: =====================================================
:: 6. 加载注册表配置单元并授予 ACL
:: =====================================================
echo [6] 加载注册表配置单元...
reg load "HKU\S-1-5-20" "%nsPath%\NTUSER.DAT" >nul 2>&1
if %errorlevel% neq 0 (
echo ❌ 注册表加载失败,可能被系统占用。
goto end
)
echo ✅ 注册表加载成功

echo [6.1] 初始化基本结构...
reg add "HKU\S-1-5-20\Software\Microsoft\Office" /f >nul
reg add "HKU\S-1-5-20\Software\Microsoft\Windows\CurrentVersion\Explorer" /f >nul
reg add "HKU\S-1-5-20\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /f >nul

echo [6.2] 正在授予注册表访问权限(通过 PowerShell)...
powershell -NoProfile -ExecutionPolicy Bypass -Command ^
"$key = Get-Item 'Registry::HKEY_USERS\\S-1-5-20';" ^
"$acl = $key.GetAccessControl();" ^
"$rules = @('NETWORK SERVICE','SYSTEM','Administrators');" ^
"foreach($r in $rules){" ^
" $rule = New-Object System.Security.AccessControl.RegistryAccessRule($r,'FullControl','ContainerInherit,ObjectInherit','None','Allow');" ^
" $acl.SetAccessRule($rule)" ^
"};" ^
"$key.SetAccessControl($acl)" >nul 2>&1

echo ✅ 已为注册表授予 NETWORK SERVICE 等完全访问权限

reg unload "HKU\S-1-5-20" >nul 2>&1
echo ✅ 注册表配置单元已卸载(权限写入生效)

:: =====================================================
:: 7. 重启相关服务
:: =====================================================
echo [7] 启动 sppsvc 与 ClipSVC 服务...
net start ClipSVC >nul 2>&1
net start sppsvc >nul 2>&1
echo ✅ 服务已重新启动

:: =====================================================
:: 8. Office 状态检查
:: =====================================================
echo [8] 检查 Office 激活状态(如有安装)...
if exist "%ProgramFiles%\Microsoft Office\Office16\OSPP.VBS" (
cscript //nologo "%ProgramFiles%\Microsoft Office\Office16\OSPP.VBS" /dstatus
) else if exist "%ProgramFiles(x86)%\Microsoft Office\Office16\OSPP.VBS" (
cscript //nologo "%ProgramFiles(x86)%\Microsoft Office\Office16\OSPP.VBS" /dstatus
) else (
echo ⚠ 未检测到 Office 安装路径,跳过检查。
)

:done
echo.
echo =====================================================
echo ✅ 修复完成,请重新启动计算机。
echo =====================================================
pause
exit /b

将以上脚本保存到.bat文件中,双击运行,给予管理员权限,稍等几分钟后,你的问题应该会被解决。

能不能

既然存在,就说明是Office是因为权限的问题导致无法访问NETWORK SERVICE的了。

  1. 打开注册表编辑器,并索引到HKEY_USERS\方法同前
  2. 右键S-1-5-20,选择权限(P)
  3. 点击添加(D)...
  4. 输入NETWORK SERVICE并确认
  5. 组和用户名中选择NETWORK SERVICE
  6. 在下面的NETWORK SERVICE 的权限(P)中在允许那一栏勾选完全控制读取
  7. 确认

现在你的问题应该已经被解决了


Office开启时弹出"Microsoft Office无法验证此应用程序的许可证"的解决办法
https://www.insaua.com/articles/office-active-repair/
作者
Eason3Blue
发布于
2025年11月7日
许可协议