Я работаю над автоматическим установщиком OpenVPN в рамках более крупного программного пакета, который будет развернут на многочисленных системах Windows в корпоративной сети моего работодателя.

Я могу заставить OpenVPN устанавливать без вывода сообщений, используя некоторые параметры командной строки (например, /S /SELECT_SHORTCUTS = 0 /SELECT_OPENVPN = 1 /SELECT_SERVICE = 1 и т.д.). Это прекрасно работает.

Однако, когда это сделано, он назначает адаптер TAP местоположению / профилю публичной сети :

Адаптер TAP назначен для публичной сети

Мне нужно, чтобы адаптер TAP был установлен на рабочем месте / профиле сети, поэтому, когда я открываю некоторые порты на брандмауэре Windows Advanced (используя некоторые команды netsh advfirewall firewall add ), я могу указать, что трафик на эти порты должен быть разрешен только через сетевые адаптеры на доменном и приватном профилях, а не на публичных.

Установщик запускается с повышенными привилегиями, поэтому никогда не появляется никаких подсказок или возможностей для выбора местоположения / профиля (например, всплывающих окон сети Windows) во время установки. Кроме того, я действительно не хочу, чтобы у парня, запускающего этот установщик, были какие-либо возможности обойти его или внести какие-либо изменения - это только для внутреннего использования, и эти настройки не являются обязательными.

Облом здесь и причина моего вопроса, я не могу понять, как изменить расположение / профиль адаптера TAP из командной строки. Кажется, нет никаких команд netsh чтобы сделать это.

Как я могу изменить расположение / профиль сетевого адаптера Windows из командной строки? Что-то выполнимое в командном файле будет предпочтительным.

п.с. Я также использую шаги, описанные здесь, чтобы адаптер не отображался как "неопознанная сеть", что может быть предварительным условием для вышеуказанного, не уверен.

Спасибо!

2 ответа2

1

Powershell может помочь здесь:

Get-NetConnectionProfile

получает информацию, которую вы хотите

Set-NetConnectionProfile -NetworkCategory Private

Изменяет это.

Кроме того, если у вас есть несколько активных текущих сетей, вам придется определить, какую вы хотите.

Документация Tech-Net о Set-NetConnectionProfile

0

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

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\Profiles\<GUID>

Но часть, которую я никогда не смог понять программно, - это определение правильного <GUID> . Возможно, в реестре есть связь между TAP-адаптером OpenVPN и правильным сетевым профилем, который я просто не смог найти, или, возможно, есть способ с powershell или какой-либо другой командой найти его.

В любом случае, если вы знаете правильный (с помощью глазного яблока или чего-то еще), вы можете изменить Category с 0 (общедоступная) на 1 (рабочая). Перезапуск OpenVPN - это все, что нужно для того, чтобы начать соблюдать правильные правила брандмауэра Windows.

Вместо этого я остановился на *NdisDeviceType = 1 (Google), который:

  1. освобождает вас от заботы о том, в каком профиле Windows Network он находится (он больше не отображается в Центре управления сетями и общим доступом), и
  2. заставляет трафик 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."

Огромное спасибо посту x0n nivot.org и посту thijs Brokenwire.NET за приведенный выше скрипт Powershell.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .