15

我在安装程序中使用netsh advfirewall firewall命令添加 Windows 防火墙规则。如果系统禁用了 Windows 防火墙,我的代码会给出错误消息。

所以我需要在执行命令netsh advfirewall firewall add之前检查窗口的防火墙状态。即,如果防火墙被禁用,则无需添加规则。

我正在使用窗口注册表值“ EnableFirewall ”检查防火墙是否已启用。

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

我不确定这是正确的方法。也可以有域防火墙配置文件(?)。

提前致谢。

4

8 回答 8

13

另一种选择是使用netsh自身检查防火墙是否启用。执行命令netsh advfirewall show private|public|domain。它将打开/关闭状态。

于 2012-09-12T11:41:08.887 回答
4

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表示启用。

于 2014-01-22T21:04:22.580 回答
3

试试这个进行合规性和不合规性检查:

$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"}
于 2018-10-02T22:37:03.613 回答
2

我只需要为我接管的环境做类似的事情。我使用以下内容检查所有三个配置文件的状态。

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

try 块将适用于 server 2012 或 windows 8 和更新的系统。如果当它抛出一个关于没有将被捕获的 cmdlet 的错误时失败,而不是给你一个错误,它将回退到使用 netsh 来显示信息。

我在服务器 2008 R2、2012 R2 和 2016 上使用了它,效果很好。希望这对你有用!

于 2017-03-06T22:26:14.303 回答
2

写成单行

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 个项目,所以我们计算所有 TRUES 并与 3 进行比较
  • 打印绿色OK或红色OFF
  • 使用netsh或注册
  • 需要Get-NetFirewallProfile cmdlet的工作NetSecurity模块。
于 2019-02-04T12:54:20.817 回答
1

确保还检查防火墙的 GPO 策略,它们不存储在注册表中,而是存储在另一个存储中,也请参阅此问题: Windows Firewall state different between Powershell output and GUI

于 2018-02-28T12:25:41.090 回答
0

我对此并不陌生,但是我如何使用 reg 查询来获取详细信息。

在命令行中输入它并按回车键。

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

我在我的作品中使用它,并且也在使用下面的命令。

reg query \\ip_address\path
于 2013-11-19T06:33:30.460 回答
0
$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
于 2018-03-02T18:18:09.233 回答