解决 net rpc shutdown 报错 "Could not initialise pipe winreg. Error was NT_STATUS_OBJECT_NAME_NOT_FOUND"

解决 net rpc shutdown 报错 “Could not initialise pipe winreg. Error was NT_STATUS_OBJECT_NAME_NOT_FOUND”

本文分享博主在日常生活中遇到的一个问题及解决方法,由 Gemini 1.5 Pro 002 协助生成。

在使用 net rpc shutdown 命令远程关闭 Windows 机器时,有时会遇到 Could not initialise pipe winreg. Error was NT_STATUS_OBJECT_NAME_NOT_FOUND 的错误。这通常与目标 Windows 系统上的用户帐户控制 (UAC) 以及远程注册表访问权限有关。 本文将介绍如何通过配置 LocalAccountTokenFilterPolicy 注册表项来解决这个问题。

问题背景:

net rpc shutdown 命令依赖于远程注册表访问。当 UAC 启用时,本地账户的管理员权限会被过滤,导致 net rpc shutdown 无法正常访问所需的注册表项,从而引发上述错误。

解决方案:启用 LocalAccountTokenFilterPolicy

LocalAccountTokenFilterPolicy 注册表项控制着 UAC 对本地账户的过滤行为。启用此策略,可以解决 net rpc shutdown 遇到的权限问题。 虽然手动修改注册表可以实现,但使用 PowerShell 脚本更加方便和安全。

PowerShell 脚本:

以下 PowerShell 脚本可以自动创建并设置 LocalAccountTokenFilterPolicy 的值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 设置注册表路径
$regPath = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System"
$regKey = "LocalAccountTokenFilterPolicy"
$regValue = 1

# 检查注册表项是否存在
if (Test-Path "$regPath\$regKey") {
# 获取当前值
$currentValue = (Get-ItemProperty -Path $regPath -Name $regKey).$regKey
Write-Host "注册表项 '$regKey' 已存在,当前值为: $currentValue"

# 如果当前值与目标值不同,则更新
if ($currentValue -ne $regValue) {
Set-ItemProperty -Path $regPath -Name $regKey -Value $regValue
Write-Host "注册表值 '$regKey' 已更新为 '$regValue'"
} else {
Write-Host "注册表值 '$regKey' 已为 '$regValue',无需更改"
}
} else {
# 创建注册表项并设置值
New-ItemProperty -Path $regPath -Name $regKey -PropertyType DWORD -Value $regValue -Force
Write-Host "注册表项 '$regKey' 不存在,已创建并设置为 '$regValue'"
}

使用方法:

  1. 在目标 Windows 机器上,以管理员身份运行 PowerShell。
  2. 将以上代码复制到 PowerShell 窗口中并执行。

预期输出及生效:

成功执行脚本后,你会看到类似以下输出之一:

  • 注册表项 'LocalAccountTokenFilterPolicy' 不存在,已创建并设置为 '1' (如果注册表项之前不存在)
  • 注册表值 'LocalAccountTokenFilterPolicy' 已更新为 '1' (如果注册表项已存在但值不为 1)
  • 注册表值 'LocalAccountTokenFilterPolicy' 已为 '1',无需更改 (如果注册表项已存在且值为 1)

根据博主的测试,修改注册表后无需重启或注销即可立即生效

验证:

再次运行 net rpc shutdown 命令,如果配置正确,命令应该会成功执行,远程关闭目标 Windows 机器。

其他可能的解决方案:

如果问题仍然存在,可以考虑以下其他解决方案:

  • 使用域账户: 如果可能,尝试使用域账户进行远程关机,域账户通常不会受到 LocalAccountTokenFilterPolicy 的影响。
  • 检查防火墙: 确保目标 Windows 机器上的防火墙允许远程管理和文件和打印机共享。
  • 检查网络连接: 确保 Ubuntu 机器和 Windows 机器之间网络连接正常。