从命令行在Windows防火墙中启用远程桌面


12

注意:#commandline-line标记并不意味着仅批处理文件,我将接受PowerShell脚本或任何可免费使用的实用程序,它们可以从命令行启动并在无人值守的情况下完成其工作。


tl; dr

在Windows Vista上如何将无规则的防火墙规则准确地转换成状态GUI所说的,放在Windows Vista到任何界面(显示)语言的Windows 10上?

细化

这个问题类似于#786383,但是不一样。

基本上,因为答案对我不利:

  1. set rule group="remote desktop" new enable=Yes为公共网络打开端口3389,我想避免这种情况。另外,不同的Windows语言具有不同的组名,但是我需要一个通用的解决方案。
  2. 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之前的防火墙规则* **

通过GUI启用RDP时的规则相同(我要获取的状态):

并在GUI中禁用RDP之后:


在有人询问之前,我不会用Windows命令行实用程序讲述这场斗争的全部故事。这是俄语的故事


1
因此,我是否能正确地总结一下,您是否想要2个内置的防火墙规则,这些规则仅在域和专用配置文件上在端口3389上启用UDP / TCP?
内森·赖斯

几乎。首先,是的,我要修改内置规则。其次,是的,我希望内置规则在域和专用网络上启用3389。但是,这里有一个棘手的部分(否则它将被回答):首先让我们谈谈TCP。默认情况下,{Public}和{Doman,Private}网络没有单独的规则。{All}网络有一个规则。但是,通过GUI启用RDP时,会出现两个规则,一个规则用于{Public},一个规则用于{Doman,Private}。与UDP相同。另外我还添加了屏幕截图,可能还会澄清一下。
LogicDaemon

Answers:


8
netsh firewall set service type = remotedesktop mode = enable

要么

REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f

我试过了 netsh firewall已弃用(自win7起),在Win10中不起作用,并且仅将rdp用于当前网络(如果您在公共网络中,则rdp将被允许用于公共网络,此后将无法在专用网络中工作)。这是在原始故事中提到的,我只是认为不值得一提。我会解决这个问题。
LogicDaemon

虽然确实已弃用,netsh firewall但仍可在Windows 10中使用(在Pro上测试)。
我说恢复莫妮卡的时间

2
@Twisty我确认,它确实适用于版本1607(内部版本14393.693)。当我写上一条评论时,我在当前版本(尚未发布)中对其进行了测试,但是它不起作用。
LogicDaemon

3

如果我正确理解了这个问题,那么您会得到想要的东西。这是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/zh-CN/library/windows/desktop/aa366303(v=vs.85).aspx

其中1(域网络)+ 2(专用网络)= 3

这是我找出其余部分的MSDN链接:

https://msdn.microsoft.com/zh-CN/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}

不知道为什么,但是它说没有i.imgur.com/A0OmzZ8.png这样的属性。我猜这是因为直到通过GUI第一次启用RDP,才没有这样的规则,所有网络(公共,私有,域)只有一条规则。但是,当通过GUI启用时,此规则将被拆分!也有错字)}
LogicDaemon

在Windows 8上,没有错误,但完全没有完成i.imgur.com/te0J1Q9.png。在首次通过GUI启用RDP之前,请先查看防火墙规则:i.imgur.com/sEIE0me.png,然后再通过GUI禁用i.imgur.com/PjnFOh1.png。通过GUI启用RDP时,使用相同的规则(状态我要获取):i.imgur.com/c3ywfHy.png
LogicDaemon

0

如果您正在寻找PowerShell解决方案,则可以使用以下方法:

Enable-NetFirewallRule -Name "RemoteDesktop-UserMode-In-TCP"
Enable-NetFirewallRule -Name "RemoteDesktop-UserMode-In-UDP"

0

以下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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.