Ответ 1
Другой вариант - использовать netsh
сам, чтобы проверить, включен ли брандмауэр или нет. Выполните команду netsh advfirewall show private|public|domain
. Он будет включать/выключать состояние.
Я добавляю правило брандмауэра Windows, используя команду netsh advfirewall firewall в программе установки. Мой код выдает сообщение об ошибке, если в системе отключен брандмауэр Windows.
Поэтому мне нужно проверить состояние брандмауэра окна перед выполнением команды netsh advfirewall firewall add. т.е. если брандмауэр отключен, не нужно добавлять правило.
Я проверяю, включен ли брандмауэр или нет, используя значение реестра Windows EnableFirewall.
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Параметры\FirewallPolicy\StandardProfile
Я не уверен, что это правильный путь. Также может быть профиль брандмауэра домена (?).
Спасибо заранее.
Другой вариант - использовать 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
означает, что он включен.
Обязательно проверяйте также политики GPO для брандмауэров, они не хранятся в реестре, но в другом магазине также см. этот вопрос: Состояние брандмауэра Windows отличается между выходом PowerShell и графическим интерфейсом
Попробуйте это для проверки соответствия и несоответствия:
$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"}
Я новичок в этом, но как бы я ни использовал reg query, чтобы получить детали.
введите это в командной строке и нажмите Enter.
reg query \\IP_Address\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\StandardProfile
Я использовал это в своих работах, а также использовал команду ниже.
reg query \\ip_address\path
Мне просто нужно было сделать что-то подобное для среды, в которой я принял участие. Я использовал ниже, чтобы проверить состояние для всех трех профилей.
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 с хорошими результатами. Надеюсь, это сработает для вас!
Написано в виде одной строки:
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
для командлета 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