web-dev-qa-db-de.com

So prüfen Sie, ob die Windows-Firewall aktiviert ist oder Befehle nicht verwendet

Ich füge eine Windows-Firewallregel hinzu, die den Befehlnetsh advfirewall firewallbefehl in einem Setup-Programm verwendet. Mein Code gibt eine Fehlermeldung aus, wenn die Windows-Firewall deaktiviert ist.

Daher muss ich den Firewall-Status des Fensters überprüfen, bevor Sie den Befehl netsh advfirewall firewall add ausführen. dh wenn die Firewall deaktiviert ist, müssen Sie die Regel nicht hinzufügen.

Ich überprüfe, ob die Firewall aktiviert ist oder nicht, indem ich den Fensterregistrierungswert " EnableFirewall " verwende.

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

Ich bin nicht sicher, ob das der richtige Weg ist. Es kann auch ein Domänen-Firewall-Profil (?) Vorhanden sein.

Danke im Voraus.

11
JChan

Eine andere Option ist die Verwendung von netsh selbst, um zu prüfen, ob die Firewall aktiviert ist oder nicht. Führen Sie den Befehl netsh advfirewall show private|public|domain aus. Der Zustand wird ein-/ausgeschaltet.

9
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 bedeutet aktiviert.

2
Ayan Mullick

Versuchen Sie dies für einen Compliance- und Nicht-Compliance-Check:

$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"}
1
Robert N

Überprüfen Sie auch die GPO -Richtlinien für Firewalls. Sie werden nicht in der Registrierung gespeichert, sondern in einem anderen Geschäft. Siehe auch diese Frage: Windows-Firewall-Status unterscheidet sich zwischen Powershell-Ausgabe und GUI

1
Erik Oppedijk

Geschrieben als 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}

Was es macht? 

  • Durchläuft jedes Element der Firewall-Einstellungen: [Domain, Private, Public]
  • Überprüfen Sie, ob jedes Element aktiviert ist, und legen Sie TRUE fest.
  • Es gibt 3 Artikel, also zählen wir alle TRUES und vergleichen mit 3
  • Druck grün OK oder rot OFF
  • NICHTmit netsh oder Registry
  • Erfordert ein funktionsfähiges NetSecurity-Modul für das Cmdlet Get-NetFirewallProfile.
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

Ich musste nur etwas Ähnliches für eine Umgebung tun, die ich übernahm. Ich habe den folgenden Status verwendet, um den Status aller drei Profile zu überprüfen.

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

der try-Block funktioniert mit Server 2012 oder Windows 8 und neueren Systemen. Wenn dies fehlschlägt, wenn ein Fehler ausgegeben wird, der besagt, dass das Cmdlet nicht abgefangen wird, und anstatt Ihnen einen Fehler zu melden, wird Netsh zur Anzeige der Informationen verwendet. 

Ich habe dies auf Server 2008 R2, 2012 R2 und 2016 mit guten Ergebnissen verwendet. Hoffe es funktioniert für dich!

0
Mike Murray

Ich bin neu in diesem Bereich, aber wie auch immer ich reg Abfrage verwendet habe, um die Details zu erhalten.

geben Sie dies in die Befehlszeile ein und drücken Sie die Eingabetaste.

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

Ich habe es in meinen Werken verwendet und auch den folgenden Befehl verwendet.

reg query \\ip_address\path
0
user3007585