web-dev-qa-db-ja.com

コマンドを使用してWindowsファイアウォールが有効になっているかどうかを確認する方法

セットアッププログラムでnetsh advfirewall firewallコマンドを使用してWindowsファイアウォールルールを追加しています。システムでWindowsファイアウォールが無効になっていると、コードでエラーメッセージが表示されます。

したがって、コマンドnetsh advfirewall firewall addを実行する前に、ウィンドウのファイアウォールステータスを確認する必要があります。つまり、ファイアウォールが無効になっている場合、ルールを追加する必要はありません。

ウィンドウレジストリ値 "EnableFirewall"を使用して、ファイアウォールが有効になっているかどうかを確認しています。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\StandardProfile

これが正しい方法かどうかはわかりません。ドメインファイアウォールプロファイル(?)も使用できます。

前もって感謝します。

11
JChan

もう1つのオプションは、netsh自体を使用して、ファイアウォールが有効になっているかどうかを確認することです。コマンドnetsh advfirewall show private|public|domainを実行します。状態のオン/オフを示します。

10
Pr38y

Invoke-Command -ComputerName <servername> -Credential <username> -ScriptBlock {[Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey("LocalMachine",$env:COMPUTERNAME).OpenSubKey("System\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\StandardProfile").GetValue("EnableFirewall")}

1は有効であることを意味します。

4
Ayan Mullick

コンプライアンスチェックと非コンプライアンスチェックにこれを試してください。

$FirewallStatus = 0
$SysFirewallReg1 = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\DomainProfile" -Name EnableFirewall | Select-Object -ExpandProperty EnableFirewall
If ($SysFirewallReg1 -eq 1) {
$FirewallStatus = 1
}

$SysFirewallReg2 = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\PublicProfile" -Name EnableFirewall | Select-Object -ExpandProperty EnableFirewall
If ($SysFirewallReg2 -eq 1) {
$FirewallStatus = ($FirewallStatus + 1)
}

$SysFirewallReg3 = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\StandardProfile" -Name EnableFirewall | Select-Object -ExpandProperty EnableFirewall
If ($SysFirewallReg3 -eq 1) {
$FirewallStatus = ($FirewallStatus + 1)
}

If ($FirewallStatus -eq 3) {Write-Host "Compliant"}
ELSE {Write-Host "Non-Compliant"}
2
Robert N

ファイアウォールのGPO=ポリシーも確認してください。ポリシーはレジストリに格納されていませんが、別のストアにあります。この質問も参照してください。 Powershell出力間で異なるWindowsファイアウォールの状態およびGUI

1
Erik Oppedijk

one-linerとして記述:

if (((Get-NetFirewallProfile | select name,enabled) | where { $_.Enabled -eq $True } | measure ).Count -eq 3) {Write-Host "OK" -ForegroundColor Green} else {Write-Host "OFF" -ForegroundColor Red}

それは何ですか?

  • 各ファイアウォール設定項目を反復処理します:[Domain, Private, Public]
  • 各アイテムが有効になっているかどうかを確認し、TRUEに設定します
  • 3つのアイテムがあるため、すべてのTRUEをカウントして3と比較します
  • OKまたは赤OFFを印刷
  • [〜#〜] not [〜#〜]netshまたはレジストリを使用
  • Get-NetFirewallProfileコマンドレットには、機能するNetSecurityモジュールが必要です。
0
not2qubit
$Compliance = 'Non-Compliant'
$Check = get-netfirewallprofile | Where-Object {$_.Name -eq 'Domain' -and $_.Enabled -eq 'True'}
$Check = get-netfirewallprofile | Where-Object {$_.Name -eq 'Public' -and $_.Enabled -eq 'True'}
$Check = get-netfirewallprofile | Where-Object {$_.Name -eq 'Private' -and $_.Enabled -eq 'True'}
if ($Check) {$Compliance = 'Compliant'}
$Compliance
0
Garrett

引き継いだ環境についても、同様のことをしなければなりませんでした。以下を使用して、3つのプロファイルすべての状態を確認しました。

invoke-command -computername $computer  -scriptblock {
    try{ get-netfirewallprofile | select name,enabled }
    catch{ netsh advfirewall show all state }
}

tryブロックは、サーバー2012またはWindows 8以降のシステムで動作します。キャッチされるコマンドレットがないというエラーがスローされて失敗した場合、エラーを表示する代わりに、netshを使用して情報を表示します。

私はこれをサーバー2008 R2、2012 R2、2016で使用して、良い結果を得ました。それがあなたのために働くことを願っています!

0
Mike Murray

私はこれが初めてですが、詳細を取得するためにregクエリを使用したことがありました。

これをコマンドラインに入力してEnterキーを押します。

reg query \\IP_Address\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\StandardProfile

私は自分の作品でそれを使用しており、以下のコマンドも使用していました。

reg query \\ip_address\path
0
user3007585