如何使用命令启用或不启用Windows防火墙

时间:2012-07-05 19:57:21

标签: windows security windows-firewall

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

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

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

HKEY_LOCAL_MACHINE \ SYSTEM \ CURRENTCONTROLSET \服务\ SharedAccess \参数\ FirewallPolicy \ StandardProfile

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

提前致谢。

8 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:2)

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 :(得分:1)

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

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

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

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

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

reg query \\ip_address\path

答案 5 :(得分:0)

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

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

try块可用于服务器2012或Windows 8和更新的系统。如果失败时它会抛出一个错误,即没有捕获的cmdlet,而不是给你一个错误,它将回退到使用netsh来显示信息。

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

答案 6 :(得分: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

答案 7 :(得分:0)

写为单行

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个项目,因此我们计算所有TRUE,然后与3进行比较
  • 打印绿色OK或红色OFF
  • 使用netsh或注册表
  • Get-NetFirewallProfile cmdlet需要一个有效的NetSecurity模块。