web-dev-qa-db-fra.com

Comment vérifier que le pare-feu Windows est activé ou n'utilise pas de commandes

J'ajoute une règle de pare-feu Windows à l'aide de netsh advfirewall firewall command dans un programme d'installation. Mon code affiche un message d'erreur si le pare-feu Windows est désactivé sur le système.

J'ai donc besoin de vérifier l'état du pare-feu de la fenêtre avant d'exécuter la commande netsh advfirewall firewall add . Autrement dit, si le pare-feu est désactivé, il n'est pas nécessaire d'ajouter la règle.

Je vérifie si le pare-feu est activé ou non en utilisant la valeur de registre de fenêtre " EnableFirewall ".

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

Je ne suis pas sûr que ce soit la bonne façon. Il peut également y avoir un profil de pare-feu de domaine (?).

Merci d'avance.

11
JChan

Une autre option consiste à utiliser netsh lui-même pour vérifier si le pare-feu est activé ou non. Exécutez la commande netsh advfirewall show private|public|domain. Cela donnera l'état on/off.

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 signifie activé.

2
Ayan Mullick

Essayez ceci pour un contrôle de conformité et de non-conformité:

$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

Vérifiez également que les règles GPO relatives aux pare-feu ne sont pas stockées dans le registre mais dans un autre magasin. Consultez également la question suivante: L'état du pare-feu Windows est différent entre la sortie Powershell et l'interface graphique

1
Erik Oppedijk

Écrit comme un une ligne

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}

Ce qu'il fait? 

  • Parcourt chaque élément des paramètres du pare-feu: [Domain, Private, Public]
  • Vérifiez si chaque élément est activé et défini sur TRUE
  • Il y a 3 éléments, nous comptons donc toutes les VRAIES et comparons à 3
  • Imprimer Vert OK ou Rouge OFF
  • NOTusing netsh ou le registre
  • Nécessite un module NetSecurity en état de fonctionnement pour la 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

Je devais juste faire quelque chose de similaire pour un environnement que j'ai repris. J'ai utilisé ce qui suit pour vérifier l'état des trois profils.

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

le bloc try fonctionnera avec le serveur 2012 ou Windows 8 et les systèmes plus récents. si cela échoue quand il génère une erreur sur le fait de ne pas avoir la cmdlet qui sera capturée et au lieu de vous donner une erreur, il utilisera netsh pour afficher les informations. 

J'ai utilisé cela sur le serveur 2008 R2, 2012 R2 et 2016 avec de bons résultats. J'espère que ça marche pour toi!

0
Mike Murray

Je suis nouveau à cela, mais comment j'ai jamais utilisé la requête reg pour obtenir les détails.

tapez ceci en ligne de commande et appuyez sur Entrée.

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

Je l'utilisais dans mes œuvres et j'utilisais aussi la commande ci-dessous.

reg query \\ip_address\path
0
user3007585