我知道以下 cmd 可以启用文件和打印共享防火墙规则:
netsh advfirewall firewall set rule group="File and Printer Sharing" new enable=yes
但它会为所有配置文件启用文件和打印共享。
我想只为私人配置文件启用它,即当 Windows PC/笔记本电脑连接到家庭或工作网络时。我特别避免为连接到公共网络的笔记本电脑打开它。理想情况下,公共网络的网络发现应该关闭。
我试过了
netsh advfirewall firewall set rule group=”File and Printer Sharing” profile=private new enable=Yes
并且“配置文件”开关被拒绝。那么我该如何有选择地应用防火墙规则呢?
非常感谢您的任何意见。
答案1
您正在激活一条预设规则,我猜测该预设规则中包含以下内容Profile=any
。
首先尝试一下:
netsh advfirewall firewall set rule group="File and Printer Sharing" new profile=private
答案2
netsh advfirewall firewall set rule name="File and Printer Sharing (SMB-In)" dir=in profile=public|private|domain new enable=Yes|No
要同时设置三个配置文件,请使用:
netsh advfirewall firewall set rule name="File and Printer Sharing (SMB-In)" dir=in new enable=Yes
规则名称必须改成你当地的语言,例如:
netsh advfirewall firewall set rule name="檔案及印表機共用 (SMB-In)" dir=in profile=private new enable=Yes
不要忘记以管理员身份运行。
答案3
围绕这个主题,在极少数情况下,使用本地语言名称不起作用,即波兰语Udostępnianie plików i drukarek (SMB — ruch przychodzący)
= File and Printer Sharing (SMB-In)
。我相信这与 netsh 中的 UTF-8 处理有关,因为有报告称使用 netsh 连接到 UTF 命名的 wifi 网络有时也不起作用。
在这些情况下,请使用 PowerShellSet-NetFirewallRule
和与语言无关的“名称”参数(在本例中为FPS-SMB-In-TCP
)。使用Get-NetFirewallRule
命令获取规则的所有正确名称。
答案4
构建于@Mulder 的回答,若要启用其私人模式,需要在“高级安全 Windows Defender 防火墙”中针对每条规则进行专门设置。
运行高级安全 Windows Defender 防火墙
在管理 Powershell 窗口中运行以下命令...以查看可能的规则:& "C:\WINDOWS\system32\mmc.exe" "C:\WINDOWS\system32\wf.msc"
仅允许在专用网络上访问文件/打印
在管理 Powershell 窗口中运行以下命令。
# Allow access to administrative shares through firewall [Ref: https://serverfault.com/a/968310/336668]
$ruleDisplayNames = "File and Printer Sharing (Echo Request - ICMPv4-In)", `
"File and Printer Sharing (Echo Request - ICMPv6-In)", `
"File and Printer Sharing (LLMNR-UDP-In)", `
"File and Printer Sharing (NB-Datagram-In)", `
"File and Printer Sharing (NB-Name-In)", `
"File and Printer Sharing (SMB-In)", `
"File and Printer Sharing (Spooler Service - RPC)", `
"File and Printer Sharing (Spooler Service - RPC-EPMAP)", `
"File and Printer Sharing (NB-Session-In)"
$rules = Get-NetFirewallRule | Where {$ruleDisplayNames -contains $_.DisplayName -and $_.Profile -ne "Domain"}
# The default rules have the non-Domain rule apply for both Public and
# Private. This updates the rule to be Private only
$rules | Set-NetFirewallRule -Profile Private
# Enable the rule -- i.e. grant the eexception (allow through firewall)
$rules | Enable-NetFirewallRule