Я хочу автоматически включить общий доступ к подключению к Интернету для виртуального коммутатора WSL2.
Я уже нашел ответ на аналогичный вопрос 9 лет назад, написал соответствующий сценарий PowerShell (см. Ниже) и добавил его в планировщик задач.
regsvr32.exe /s hnetcfg.dll
# See which adapter if connected to internet: wgpia0, Cisco VPN, Ethernet or WiFi
$ConnectedAdapters=$(Get-NetAdapter| where status -eq 'up')
if ($($ConnectedAdapters.Name -Match "wgpia0") -ne $null)
{
echo "PIA VPN WireGuard Connected"
$Interface="wgpia0"
}
elseif ($($ConnectedAdapters.InterfaceDescription -Match "Cisco") -ne $null)
{
echo "Cisco VPN connected"
$Interface=$(Get-NetAdapter -InterfaceDescription "Cisco AnyConnect Secure Mobility Client Virtual Miniport Adapter for Windows x64").Name
}
elseif ($($ConnectedAdapters.InterfaceDescription -Match "Intel (R)") -ne $null)
{
echo "RJ-45 Ethernet cable connected"
$Interface="Ethernet"
}
else
{
echo "No VPN or RJ-45 cable connected, Bridging WLAN"
$Interface="WLAN"
}
$netShare = New-Object -ComObject HNetCfg.HNetShare
$publicConnection = $netShare.EnumEveryConnection |? { $netShare.NetConnectionProps.Invoke($_).Name -eq $Interface } # adapter to provide ICS determined above
$WSLConnection = $netShare.EnumEveryConnection |? { $netShare.NetConnectionProps.Invoke($_).Name -Match "WSL" } # WSL vSwitch to receive ICS
# Get sharing configuration
$config = $netShare.INetSharingConfigurationForINetConnection.Invoke($publicConnection)
$WSLconfig = $netShare.INetSharingConfigurationForINetConnection.Invoke($WSLConnection)
if ($($config.SharingEnabled))
{
echo "ICS already enabled for $($Interface)"
}
else
{
echo "ICS not yet enabled for $($Interface)"
echo "Enabling ICS ..."
$config.EnableSharing(0)
$WSLconfig.EnableSharing(1)
}
Проблема в том, что я часто переключаюсь между WLAN и кабельным подключением, а также переключаюсь между двумя VPN-сервисами. Если раньше для совместного использования был выбран другой сетевой адаптер, то запускается $config.EnableSharing(0)
приведет к ошибке:
+ $config.EnableSharing(0)
+ CategoryInfo : OperationStopped: (:) [], COMException
+ FullyQualifiedErrorId : System.Runtime.InteropServices.COMException
Если я отключу ICS уже активированного сетевого адаптера заранее, совместное использование ICS будет работать нормально. Но один из сетевых адаптеров VPN (wgpia0) исчезнет при отключении PIA VPN и даже не будет отображаться как скрытый адаптер в Get-NetAdapter
больше и я не могу просто бежать DisableSharing()
на wgpia0.
Есть аргумент в пользу EnableSharing(0)
принудительно завершить работу всех остальных ICS и вместо этого включить ICS на текущем адаптере?