Существует ли программный способ создания пользовательского сетевого профиля в Windows и назначения ему виртуального сетевого адаптера?

#windows #powershell #wsl-2

#Windows #powershell #wsl-2

Вопрос:

Я хотел бы программно создать новый сетевой профиль (в дополнение к тем, которые перечислены ниже HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionNetworkListProfiles ). Затем я хотел бы программно назначить ему определенный сетевой адаптер (например, vEthernet (WSL) ) и установить профиль в Private сетевой режим, чтобы следовать правилам брандмауэра, аналогично тому, что мы можем сделать для сетей Wi-Fi. Есть ли API для Windows или PowerShell, чтобы помочь в этом?

В конечном счете, цель состоит в том, чтобы получить доступ к сети Windows из WSL2 Linux без настройки параметров брандмауэра Windows вручную.

Больше контекста для вопроса, включая некоторые вещи, которые я пробовал до сих пор.

В настоящее время мое решение состоит в том, чтобы вызывать New-NetFirewallRule -DisplayName "WSL" -Direction Inbound -InterfaceAlias "vEthernet (WSL)" вручную каждый раз, когда мне нужен доступ к хост-сети Windows из WSL2.

Комментарии:

1. возможно, вы сможете сделать это с помощью pinvoke, который я создал несколько лет назад, чтобы создать профиль по этой сути: gist.github.com/crshnbrn66/7e81bf20408c05ddb2b4fdf4498477d8

2. @thomschumacher спасибо, я попробую!

3. это также может помочь github.com/adamdriscoll/pinvoke

Ответ №1:

Лично я бы по возможности избегал P / Invoke — обычно это самый неудобный подход.

Я предлагаю использовать netsh и проанализировать текст. Netsh использует Win32 API под капотом, так что это меняет вашу проблему с P / Invoke на regex (что, я думаю, обычно является более простым инструментом в использовании).

Это может быть полезным указателем для вызова netsh. Основные биты:

 netsh lan show profiles
netsh lan export profile folder=PATH_TO_FOLDER interface="INTERFACE_NAME"
netsh lan add profile filename="PATH_AND_FILENAME.xml" interface="INTERFACE_NAME"
 

IIUC, вам не нужен новый профиль каждый раз, вам нужно определить его только один раз. Насколько я знаю WSL, вы получаете новый IP-адрес при каждой загрузке, поэтому проблема заключается в назначении его одному профилю, который вы создали для задачи.

Если это правильно, то я бы экспортировал профиль в XML для существующего профиля, отредактировал его один раз вручную, а затем автоматизировал применение этого XML при появлении адаптера WSL.

Не уверен, что вы хотите сделать это интерактивно, но для полной автоматизации мне приходит в голову подход, который заключается в том, чтобы прикрепить задачу к соответствующему событию в средстве просмотра событий. В моем окне я не обнаружил никаких очевидных источников событий для WSL, но Hyper-V-VmSwitch источник выглядит многообещающим. Вот пример события:

 Log Name:      System
Source:        Microsoft-Windows-Hyper-V-VmSwitch
Date:          02/08/2021 09:59:40
Event ID:      264
Task Category: None
Level:         Information
Keywords:      (128)
User:          SYSTEM
Computer:      ******************
Description:
Port D76B3365-5A23-4960-B044-066E05FF3F2D (Friendly Name: A7DB3628-B2A6-4605-AAED-229DB96E064E) successfully created on switch 5EE23C35-0881-4967-A447-FF22139BE1F4 (Friendly Name: WSL).
 

Я многое опустил для краткости, но с удовольствием отвечу на дополнительные вопросы.