コマンドラインからWindowsファイアウォールでリモートデスクトップを有効にする


12

注:#command-lineタグはバッチファイルのみを意味するものではありません。PowerShellスクリプトまたは自由に利用できるユーティリティを受け入れます。これらのユーティリティは、コマンドラインから開始して無人で作業を終了できます。


tl; dr

Windows Vistaで任意のインターフェイス(表示)言語のファイアウォールルールを無人で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のプロトコルごとに1つのルールしかないことに注意してください。ただし、RDPがGUIを介して有効になっている場合、ポートはプライベートネットワークとドメインネットワークに対してのみ開かれ、ルールが分割されます。有効にした後、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
では、ドメインおよびプライベートプロファイルに対してのみポート3389でUDP / TCPを有効にする2つの組み込みファイアウォールルールが必要であることを要約すると正しいですか?
Nathan Rice

ほとんど。まず、はい、組み込みのルールを変更します。次に、はい、組み込みのルールでドメインおよびプライベートネットワークで3389を有効にします。しかし、ここでは注意が必要な部分があります(そうでない場合は既に回答されています)。まず、TCPについて説明しましょう。デフォルトでは、{Public}および{Doman、Private}ネットワークに個別のルールはありません。{All}ネットワークには1つのルールがあります。しかし、GUIを介してRDPを有効にすると、{Public}用と{Doman、Private}用の2つのルールが表示されます。UDPと同じです。また、スクリーンショットを追加しましたが、少しわかりやすくすることもあります。
LogicDaemon 2015

回答:


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 2015

確かに非推奨ですが、netsh firewallWindows 10(Proでテスト済み)でも動作します。
私はモニカを2017

2
@Twisty私は確かにバージョン1607(ビルド14393.693)で動作します。前のコメントを書いているときに、現在のバージョンでテストしました(まだリリースはありませんでした)が、機能しませんでした。
LogicDaemon 2017年

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/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}

理由は不明ですが、そのようなプロパティは存在しないとi.imgur.com/A0OmzZ8.pngに記載されています。これは、RDPがGUIを介して初めて有効になるまで、そのようなルールはなく、すべてのネットワーク(パブリック、プライベート、ドメイン)に対して単一のルールがあるためだと思います。ただし、GUIで有効にすると、このルールは分割されます。また、タイプミスもあります)}
LogicDaemon 2015

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.