セットアッププログラムでnetsh advfirewall firewallコマンドを使用してWindowsファイアウォールルールを追加しています。システムでWindowsファイアウォールが無効になっていると、コードでエラーメッセージが表示されます。
したがって、コマンドnetsh advfirewall firewall addを実行する前に、ウィンドウのファイアウォールステータスを確認する必要があります。つまり、ファイアウォールが無効になっている場合、ルールを追加する必要はありません。
ウィンドウレジストリ値 "EnableFirewall"を使用して、ファイアウォールが有効になっているかどうかを確認しています。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\StandardProfile
これが正しい方法かどうかはわかりません。ドメインファイアウォールプロファイル(?)も使用できます。
前もって感謝します。
もう1つのオプションは、netsh
自体を使用して、ファイアウォールが有効になっているかどうかを確認することです。コマンドnetsh advfirewall show private|public|domain
を実行します。状態のオン/オフを示します。
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
は有効であることを意味します。
コンプライアンスチェックと非コンプライアンスチェックにこれを試してください。
$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"}
ファイアウォールのGPO=ポリシーも確認してください。ポリシーはレジストリに格納されていませんが、別のストアにあります。この質問も参照してください。 Powershell出力間で異なるWindowsファイアウォールの状態およびGUI
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
に設定しますOK
または赤OFF
を印刷netsh
またはレジストリを使用NetSecurity
モジュールが必要です。$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
引き継いだ環境についても、同様のことをしなければなりませんでした。以下を使用して、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で使用して、良い結果を得ました。それがあなたのために働くことを願っています!
私はこれが初めてですが、詳細を取得するためにregクエリを使用したことがありました。
これをコマンドラインに入力してEnterキーを押します。
reg query \\IP_Address\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\StandardProfile
私は自分の作品でそれを使用しており、以下のコマンドも使用していました。
reg query \\ip_address\path