No final, não consegui encontrar uma maneira completamente automatizada de fazer o que eu queria. No caso de alguém mais se deparar com algo parecido, o valor do registro para mudar uma rede de público para trabalho está em:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\Profiles\<GUID>
Mas a parte que eu nunca consegui descobrir programaticamente é identificar o <GUID>
correto. Talvez haja realmente uma ligação no registro entre o adaptador OpenVPN TAP e o perfil de rede correto que eu simplesmente não consegui encontrar, ou talvez haja uma maneira com powershell
ou algum outro comando para encontrá-lo.
De qualquer forma, assim que você souber o caminho certo (via eyeballing ou qualquer outra coisa), você pode alterar o Category
de 0
(Public) para 1
(Work). Uma reinicialização do OpenVPN é tudo o que é necessário para começar a honrar as regras certas de firewall do Windows.
Em vez disso, acabei usando a técnica *NdisDeviceType
= 1 ( google ), que :
- isenta você de se preocupar com o perfil do Windows Network (ele nem aparece mais na Central de redes e compartilhamento) e
- faz com que o tráfego do OpenVPN caia no perfil
Private
dentro do firewall do Windows. O que é tudo o que eu realmente precisava mesmo. No entanto, isso não parece estar documentado em nenhum lugar que eu possa encontrar.
Isto é marginalmente aceitável para o que eu preciso, neste momento, eu só espero que esta técnica funcione em todas as versões do Windows que eu acabe precisando e que não desapareça tão cedo.
Caso seja útil, aqui está o script powershell que escrevi, para ser executado após o instalador silencioso do OpenVPN, mas antes de iniciar o serviço 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."
Grave obrigado a nivot.org post e thijs 's Brokenwire.NET post para o script Powershell acima.