#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).
Я многое опустил для краткости, но с удовольствием отвечу на дополнительные вопросы.