Eason3Blue/OfficeActiveRepair
问题描述
Office已经通过如 KMS ,激活码等方式激活成功了
每次打开Office时会弹出Microsoft Office无法验证此应用程序的许可证的弹窗
进入Office的账户界面,显示Office已激活
(可选) 进入注册表编辑器,找不到 HKEY_USERS\S-1-5-20
温馨提示
请千万慎重修改任何注册表内容,包括权限,这可能导致你的账户无法访问。
在你编辑注册表之前请先备份一份原始的注册表。
解决方案 原理说明 弹出这个提示的真正原因就是因为Office无法访问 NETWORK SERVICE这个安全主体。
解决方案 那我们从两个方面看问题:有没有 和能不能
有没有
打开注册表编辑器,步骤如下
按下Win +R
输入regedit
索引到HKEY_USERS\
逐项检查有无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都负责着哪些功能:
点击我跳过
它是HKEY_CURRENT_USER的后端文件,它包含了用户所有**“个人化”**配置,比如:
桌面布局(图标位置、壁纸、主题、分辨率)
文件资源管理器行为(显示隐藏文件、排序方式)
输入法配置、语言栏设置
快捷方式、任务栏固定项目
文件关联(例如 .txt 打开方式)
网络驱动器映射
加载为用户登录会话的配置快照
保存用户凭据、应用 Token 与 COM 组件注册信息
应用沙盒隔离的根依据(UWP 与 MSIX)
权限与账户 SID 绑定(尤其与 S-1-5-21 / S-1-20 关系)
与UsrClass.dat联合作为“完整用户配置集”
NETWORK SERVICE作为一个安全主体,不存在任何个人化配置,也不会保存任何凭据,不会安装任何的UWP类应用,所特殊的只有它存储着S-1-5-20的sid。
所以,我们只需要用一份原始的、默认的NTUSER.dat来替换损坏的,并给新的设置好S-1-5-20的sid即可。
那么具体的代码实现可以交给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 offtitle Office 激活修复工具 - 修复 NetworkService 注册表问题color 0 Asetlocal 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 安装路径,跳过检查。 ) :doneecho .echo =====================================================echo ✅ 修复完成,请重新启动计算机。echo =====================================================pause exit /b
将以上脚本保存到.bat文件中,双击运行,给予管理员权限,稍等几分钟后,你的问题应该会被解决。
能不能 既然存在,就说明是Office是因为权限的问题导致无法访问NETWORK SERVICE的了。
打开注册表编辑器,并索引到HKEY_USERS\,方法同前
右键S-1-5-20,选择权限(P)
点击添加(D)...
输入NETWORK SERVICE并确认
在组和用户名中选择NETWORK SERVICE
在下面的NETWORK SERVICE 的权限(P)中在允许 那一栏勾选完全控制和读取
确认
现在你的问题应该已经被解决了