Windows-Server-2012

使用 Powershell 將 Windows Server 防火牆地址列表從一條規則復製到另一條規則

  • July 14, 2016

我對 Windows 伺服器中的防火牆 cmdlet 的文件有點困惑。我正在嘗試將遠端和本地 ips 的地址列表從一條規則復製到另一條規則。我可以使用

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

現在我試圖將它設置為另一個這樣的規則:

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

這顯然是錯誤的,因為我立即收到一個錯誤,說Set-NetFirewallAddressFilter沒有參數“顯示名稱”

當我使用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

(如果您打開了具有高級安全 GUI 的 Windows 防火牆,請刷新它)。

但是在那裡我不能使用完整的對象,而只能分別使用本地和遠端地址

如果它單獨需要它們,我看不出任何解決方法。Splatting 可能使之成為可能,但這將是有效相同結果的更多程式碼。如果它真的必須是一條線(為什麼?)你可以同時使用類似的東西:

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-cmdlet 將協同工作以獲取地址,但它們只是輸出到螢幕上,不會更改任何內容。

第二個更新的:

Set-NetFirewallRule -DisplayName "Test" -RemoteAddress | 
   Get-NetFirewallRule -DisplayName "MSSQL" | Get-NetFirewallAddressFilter | ft Remote
  • 是 aSet-在開始並到達 RemoteAddres 參數,但隨後切換(哎呀!)到管道,管道什麼?進入Get-NetFirewallRule(與以前相同的警告)
  • 然後獲取規則的地址過濾器,並通過管道連接到Format-Table(!),這是一個僅用於互動式控制台的顯示 cmdlet。

完全正確 - 乍一看,它具有 PowerShell 單線的外觀,但它真的很糟糕。

  • 您不傾向於管道輸出來自Set-cmdlet。
  • 您不能將管道連接到寫入參數值的中間
  • 您不應該通過 Format-List 或 Format-Table 發送數據,併計劃將輸出用作另一個 cmdlet 的輸入 - 他們會很樂意添加空格、製表符、顯示名稱、丟棄數據,並且通常會將其混合起來在螢幕上看起來不錯
  • Get-將 s 連結在一起,但不使用輸出。

:連枷:

但它是如此接近,它看起來像:

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

Get-將子管道封裝在括號中(),以便您可以使用它的輸出,獲取.RemoteAddress屬性,並將其用作-RemoteAddress參數的值 to Set-NetFirewallRule

引用自:https://serverfault.com/questions/789547