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

Log*_*mon 16 windows remote-desktop command-line windows-firewall unattended

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


tl;博士

如何在 Windows Vista 到任何界面(显示)语言的 Windows 10 上,以无人值守的方式将防火墙规则完全转换为状态 GUI 放置它?

细化

这个问题与#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
Run Code Online (Sandbox Code Playgroud)

但这很糟糕,因为(与标准的不同)它们可以由用户修改,没有组(与其他脚本一起使用),并且在通过 GUI 关闭 RDP 时不会自动禁用。

截图

首次通过 GUI 启用 RDP 之前的防火墙规则* **

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

在 GUI 中禁用 RDP 后:


在有人问起之前,我不会用 Windows 命令行实用程序复述这场战斗的整个故事。这是俄语故事

STT*_*TTR 11

netsh firewall set service type = remotedesktop mode = enable
Run Code Online (Sandbox Code Playgroud)

或者

REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f
Run Code Online (Sandbox Code Playgroud)

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

Nat*_*ice 5

如果我正确理解了这个问题,这会让你得到你想要的。这是 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")}
Run Code Online (Sandbox Code Playgroud)

这将过滤掉规则并获取与语言无关的正确规则名称。它通过过滤端口 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}
Run Code Online (Sandbox Code Playgroud)