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.
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.
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é.
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"}
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
É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?
[Domain, Private, Public]
TRUE
OK
ou Rouge OFF
netsh
ou le registreNetSecurity
en état de fonctionnement pour la cmdlet Get-NetFirewallProfile.$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
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!
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