【问题标题】:How to check window's firewall is enabled or not using commands如何使用命令检查窗口的防火墙是否启用
【发布时间】:2012-07-06 06:57:08
【问题描述】:

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

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

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

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

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

提前致谢。

【问题讨论】:

  • 我想我可以从注册表值 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\SharedAccess\Parameters 中找到它。
  • 请记住,Windows 防火墙可能不是唯一激活的。

标签: windows security windows-firewall


【解决方案1】:

写成单行

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 模块。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      我是新手,但我是如何使用 reg 查询来获取详细信息的。

      在命令行中输入并回车。

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

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

      reg query \\ip_address\path
      

      【讨论】:

      • 注册表路径中的 HKEY 中缺少字母“K”。所以不会让我编辑,因为它少于 6 个字符的变化......
      【解决方案4】:
      $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
      

      【讨论】:

      • 感谢您提供此代码 sn-p,它可能会提供一些有限的即时帮助。 proper explanation would greatly improve its long-term value 通过展示为什么这是一个很好的解决问题的方法,并将使其对未来有其他类似问题的读者更有用。请edit您的回答添加一些解释,包括您所做的假设。
      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        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 上使用了这个,效果很好。希望它对你有用!

        【讨论】:

          【解决方案7】:

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

          【讨论】:

          • 您应该查询 CurrentControlSet,而不是任何 ControlSet。
          【解决方案8】:

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

          【讨论】:

          • 在 Win7 pro 中不起作用。有效的是netsh advfirewall show currentprofile
          • 命令是netsh advfirewall show all state。您可以将 all 替换为 privatepublicdomain
          猜你喜欢
          • 2013-09-14
          • 2012-11-27
          • 1970-01-01
          • 2016-09-10
          • 1970-01-01
          • 1970-01-01
          • 2012-02-14
          相关资源
          最近更新 更多