wsl2更新后,报错0x8007273d解决方案

wsl2更新后,报错0x8007273d解决方案

产生原因

在wsl2更新后,可能会出现Error code: Wsl/Service/0x8007273d时,可能是电脑中存在的代理软件(比如proxifier)与wsl发生冲突导致的。
Proxifer开发人员解释如下:

如果Winsock LSP DLL被加载到其进程中,则wsl.exe将显示此错误。最简单的解决方案是对wsl.exe使用WSCSetApplicationCategory WinAPI调用来防止这种情况。在后台,该调用在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinSock2\Parameters\AppId_Catalog中为wsl.exe创建一个条目。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eRwTtHIL-1686657341742)(WSL2冲突问题/images/image-20230613190305294.png)]

临时解决方案

管理员身份启动cmd/powershell , 运行。

netsh winsock reset

该方案需要每次启动wsl时重新执行,非常不方便。

永久解决方案

​ 这里我找到了两种不同的解决方案,一种是卸载wsl2更新,降级之后就不会发生冲突了,但是不能使用wsl2的新功能;第二种是则需要添加注册表,但不需要降级安装,但是每次wsl更新都需要重新执行,因为版本化路径不断变化,也很难判断该应用程序何时更新。

方案一 wsl降级
  • 在添加或删除程序中:先卸载Windows Subsystem for Linux Update,然后卸载Windows Subsystem for Linux
  • 重新启动wsl,会跳转至https://aka.ms/wsl2kernel
  • 重新下载wsl_update_x64.msi 安装即可。
  • 最重要的一点,千万不要更新wsl
方案二 添加注册表信息

主要原理是在\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinSock2\Parameters\AppId_Catalog\添加相应的注册表项,添加注册表项可以使用软件NoLsp.exe添加也可以使用powershell脚本一键添加,这里都演示一下:

使用软件添加注册表项

我们所使用软件是proxifierNoLsp.exe

NoLsp.exe下载地址:http://www.proxifier.com/tmp/Test20200228/NoLsp.exe

使用步骤

  • 管理员打开powershell,执行如下命令,获取应用商店版wsl安装目录

    cd "C:\Program Files\WindowsApps"
    ls
    

    找到包含WindowsSubsystemForLinux字段就是,例如我电脑上是MicrosoftCorporationII.WindowsSubsystemForLinux_1.2.5.0_x64__8wekyb3d8bbwe

  • 管理员打开cmd,执行以下命令,下面的命令就相当于添加注册表(记得将MicrosoftCorporationII.WindowsSubsystemForLinux_1.2.5.0_x64__8wekyb3d8bbwe修改为上一步所找到的字段):

    NoLsp.exe %USERPROFILE%\AppData\Local\Microsoft\WindowsApps\wsl.exe
    
    NoLsp.exe "C:\Program Files\WindowsApps\MicrosoftCorporationII.WindowsSubsystemForLinux_1.2.5.0_x64__8wekyb3d8bbwe\wsl.exe"
    NoLsp.exe "C:\Program Files\WindowsApps\MicrosoftCorporationII.WindowsSubsystemForLinux_1.2.5.0_x64__8wekyb3d8bbwe\wslservice.exe"
    NoLsp.exe "C:\Program Files\WindowsApps\MicrosoftCorporationII.WindowsSubsystemForLinux_1.2.5.0_x64__8wekyb3d8bbwe\wslg.exe"
    NoLsp.exe "C:\Program Files\WindowsApps\MicrosoftCorporationII.WindowsSubsystemForLinux_1.2.5.0_x64__8wekyb3d8bbwe\wslhost.exe"
    
使用powershell脚本添加注册表项

不想使用软件的话,也可以使用管理员身份运行powershell执行下列脚本,输出success即可。

#Requires -RunAsAdministrator
# Fix for https://github.com/microsoft/WSL/issues/4177

$MethodDefinition = @'
[DllImport("ws2_32.dll", CharSet = CharSet.Unicode)]
public static extern int WSCSetApplicationCategory([MarshalAs(UnmanagedType.LPWStr)] string Path, uint PathLength, [MarshalAs(UnmanagedType.LPWStr)] string Extra, uint ExtraLength, uint PermittedLspCategories, out uint pPrevPermLspCat, out int lpErrno);
'@
$UserProfilePath = $env:USERPROFILE

$Ws2Spi = Add-Type -MemberDefinition $MethodDefinition -Name 'Ws2Spi' -PassThru

$WslLocation = Get-AppxPackage MicrosoftCorporationII.WindowsSubsystemForLinux | Select-Object -expand InstallLocation

$Executables = ("wsl.exe", "wslservice.exe","wslg.exe","wslhost.exe");
$Location = ($WslLocation,"C:\Program Files\WSL","C:\Windows\System32","${UserProfilePath}\AppData\Local\Microsoft\WindowsApps");
foreach ($Location in $Location){
    foreach ($Exe in $Executables) {
        $ExePath = "${Location}\${Exe}";
        $ExePathLength = $ExePath.Length;

        $PrevCat = $null;
        $ErrNo = $null;
        if ($Ws2Spi::WSCSetApplicationCategory($ExePath, $ExePathLength, $null, 0, [uint32]"0x80000000", [ref] $PrevCat, [ref] $ErrNo) -eq 0) {
            Write-Output "Added $ExePath!";
        }
    }
}
Write-Output "success";

修复完成之后需要进行系统重启,如果您不想重新启动,可以使用taskkill -IM "wslservice.exe" /F杀死wsl相关东西并重新启动WSL也可以。

参考链接

https://github.com/microsoft/WSL/issues/4177

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值