是否有编程方式在 Windows 中创建自定义网络配置文件并为其分配虚拟网络适配器?

nos*_*tio 8 windows powershell wsl-2

我想以编程方式创建一个新的网络配置文件(除了在 下列出的那些HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\Profiles)。然后我想以编程方式为其分配一个特定的网络适配器(例如,vEthernet (WSL)),并将配置文件设置为Private网络模式以遵循防火墙规则,类似于我们可以为 Wi-Fi 网络执行的操作。是否有 Windows 或 PowerShell API 来帮助解决这个问题?

最终,目标是从 WSL2 Linux 访问 Windows 网络,而无需手动调整 Windows 防火墙设置。

这个问题的更多背景,包括我迄今为止尝试过的一些事情。

目前,我的解决方案是New-NetFirewallRule -DisplayName "WSL" -Direction Inbound -InterfaceAlias "vEthernet (WSL)"每次需要从 WSL2 访问 Windows 主机网络时手动调用。

FSC*_*Kur 2

就我个人而言,如果可能的话,我会避免使用 P/Invoke - 这通常是最复杂的方法。

我建议使用 netsh 并解析文本。Netsh 在底层使用 Win32 API,因此将您的问题从 P/Invoke 更改为正则表达式(我认为这通常是一个更容易使用的工具)。

可能是 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"
Run Code Online (Sandbox Code Playgroud)

IIUC,您不需要每次都需要一个新的配置文件,您只需要定义一次。根据我对 WSL 的了解,您每次启动时都会获得一个新 IP,因此问题是将其分配给您为该任务创建的一个配置文件。

如果这是正确的,那么我会将现有配置文件的配置文件导出为 XML,手动编辑一次,然后在看到 WSL 适配器时自动应用该 XML。

不确定您是否想以交互方式执行此操作,但为了完全自动化,我想到的方法是将任务附加到事件查看器中的相关事件。在我的盒子上,我没有发现任何明显的 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).
Run Code Online (Sandbox Code Playgroud)

为了简洁起见,我省略了很多内容,但很乐意回答后续问题。