Назад | Перейти на главную страницу

Скопируйте список адресов брандмауэра Windows Server из одного правила в другое с помощью Powershell

Я немного застрял в документации для командлетов брандмауэра на сервере Windows. Я пытаюсь скопировать списки адресов для удаленных и локальных IP-адресов из одного правила в другое. Я могу получить список, используя

Get-NetFirewallRule -DisplayName "MSSQL" | Get-NetFirewallAddressFilter

Теперь я пытался установить это для другого правила вроде этого:

Set-NetFirewallAddressFilter -DisplayName "FTP Server (FTP Traffic-In)" | Get-NetFirewallRule -DisplayName "MSSQL" | Get-NetFirewallAddressFilter

Это явно неправильно, так как я сразу получаю сообщение об ошибке, что Set-NetFirewallAddressFilter не имеет параметра ´Displayname´

Когда я использую Set-NetFirewallRule вместо этого он работает, но здесь я не могу использовать полный объект, а только локальные и удаленные адреса по отдельности. Не могли бы вы помочь?

Обновить

Я пробовал запустить что-то вроде этого:

Set-NetFirewallRule -DisplayName "Test" -RemoteAddress | 
    Get-NetFirewallRule -DisplayName "MSSQL" | Get-NetFirewallAddressFilter | ft Remote

Это не работает: Set-NetFirewallRule: неверный адрес. Адреса могут быть указаны как IP-адреса, диапазоны или подсети.

Опять застрял ...

Что вам нужно сделать:

  • Получите исходное правило по имени
  • Извлеките из него фильтр адресов
  • Получите новое правило по имени
  • Установите в нем фильтр адресов

И да, вы можете объединить многие из них в однострочник, но, например, я думаю, что это сделает это:

$sourceRule = Get-NetFirewallRule -DisplayName "MSSQL"
$sourceIPs = $sourceRule | Get-NetFirewallAddressFilter

Set-NetFirewallRule -DisplayName "Test" -RemoteAddress $sourceIPs.RemoteAddress -LocalAddress $sourceIPs.LocalAddress

(и если у вас открыт графический интерфейс брандмауэра Windows с расширенной безопасностью, обновите его).

но там я не могу использовать полный объект, а только локальные и удаленные адреса по отдельности

Я не вижу другого пути, если они нужны отдельно. Сплаттинг мог бы сделать это возможным, но это было бы намного больше кода для того же результата. Если это действительно должна быть одна строка (почему?), Вы можете сделать и то, и другое вместе, например:

Set-NetFirewallRule -DisplayName "Test" -RemoteAddress ($ip = Get-NetFirewallRule -DisplayName "MSSQL" | Get-NetFirewallAddressFilter).RemoteAddress -LocalAddress $ip.LocalAddress

В обоих ваших конвейерах есть некоторые действительно неправильно понятые части. Первый:

Set-NetFirewallAddressFilter -DisplayName "FTP Server (FTP Traffic-In)" | 
Get-NetFirewallRule -DisplayName "MSSQL" | Get-NetFirewallAddressFilter
  • Пытается установить адрес фильтр по DisplayName - у них нет отображаемого имени, фильтры привязаны к FirewallRules.
  • В Set- командлеты не часто возвращают какой-либо вывод, но вы передаете канал, как если бы он
  • Мнимый выход по конвейеру переходит в Get-оригинального правила брандмауэра, которое будет делать странные вещи. Он может игнорировать любой ввод конвейера или может аварийно завершить работу на его основе. В любом случае...
  • Два Get- командлеты будут работать вместе для получения адресов, но они просто выводят на экран и ничего не меняют.

Второй обновленный:

Set-NetFirewallRule -DisplayName "Test" -RemoteAddress | 
    Get-NetFirewallRule -DisplayName "MSSQL" | Get-NetFirewallAddressFilter | ft Remote
  • Это Set- в начале и доходит до параметра RemoteAddres, но затем переключается (ой!) на конвейер, на какой канал ?? в Get-NetFirewallRule (та же оговорка, что и раньше)
  • затем получает фильтр адресов для правила и направляет его в Format-Table(!), который представляет собой командлет отображения только для интерактивной консоли.

Это абсолютно правильно - на первый взгляд он выглядит как однострочник PowerShell, но на самом деле он действительно сломан.

  • Вы не стремитесь к конвейерному выводу из Set- командлеты.
  • Вы не можете подключить конвейер к середине записи значения параметра
  • Вы не должны отправлять данные через Format-List или Format-Table и планируете использовать вывод в качестве входных данных для другого командлета - они с радостью добавят пробелы, табуляции, отображаемые имена, выбрасывают данные и, как правило, смешивают вещи, чтобы сделать это хорошо выглядеть на экране
  • Вы цепляетесь Get-s вместе, но не используйте вывод.

: цеп:

Но это так близко, это выглядело бы так:

Set-NetFirewallRule -DisplayName "Test" -RemoteAddress (Get-NetFirewallRule -DisplayName "MSSQL" | Get-NetFirewallAddressFilter).RemoteAddress

Инкапсуляция Get- суб-конвейер в скобках () поэтому вы можете использовать его вывод, взяв .RemoteAddress свойство, и используя это как значение для -RemoteAddress параметр для Set-NetFirewallRule.