问题 如何使用命令启用或不启用窗口防火墙


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

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

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

HKEY_LOCAL_MACHINE \系统\ CurrentControlSet \服务\ SharedAccess \参数\ FirewallPolicy \ StandardProfile

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

提前致谢。


7346
2017-07-05 19:57


起源

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


答案:


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


9
2017-09-12 11:41



不适用于Win7专业版。有用的是什么 netsh advfirewall show currentprofile。 - Macke
命令是 netsh advfirewall show all state。你可以替换 all 通过 private 要么 public 要么 domain - Paul


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 意味着启用。


2
2018-01-22 21:04



您应该查询CurrentControlSet,而不是任何ControlSet。 - Katja Hahn


确保还检查防火墙的GPO策略,它们不存储在注册表中,但在另一个存储中,也请查看此问题: Windows防火墙状态在Powershell输出和GUI之间有所不同


1
2018-02-28 12:25





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

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


0
2018-03-06 22:26





我是新手,但我怎么用reg查询来获取详细信息。

在命令行中键入此命令并按Enter键。

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

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

reg query \\ip_address\path

0
2017-11-19 06:33



注册表路径中的HKEY中缺少字母“K”。所以不会让我编辑,因为它不到6个字符的变化...... - voidmain


请尝试此操作以进行合规性和不合规性检查:

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

0
2017-10-02 22:37





$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

-2
2018-03-02 18:18



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