Как принудительно включить ICS (общий доступ к подключению к Интернету) на определенном адаптере, перезаписав предыдущие настройки ICS в Powershell?

Я хочу автоматически включить общий доступ к подключению к Интернету для виртуального коммутатора 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 на текущем адаптере?

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *