注意:#command-line 标签并不意味着仅限批处理文件,我将接受 PowerShell 脚本或任何可免费使用的实用程序,它们可以从命令行启动并无人值守地完成其工作。
总结
如何在 Windows Vista 到 Windows 10 的任何界面(显示)语言上无人值守地将防火墙规则准确转换为 GUI 所呈现的状态?
详尽阐述
这个问题类似于#786383,但并不一样。
基本上,因为答案对我来说并不好:
set rule group="remote desktop" new enable=Yes
为公共网络开放端口 3389,我想避免这种情况。另外,不同的 Windows 语言有不同的组名,但我需要一个通用的解决方案。netsh firewall set service type = remotedesktop mode = enable
对我来说也不起作用:它自 win7 以来就被弃用了,并且仅允许当前网络使用 rdp(如果您在公共网络中,3389 将对公共网络开放,之后将无法在私有网络中工作)。
请注意,在通过 GUI 启用 RDP 之前,每个 RDP 协议只有一个规则。但是,当通过 GUI 启用 RDP 时,端口只会为私有网络和域网络打开,并且规则会因此而分裂。启用后,Windows 8+ 中有 4 条规则,Windows XP、Vista 和 7 中有 2 条规则(无 UDP)。
我目前正在使用的解决方法是添加我自己的规则:
netsh.exe advfirewall firewall add rule name="Remote Desktop - User Mode (TCP-In)" dir=in action=allow program="%%SystemRoot%%\system32\svchost.exe" service="TermService" description="Inbound rule for the Remote Desktop service to allow RDP traffic. [TCP 3389] added by LogicDaemon's script" enable=yes profile=private,domain localport=3389 protocol=tcp
netsh.exe advfirewall firewall add rule name="Remote Desktop - User Mode (UDP-In)" dir=in action=allow program="%%SystemRoot%%\system32\svchost.exe" service="TermService" description="Inbound rule for the Remote Desktop service to allow RDP traffic. [UDP 3389] added by LogicDaemon's script" enable=yes profile=private,domain localport=3389 protocol=udp
但这很糟糕,因为(与标准脚本不同)它们可以被用户修改,没有组(与其他脚本一起工作),并且在通过 GUI 关闭 RDP 时不会自动禁用。
截图
通过 GUI 启用 RDP 时的规则相同(我想要获取的状态):
我不会重述这场与 Windows 命令行实用程序的斗争的整个故事,除非有人问起。以下是那个俄语故事。
答案1
netsh firewall set service type = remotedesktop mode = enable
或者
REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f
答案2
如果我正确理解了这个问题,这将让你得到你想要的。这是 PowerShell:
$FireWall = New-Object -comObject HNetCfg.FwPolicy2
$EnableRules = $FireWall.rules | Where-Object {$_.LocalPorts -like "*3389*" -and $_.Profiles -eq "3"}
ForEach ($Rule In $EnableRules){($Rule.Enabled = "True")}
这将过滤掉规则并获取与语言无关的正确规则名称。它通过在端口 3389 上进行过滤并查找与“域和私有网络”关联的规则来实现这一点。Profiles -eq 3
是私有网络和域网络的位图掩码,您可以在此处查看参考:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa366303(v=vs.85).aspx
其中 1(域网络)+ 2(私有网络)= 3
以下是我找到其余内容的 MSDN 链接:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa365309(v=vs.85).aspx
下面我来介绍一下我如何了解其他对象的属性和方法:
PS C:\> $FireWall | Get-Member
TypeName: System.__ComObject#{98325047-c671-4174-8d81-defcd3f03186}
Name MemberType Definition
---- ---------- ----------
EnableRuleGroup Method void EnableRuleGroup (int, string, bool)
IsRuleGroupEnabled Method bool IsRuleGroupEnabled (int, string)
RestoreLocalFirewallDefaults Method void RestoreLocalFirewallDefaults ()
BlockAllInboundTraffic ParameterizedProperty bool BlockAllInboundTraffic (NET_FW_PROFILE_TYPE2...
DefaultInboundAction ParameterizedProperty NET_FW_ACTION_ DefaultInboundAction (NET_FW_PROFI...
DefaultOutboundAction ParameterizedProperty NET_FW_ACTION_ DefaultOutboundAction (NET_FW_PROF...
ExcludedInterfaces ParameterizedProperty Variant ExcludedInterfaces (NET_FW_PROFILE_TYPE2_...
FirewallEnabled ParameterizedProperty bool FirewallEnabled (NET_FW_PROFILE_TYPE2_) {get...
IsRuleGroupCurrentlyEnabled ParameterizedProperty bool IsRuleGroupCurrentlyEnabled (string) {get}
NotificationsDisabled ParameterizedProperty bool NotificationsDisabled (NET_FW_PROFILE_TYPE2_...
UnicastResponsesToMulticastBroadcastDisabled ParameterizedProperty bool UnicastResponsesToMulticastBroadcastDisabled...
CurrentProfileTypes Property int CurrentProfileTypes () {get}
LocalPolicyModifyState Property NET_FW_MODIFY_STATE_ LocalPolicyModifyState () {g...
Rules Property INetFwRules Rules () {get}
ServiceRestriction Property INetFwServiceRestriction ServiceRestriction () {g...
PS C:\> $Rules | Get-Member
TypeName: System.__ComObject#{9c27c8da-189b-4dde-89f7-8b39a316782c}
Name MemberType Definition
---- ---------- ----------
Action Property NET_FW_ACTION_ Action () {get} {set}
ApplicationName Property string ApplicationName () {get} {set}
Description Property string Description () {get} {set}
Direction Property NET_FW_RULE_DIRECTION_ Direction () {get} {set}
EdgeTraversal Property bool EdgeTraversal () {get} {set}
EdgeTraversalOptions Property int EdgeTraversalOptions () {get} {set}
Enabled Property bool Enabled () {get} {set}
Grouping Property string Grouping () {get} {set}
IcmpTypesAndCodes Property string IcmpTypesAndCodes () {get} {set}
Interfaces Property Variant Interfaces () {get} {set}
InterfaceTypes Property string InterfaceTypes () {get} {set}
LocalAddresses Property string LocalAddresses () {get} {set}
LocalPorts Property string LocalPorts () {get} {set}
Name Property string Name () {get} {set}
Profiles Property int Profiles () {get} {set}
Protocol Property int Protocol () {get} {set}
RemoteAddresses Property string RemoteAddresses () {get} {set}
RemotePorts Property string RemotePorts () {get} {set}
serviceName Property string serviceName () {get} {set}
答案3
以下 cmd 命令..
netsh firewall set service type = remotedesktop mode = enable
和
REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /
不足以启用远程桌面。
我必须添加这个才能使其工作(客户端:Windows 10)。
netsh advfirewall firewall add rule name="Open Remote Desktop" protocol=TCP dir=in localport=3389 action=allow
答案4
如果您正在寻找 PowerShell 解决方案,可以使用以下内容:
Enable-NetFirewallRule -Name "RemoteDesktop-UserMode-In-TCP"
Enable-NetFirewallRule -Name "RemoteDesktop-UserMode-In-UDP"