如何使用命令检查Windows防火墙是否已启用

17

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

所以,在执行命令 netsh advfirewall firewall add 之前,需要检查Windows防火墙的状态。也就是说,如果防火墙被禁用,则无需添加该规则。

我通过使用窗口注册表值 "EnableFirewall" 来检查防火墙是否启用。

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

我不确定这是否是正确的方式。还可能存在域防火墙配置文件(?)。

提前致谢。


我认为我可以从注册表值HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\SharedAccess\Parameters中找到它。 - JChan
1
请记住,Windows防火墙可能不是唯一激活的防火墙。 - Mark Ransom
8个回答

13

另一个选择是使用netsh本身来检查防火墙是否启用。执行命令netsh advfirewall show private|public|domain,它将给出状态开/关。


7
无法在Win7专业版中运行。有效的方法是使用 netsh advfirewall show currentprofile 命令。 - Macke
1
该命令为 **netsh advfirewall show all state**。您可以将 all 替换为 privatepublic 或 **domain**。 - Paul

4

Invoke-Command -ComputerName <服务器名> -Credential <用户名> -ScriptBlock {[Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey("LocalMachine",$env:COMPUTERNAME).OpenSubKey("System\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\StandardProfile").GetValue("EnableFirewall")}

1 表示启用防火墙。


1
你应该查询CurrentControlSet,而不是任何ControlSet。 - Karsten Hahn

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

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}

这段代码是用来做什么的?

  • 遍历每个防火墙设置项:[域、专用、公共]
  • 检查每个项目是否启用并设置为TRUE
  • 由于有3个项目,所以我们计算所有的TRUE并与3进行比较
  • 打印绿色的OK或红色的OFF
  • 使用netsh或注册表
  • 需要一个可用的NetSecurity模块来运行Get-NetFirewallProfile命令。

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来显示信息。

我在Server 2008 R2、2012 R2和2016上使用过这个方法,效果很好。希望对您有用!


1

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

感谢您提供这段代码片段,它可能会提供一些有限的、即时的帮助。通过展示为什么这是一个好的解决方案,一个适当的解释将极大地提高其长期价值,并使其对未来读者具有其他类似问题更有用。请[编辑]您的答案以添加一些解释,包括您所做出的假设。 - gunr2171

0

我是新手,但我使用了 reg query 来获取详细信息。

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

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

我在我的工作中使用它,也在使用以下命令。

reg query \\ip_address\path

1
注册表路径中的"HKEY"缺少字母"K"。因为字符数少于6个,因此SO不允许我编辑... - voidmain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接