我正在开发 OpenVPN 的静默安装程序,它是将部署在我雇主的公司网络内的众多 Windows 系统上的更大软件包的一部分。
我能够使用一些命令行选项(例如 /S /SELECT_SHORTCUTS=0 /SELECT_OPENVPN=1 /SELECT_SERVICE=1 等)静默安装 OpenVPN。效果很好。
然而,当它完成后,它会将 TAP 适配器分配给公共网络位置/简介:
我需要将 TAP 适配器安装到工作网络位置/配置文件,所以当我打开 Windows 高级防火墙上的某些端口(使用某些netsh advfirewall firewall add
命令)时,我可以指定这些端口上的流量只能通过域和私有配置文件上的网络适配器允许,而不是公共配置文件。
安装程序以提升的权限运行,因此在安装过程中绝不会有任何提示或机会来选择位置/配置文件(即 Windows 网络弹出窗口)。此外,我真的不希望运行此安装程序的人有机会摆弄它或进行任何更改——这仅供内部使用,这些设置是非可选的。
令人沮丧的是,我之所以提出这个问题,是因为我不知道如何从命令行更改 TAP 适配器的位置/配置文件。似乎没有任何netsh
命令可以执行此操作。
如何从命令行更改 Windows 网络适配器的位置/配置文件?最好使用批处理文件来实现这一点。
ps 我也在使用上述步骤这里使适配器不显示为“未识别的网络”,这可能是上述操作的先决条件,不确定。
谢谢!
答案1
Powershell 可以在这里提供帮助:
Get-NetConnectionProfile
获取您想要的信息
Set-NetConnectionProfile -NetworkCategory Private
改变它。
此外,如果您当前有多个活动的网络,则必须确定您想要的网络。
Tech-Net 文档设置 NetConnectionProfile
答案2
最后,我找不到完全自动化的方式来做我想做的事情。如果其他人在这里遇到类似问题,将网络从公共网络更改为工作网络的注册表值位于:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\Profiles\<GUID>
但我永远无法通过编程弄清楚的部分是识别正确的<GUID>
。也许注册表中实际上存在 OpenVPN TAP 适配器与我找不到的正确网络配置文件之间的链接,或者也许有方法powershell
或其他命令可以找到它。
无论如何,一旦你知道了正确的一个(通过目测或其他方式),你可以将 (Public) 更改Category
为0
( 1
Work)。只需重新启动 OpenVPN 即可开始遵守正确的 Windows 防火墙规则。
相反,我最终采用了*NdisDeviceType
= 1 技术(谷歌), 哪个:
- 让你无需关心它在哪个 Windows 网络配置文件中(它甚至不再显示在网络和共享中心下),并且
- 导致 OpenVPN 的流量落入
Private
Windows 防火墙内的配置文件中。无论如何,这才是我真正需要的。然而,我似乎找不到任何关于此内容的记录。
这对于我现在的需要来说是勉强可以接受的,我只希望这种技术能够在我最终需要它的所有 Windows 版本中起作用并且它不会很快消失。
以防万一有用,这里是我编写的 powershell 脚本,在 OpenVPN 静默安装程序之后运行,但在启动 OpenVPN 服务之前运行:
$ErrorActionPreference = "Stop"
Write-Host "Beginning"
$adapters = Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Class\*" `
| Where-Object { $_.Class -eq "Net" } `
| Foreach-Object { $_.PSPath }
Write-Host "Found adapters: " $adapters
Write-Host "Now setting *NdisDeviceType to 1 on all tap0901 adapters..."
Get-ChildItem $adapters -erroraction silentlycontinue `
| Foreach-Object { get-itemproperty -path $_.PSPath } `
| Where-Object {
($_.ComponentId -eq "tap0901") -and -not ($_."*NdisDeviceType" -eq 1)
} `
| Foreach-Object {
Set-ItemProperty -path $_.PSPath -name "*NdisDeviceType" -Type DWORD -Value 1
}
Write-Host "Now disabling then re-enabling all TAP-Windows adapters..."
Get-WmiObject -Class Win32_NetworkAdapter `
| Where-Object { $_.Name -like "TAP-Windows Adapter*" } `
| Foreach-Object {
$junk = $_.Disable()
$junk = $_.Enable()
}
Write-Host "Done."
非常感谢0n的nivot.org 帖子和蒂斯的Brokenwire.NET 帖子对于上述 Powershell 脚本。