Windows-Server-2012
使用 Powershell 將 Windows Server 防火牆地址列表從一條規則復製到另一條規則
我對 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
- 是 a
Set-
在開始並到達 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
參數的值 toSet-NetFirewallRule
。