Как проверить брандмауэр окна включен или нет, используя команды

Я добавляю правило брандмауэра Windows, используя команду netsh advfirewall firewall в программе установки. Мой код выдает сообщение об ошибке, если в системе отключен брандмауэр Windows.

Поэтому мне нужно проверить состояние брандмауэра окна перед выполнением команды netsh advfirewall firewall add. т.е. если брандмауэр отключен, не нужно добавлять правило.

Я проверяю, включен ли брандмауэр или нет, используя значение реестра Windows EnableFirewall.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Параметры\FirewallPolicy\StandardProfile

Я не уверен, что это правильный путь. Также может быть профиль брандмауэра домена (?).

Спасибо заранее.

Ответ 1

Другой вариант - использовать netsh сам, чтобы проверить, включен ли брандмауэр или нет. Выполните команду netsh advfirewall show private|public|domain. Он будет включать/выключать состояние.

Ответ 2

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

Попробуйте это для проверки соответствия и несоответствия:

$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"}

Ответ 5

Я новичок в этом, но как бы я ни использовал reg query, чтобы получить детали.

введите это в командной строке и нажмите Enter.

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

Я использовал это в своих работах, а также использовал команду ниже.

reg query \\ip_address\path

Ответ 6

Мне просто нужно было сделать что-то подобное для среды, в которой я принял участие. Я использовал ниже, чтобы проверить состояние для всех трех профилей.

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 с хорошими результатами. Надеюсь, это сработает для вас!

Ответ 7

Написано в виде одной строки:

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 пункта, поэтому мы считаем все ИСТИНЫ и сравниваем с 3
  • Печатать Зеленый OK или Красный OFF
  • НЕ использовать netsh или реестр
  • Требуется работающий NetSecurity для командлета Get-NetFirewallProfile.

Ответ 8

$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