Я немного застрял в документации для командлетов брандмауэра на сервере 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
Set-
командлеты не часто возвращают какой-либо вывод, но вы передаете канал, как если бы онGet-
оригинального правила брандмауэра, которое будет делать странные вещи. Он может игнорировать любой ввод конвейера или может аварийно завершить работу на его основе. В любом случае...Get-
командлеты будут работать вместе для получения адресов, но они просто выводят на экран и ничего не меняют.Второй обновленный:
Set-NetFirewallRule -DisplayName "Test" -RemoteAddress |
Get-NetFirewallRule -DisplayName "MSSQL" | Get-NetFirewallAddressFilter | ft Remote
Set-
в начале и доходит до параметра RemoteAddres, но затем переключается (ой!) на конвейер, на какой канал ?? в Get-NetFirewallRule
(та же оговорка, что и раньше)Format-Table
(!), который представляет собой командлет отображения только для интерактивной консоли.Это абсолютно правильно - на первый взгляд он выглядит как однострочник PowerShell, но на самом деле он действительно сломан.
Set-
командлеты.Get-
s вместе, но не используйте вывод.: цеп:
Но это так близко, это выглядело бы так:
Set-NetFirewallRule -DisplayName "Test" -RemoteAddress (Get-NetFirewallRule -DisplayName "MSSQL" | Get-NetFirewallAddressFilter).RemoteAddress
Инкапсуляция Get-
суб-конвейер в скобках ()
поэтому вы можете использовать его вывод, взяв .RemoteAddress
свойство, и используя это как значение для -RemoteAddress
параметр для Set-NetFirewallRule
.