无尘阁日记

无尘阁日记

管理员窗口里WSL拒绝访问的排查
silcano

导读当前这个 PowerShell 或 CMD 没有拿到足够高的权限。

当前这个 PowerShell 或 CMD 没有拿到足够高的权限。wsl --update 会去改系统组件,普通窗口做不了,于是出现这句提示:

请求的操作需要提升

英文一般写成:

The requested operation requires elevation.

可以先换一种能提权的打开方式。

用管理员 PowerShell 时,从 Windows 左下角的开始菜单搜索 PowerShell,在 Windows PowerShell 上右键,选择“以管理员身份运行”。进去之后执行:

wsl --update

更新走完,继续这两条:

wsl --set-default-version 2
wsl --install -d Ubuntu --web-download

机器上如果已经装了 Windows Terminal,就从开始菜单搜到 Windows Terminal,右键,同样选择“以管理员身份运行”,然后执行:

wsl --update

右键菜单里根本找不到“以管理员身份运行”,往往说明当前 Windows 账户不是管理员。先查自己的账户:

net user %username%

输出里要能看到类似一行:

本地组成员  *Administrators

没有这一行,就换到管理员账户,或者请这台电脑的管理员给你授权。

现在可以做的很具体:关掉手头这个窗口,重新开一个管理员 PowerShell,按顺序执行:

wsl --shutdown
wsl --update
wsl --set-default-version 2
wsl --install -d Ubuntu --web-download

wsl --update 若还是报错,把完整报错贴出来,再继续往下拆。

我问:

问题我就说以管理员运行的。

AI答:

你点过“以管理员运行”,和窗口真正拿到管理员令牌,是两件事。也有可能 wsl.exe 被异常路径或策略拦住了。先别继续装,把窗口本身验清楚。

在那个你认为已经是管理员的 PowerShell 里执行:

net session

若返回类似:

发生系统错误 5。
拒绝访问。

这个窗口只是看起来像管理员,提权没有成功。接着查当前令牌:

whoami /groups | findstr /i "S-1-16-12288"

没有输出,就说明它不是高权限管理员令牌。

PowerShell 和 Terminal 的权限状态有时会拧。换 CMD 再试一次:开始菜单搜索 cmd,右键“命令提示符”,选择“以管理员身份运行”,执行:

net session

这次如果不报“拒绝访问”,再执行:

wsl --update

微软的 WSL 排障文档写过,安装或更新 WSL 时要确认命令行用户具备管理员权限,并建议右键终端,选择 “Run as Administrator”。(Microsoft Learn)

接着用绝对路径排除路径劫持。管理员 CMD 里执行:

where wsl

正常应当看到:

C:\Windows\System32\wsl.exe

然后直接跑:

C:\Windows\System32\wsl.exe --update

若出现多个 wsl.exe,或者第一行不是 C:\Windows\System32\wsl.exe,就是路径乱了。

普通更新仍在报权限问题,就改下载方式:

wsl --update --web-download

然后再看状态:

wsl --status

微软官方安装说明里提供了 --web-download,用来绕开 Microsoft Store 的下载路径。(Microsoft Learn)

假如 net session 每次都是拒绝访问,这个账号就不是真正的管理员。执行:

net user %username%

看里面有没有:

本地组成员  *Administrators

没有,账号本身就不是管理员。有,却仍然提不了权,就可能是 UAC 或组策略在限制。再执行:

whoami /groups

重点看有没有 BUILTIN\Administrators,完整性级别是不是高强制级别。

wsl --update 若一直失败,可以先把底层功能打开,不走更新命令。管理员 CMD 执行:

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
bcdedit /set hypervisorlaunchtype auto

然后重启电脑。重启后用管理员 CMD 执行:

wsl --set-default-version 2
wsl --install -d Ubuntu --web-download

WSL 2 需要启用 VirtualMachinePlatform,Windows 10 的版本也要达标。微软手动安装文档对 Windows 10 Build 有明确要求。(Microsoft Learn)

你所谓的管理员窗口里,先执行这一条:

net session

如果它还是提示:

系统错误 5
拒绝访问

当前窗口就没有真正拿到管理员权限。请从开始菜单搜索 cmd,右键,以管理员身份运行。不要从普通 PowerShell 里再去启动,不要从 VSCode 终端里启动,也不要从普通 Windows Terminal 标签页里启动。

我问:

net session执行结果是:列表是空的。

AI答:

net session 给出的结果是列表是空的。空列表说明这个窗口确实已经具备管理员权限。右键那一步已经生效。剩下的可能是这几类:wsl --update 去调用 Store 或 WSL 更新包时,被系统策略或组件拦住;当前 wsl.exe 状态异常;WSL 功能没有完整启用,或者启用后还没重启生效;Windows 10 版本太老,wsl --update 这套新命令支持不完整;Microsoft Store 或 App Installer 组件有问题。

微软官方说明里,wsl --install 以及相关的安装更新命令,要求 Windows 10 Version 2004、Build 19041 及以上。旧版本需要走手动安装路线。(Microsoft Learn)

接下来按这个顺序做。

先确认 wsl.exe 的路径。管理员 CMD 里执行:

where wsl

正常应优先看到:

C:\Windows\System32\wsl.exe

再用绝对路径执行:

C:\Windows\System32\wsl.exe --status
C:\Windows\System32\wsl.exe --update --web-download

第二条一定要带 --web-download,这样会绕开 Microsoft Store 的下载路径。安装卡住,或者商店路径异常时,微软文档也建议使用 --web-download。(Microsoft Learn)

如果还提示“请求的操作需要提升”,就先跳过 update。你不一定要先把 wsl --update 跑通,可以直接重新启用底层组件。管理员 CMD 执行:

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
bcdedit /set hypervisorlaunchtype auto

重启电脑,然后再执行:

wsl --set-default-version 2
wsl --install -d Ubuntu --web-download

Windows 10 如果偏老,就改走手动安装。先查版本:

winver

如果不是 Windows 10 2004 / Build 19041 以上,不要继续折腾 wsl --update。管理员 CMD 执行:

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

重启之后,手动安装 WSL2 的 Linux 内核更新包。用浏览器打开微软官方手动安装页,下载:

WSL2 Linux kernel update package for x64 machines

官方手动安装步骤的要求是:先启用 WSL 功能,再启用 Virtual Machine Platform,然后安装 WSL2 Linux kernel update package。(Microsoft Learn)

建议你现在就在管理员 CMD 里跑这 5 条,不要用 PowerShell:

where wsl
C:\Windows\System32\wsl.exe --status
C:\Windows\System32\wsl.exe --update --web-download
winver
wsl --list --online

把输出发过来。尤其要看 where wsl、wsl --status,以及 winver 里的版本号和 OS 内部版本。这样才能分辨是版本太老、Store 路径有问题,还是 WSL 组件损坏。

我问:

where wsl,执行结果没返回。

AI答:

where wsl 没有返回,系统现在就是找不到 wsl.exe。这里有一个坑:如果你是在 PowerShell 里执行的 where,它可能只是 PowerShell 的别名,对不上 Windows 自带的 where.exe,于是看起来像没有任何结果。

先分清窗口。提示符若是:

PS C:\Windows\System32>

那就是 PowerShell。请执行:

where.exe wsl
Get-Command wsl

如果是 CMD,提示符一般是:

C:\Windows\System32>

那就执行:

where.exe wsl

不管是 CMD 还是 PowerShell,都直接查文件在不在:

dir C:\Windows\System32\wsl.exe

能看到文件,例如:

C:\Windows\System32\wsl.exe

说明 wsl.exe 存在,只是 PATH 或当前终端的解析出了问题。直接执行:

C:\Windows\System32\wsl.exe --status
C:\Windows\System32\wsl.exe --update --web-download

如果提示找不到文件,这台 Windows 目前就没有装好 WSL 的系统组件。用管理员 CMD 执行:

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
bcdedit /set hypervisorlaunchtype auto

然后重启电脑。微软官方手动安装文档也是这个顺序:先启用 Microsoft-Windows-Subsystem-Linux,再启用 VirtualMachinePlatform,之后重启机器。(Microsoft Learn)

重启后,用管理员 CMD 再查一次:

where.exe wsl
wsl --status
wsl --install -d Ubuntu --web-download

微软官方安装文档里也提到,wsl --install 可以安装 WSL 和 Ubuntu;安装过程如果卡住,可以用 --web-download 绕开商店下载路径。(Microsoft Learn)

功能启用之后还是没有 wsl.exe,就执行:

winver

看 Windows 10 的版本号。WSL 2 对 Windows 10 有版本要求:x64 至少要 Windows 10 Version 1903,Build 18362.1049 以上;ARM64 至少 Version 2004,Build 19041 以上。(Microsoft Learn)

版本太老的话,wsl --update、wsl --install 这些新命令就可能不完整,或者不可用。

现在最该发来的是这三条的结果:

where.exe wsl
dir C:\Windows\System32\wsl.exe
winver

重点看 dir C:\Windows\System32\wsl.exe。这个文件如果不存在,就走启用系统组件、重启、再装手动内核包的路线。