マイクロソフトの誰もがルールの名前を思い出せない状況に陥ったことがあるのではないかと思います。netsh advfirewall firewall show rule
は1の名前のみを受け入れ、"SQL*"
や^SQL.+$
などのパターンを使用してルールを見つけるのに役立つパターンマッチング機能はnetshで利用できません。
showとname=all
を使用すると、すべてのルールを一覧表示できますが、Windows用の確実なコマンドラインgrepツールを見つけることができませんでした。
次のようなコマンドを実行できるようにしたい:
netsh advfirewall firewall show rule name=sql*
これは可能ですか?
PowerShell実行:
$fw=New-object -comObject HNetCfg.FwPolicy2
$fw.rules | findstr /i "whaturlookingfor"
さらに良い:
$fw.rules | select name | select-string "sql"
これは私ができる最高のことです。誰でもそれをさらに進める方法を知っていますか?結果からルール名を削除/減算したいですか?
netsh advfirewall firewall show rule name=all | find "Rule Name:" | find "NameLookingFor"
Windows 10では、netsh advfirewall
を実行すると警告が表示され、将来のWindowsバージョンではその機能がサポートされなくなる可能性があるため、代わりにPowerShellを使用する必要があると述べています。幸運なことに、OPが望んでいたことはPowerShellでは簡単です。
Get-NetFirewallRule -DisplayName "SQL*"
削除したいランダムな名前の実行可能ファイルによって作成された1000以上のファイアウォールルールがありました。次のコマンドを使用すると、これを簡単に実行できます。
Remove-NetFirewallRule -DisplayName "*mongod.exe"
あなたは試すことができます Select-String :
netsh advfirewall firewall show rule name=all | select-string -pattern "Hyper-V"
PowerShellを使用しない場合、findstrで正規表現を使用できます。
netsh advfirewall firewall show rule name=all | findstr /R "sql.*"
これは確かに裏尾の答えですが、コメントは要点をあいまいにします。
これは確かに少し異なる質問に答えています:どのようにすればいいですか ないnetsh
を使用し、それでもルールを見つけますか? :-)
私は、PowerShellイディオムに留まっている方がいいと思います。既に存在する場合は、正規表現を含めて 完全なパターンマッチング機能 を使用できます。
そのために、すべてのPowerShellコンストラクトが関数型ブロックにどのように埋め込まれるかを示すために、いくつかの条件とミューテーションを含めました。
ミューテーションは読み取りが不要な場合は管理者権限で実行する必要があるという最後の警告。
(New-Object -ComObject HNetCfg.FwPolicy2).rules |
Where-Object { $_.Name -match '^SQL.+$' } |
ForEach-Object { Write-Output "Checking $($_.Name)"
if ( $_.Enabled ) { Write-Output "$($_.Name) already enabled" }
else { Write-Output "$($_.Name) enabled"; $_.Enabled = $true }
}