Active Directory 環境で OU 単位に「RDP を一括で有効化し、接続できるユーザーを社内グループに限定する」――この運用を、旧来 OS と Windows 11 24H2/Windows 2025 の違いまで踏み込み、実務でそのまま流せる形にまとめました。GPO 設計、Restricted Groups の使い分け、PowerShell スクリプト化、検証・ロールバックまでを網羅します。
前提と設計ゴール
本記事は、ドメイン参加済みの Windows クライアント(主に Windows 10/11)を、Active Directory の GPO で安全にリモートデスクトップ(RDP)接続可能にするための手順書です。狙いは以下の 3 点を OU 単位で一貫配布することです。
- RDP を OS 上で有効化(
fDenyTSConnections = 0) - 接続許可を特定のセキュリティグループのみに限定(例:
RDP-Users) - ファイアウォール(TCP 3389)を適切に開放、必要なら NLA を必須化
| 構成要素 | 具体策 | 配布方法 | ポイント |
|---|---|---|---|
| RDP 有効化 | レジストリ fDenyTSConnections=0 | 旧来:GPO の RDS ポリシー/24H2 以降:起動スクリプト推奨 | 24H2 以降は UI が「管理対象」で灰色固定になる事象に注意 |
| 接続許可の限定 | RDP-Users → ローカル Remote Desktop Users に編入 | Restricted Groups(「このグループが所属するグループ」) | ローカル「Remote Desktop Users」側を直接上書きしない |
| ファイアウォール | Inbound 3389(Remote Desktop – User Mode (TCP-In))を許可 | Windows Defender ファイアウォールの GPO、または PowerShell | プロファイル(ドメイン/プライベート)を確認 |
| NLA | 「Require user authentication …」を有効、または UserAuthentication=1 | GPO(旧来)/スクリプト(24H2 以降) | クレデンシャル保護・平文 NTLM の回避に有効 |
OU 内 PC で RDP を有効化し、許可ユーザーを限定する方法
GPO の作成とリンク
- ドメイン コントローラーで Group Policy Management Console (GPMC) を起動。
- 対象 OU を右クリック → 新規 GPO を作成(例:
GPO-RDP-Baseline)。 - 作成した GPO を対象 OU にリンク(必要に応じて WMI フィルターやセキュリティ フィルタリングで対象端末を絞り込み)。
RDP を有効化する(旧来 OS 向けの基本設定)
Windows 10 など従来 OS を含む混在環境では、まず教科書的な方法を押さえておきます。
パス:
コンピューターの構成
└ ポリシー
└ 管理用テンプレート
└ Windows コンポーネント
└ Remote Desktop Services
└ Remote Desktop Session Host
└ Connections
ポリシー:「Allow users to connect remotely using Remote Desktop Services」= [有効]
併せて NLA を強制するなら、同じツリー内の「Require user authentication for remote connections by using Network Level Authentication」= [有効] を設定します。
接続を許可するグループの指定(Restricted Groups)
OU 内のクライアントにおいて、社内のセキュリティ グループ(例:RDP-Users)だけが RDP できるようにします。推奨の設定は「対象グループをローカル Remote Desktop Users のメンバーに加える」方式です。
パス:
コンピューターの構成
└ ポリシー
└ Windows 設定
└ セキュリティ設定
└ Restricted Groups
操作:
- 「グループの追加」→
RDP-Users(ドメイングループ名)を入力。 - 「このグループのメンバー」は 空欄のまま(ここを埋めると
RDP-Usersのメンバーを上書き管理してしまうため)。 - 「このグループが所属するグループ」に Remote Desktop Users を追加。
これにより、OU 内 PC では RDP-Users のメンバーが自動的にローカル Remote Desktop Users へ編入され、RDP の接続権限(Allow log on through Remote Desktop Services)が付与されます。
Windows Defender ファイアウォールの開放
RDP を有効化しても、ファイアウォールで 3389/TCP を閉じていれば到達しません。GPO で以下いずれかを構成します。
- 「受信の規則」→ Remote Desktop – User Mode (TCP-In) を有効化
- または「規則グループ」単位で Remote Desktop を有効化
スクリプト派の環境では、以下を組み合わせても構いません。
PowerShell:
Enable-NetFirewallRule -DisplayGroup "Remote Desktop"
# もしくは
Get-NetFirewallRule -DisplayGroup "Remote Desktop" | Enable-NetFirewallRule
コマンド:
netsh advfirewall firewall set rule group="Remote Desktop" new enable=Yes
GPO の適用と確認
- クライアントで
gpupdate /force実行(ドメイン参加直後は再起動推奨)。 - 結果確認:
gpresult /h C:\gp.html→ RDP 関連ポリシーが適用されているかを HTML レポートで確認。 - レジストリ:
HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\fDenyTSConnectionsが0であること。 - ファイアウォール:
Get-NetFirewallRule -DisplayGroup "Remote Desktop"の Enabled がTrueであること。 - 到達性:管理端末から
Test-NetConnection <PC名> -CommonTCPPort RDP(3389)。 - ローカル グループ:
lusrmgr.mscまたはnet localgroup "Remote Desktop Users"でRDP-Usersが見えること。
セキュリティ強化の追加ポイント
- NLA の必須化:中間者攻撃・パスワード推測の面でメリット大。
レジストリ:HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp\UserAuthentication=1 - ユーザー権利の明示:必要に応じて「ローカル ポリシー > ユーザー権利の割り当て > Allow log on through Remote Desktop Services」に
Remote Desktop Usersを含める(DC は既定が異なるので注意)。 - 禁止の明示:「Deny log on through Remote Desktop Services」に対象グループが入っていないか確認(誤登録はありがちなブロック要因)。
- ドメイン コントローラーには適用しない:DC への RDP は別ポリシー/プロセスで管理。
Windows 11 24H2/Windows 2025 で「RDP スイッチがグレーアウトし OFF のまま」になる問題
症状
- 設定アプリの [リモート デスクトップ] トグルが灰色で操作不能(「組織によって管理されています」等)。
- GPO で RDP を「有効」にしているつもりでも、UI 表示は OFF のまま。
原因(推定)
24H2 以降のクライアントでは、RDP の UI とポリシーの関係がハードニングされ、Allow users to connect remotely … を [有効] にすると「管理対象」の判定が働き、UI が固定表示(グレーアウト)になる場合があります。結果として、UI は OFF に見えるが内部フラグは期待通りでないなど、運用上の齟齬が生じます。
対処方針の比較
| 方針 | 概要 | 長所 | 短所 | おすすめ度 |
|---|---|---|---|---|
| A. 一時的に未構成化 | RDP ポリシーを [未構成] に戻し、UI で手動 ON | 即効性 | ローカル変更でドリフト、再配布で上書き | △(暫定対応) |
| B. 起動スクリプトで直接制御 | fDenyTSConnections=0 へ設定、FW と NLA もスクリプトで | UI 固定問題の影響を受けない、再現性が高い | スクリプト整備が必要 | ◎(推奨) |
| C. MDM/CSP で制御 | Intune 等のポリシーで RDP/TCP 3389 を統制 | クラウド管理との一元化 | オンプレのみ環境では導入コスト | ○(MDM 環境) |
| D. ADMX 更新待ち | 将来のポリシー更新で動作改善を期待 | 標準化 | タイムラグが長い可能性 | △(長期) |
推奨:PowerShell 起動スクリプトによる恒久対処
GPO の「スクリプト(スタートアップ)」で、以下の PowerShell を配布します。端末起動ごとに収束(コンバージェンス)させる構成なので、手動変更や UI 表示に影響されません。
# RDP を有効化し、NLA とファイアウォールも整える起動スクリプト(例)
# 目的:Windows 11 24H2/2025 以降を含む混在環境で安定的に RDP を許可する
# 実行コンテキスト:コンピューターの起動スクリプト(Local System)
$ErrorActionPreference = 'Stop'
# ドメイン コントローラーなどサーバー役割は対象外(必要に応じてロール条件を調整)
try {
$cs = Get-CimInstance Win32_ComputerSystem
if ($cs.DomainRole -ge 4) { return } # 4=BDC, 5=PDC 相当
} catch { }
# RDP 有効化フラグ
$tsReg = 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server'
New-Item -Path $tsReg -Force | Out-Null
$current = (Get-ItemProperty -Path $tsReg -Name 'fDenyTSConnections' -ErrorAction SilentlyContinue).fDenyTSConnections
if ($null -eq $current -or $current -ne 0) {
Set-ItemProperty -Path $tsReg -Name 'fDenyTSConnections' -Type DWord -Value 0
}
# NLA を必須化(不要なら Value を 0)
$rdpTcp = 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp'
New-Item -Path $rdpTcp -Force | Out-Null
Set-ItemProperty -Path $rdpTcp -Name 'UserAuthentication' -Type DWord -Value 1
# ファイアウォール(Remote Desktop グループ)を有効化
try {
Get-NetFirewallRule -DisplayGroup 'Remote Desktop' -ErrorAction Stop | Where-Object Enabled -ne 'True' | Enable-NetFirewallRule
} catch {
# 古い OS でも動くように netsh でフォールバック
& netsh advfirewall firewall set rule group='Remote Desktop' new enable=Yes | Out-Null
}
# TermService(Remote Desktop Services)を起動(停止中のみ)
try {
$svc = Get-Service -Name 'TermService' -ErrorAction Stop
if ($svc.Status -ne 'Running') { Start-Service -Name 'TermService' }
} catch { }
# ログ(簡易)
$log = 'C:\ProgramData\RDP_Enable.log'
$line = ('{0} RDP enabled. fDenyTSConnections=0, NLA=1, FW=On' -f (Get-Date).ToString('s'))
New-Item -ItemType Directory -Path (Split-Path $log) -Force | Out-Null
Add-Content -Path $log -Value $line
配置手順:対象 GPO の「コンピューターの構成 > ポリシー > Windows の設定 > スクリプト(スタートアップ)」に上記スクリプトを登録します。PowerShell スクリプト用の専用ノード(PowerShell Scripts)がある場合は併用してください。
Restricted Groups とスクリプトの役割分担
- スクリプト:RDP の有効化フラグ・NLA・ファイアウォール・サービス状態を確実に収束させる。
- Restricted Groups:「誰が RDP できるか」の権限境界を AD セキュリティ グループで一元管理。
権限は 人(ユーザー/グループ)、設定は 端末(レジストリ/サービス/ファイアウォール) と分離するのが、監査やロールバックの観点で最も安全です。
検証ステップ(推奨手順)
- テスト OU を作成し、想定端末 2~3 台を移動。
- GPO をリンク(
GPO-RDP-Script、GPO-RDP-RestrictedGroups、GPO-RDP-Firewallの 3 本立て推奨)。 - 端末を再起動(起動スクリプト適用のため)。
- 管理端末から
Test-NetConnection <PC> -CommonTCPPort RDP。 - ユーザー検証:
RDP-Usersメンバー → RDP できる。- 非メンバー → 「接続許可なし」で拒否される。
- イベント ログで確認:
- TerminalServices-RemoteConnectionManager:ID 1149(認証試行)
- Security:ID 4624/4625(ログオン成功/失敗)
- GroupPolicy/Operational:適用状況(GPO のバージョン確認)
ロールバック(無効化)スクリプト例
# RDP を無効化し、FW を閉じる
$ErrorActionPreference = 'Stop'
$tsReg = 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server'
Set-ItemProperty -Path $tsReg -Name 'fDenyTSConnections' -Type DWord -Value 1
try {
Get-NetFirewallRule -DisplayGroup 'Remote Desktop' | Disable-NetFirewallRule
} catch {
& netsh advfirewall firewall set rule group='Remote Desktop' new enable=No | Out-Null
}
Add-Content C:\ProgramData\RDP_Enable.log ("{0} RDP disabled." -f (Get-Date).ToString('s'))
運用のベストプラクティス
GPO を 3 レイヤーに分ける
- GPO-RDP-Script:RDP 有効化・NLA・FW の技術設定のみ。
- GPO-RDP-RestrictedGroups:グループ編入(
RDP-Users→ ローカルRemote Desktop Users)。 - GPO-RDP-Hardening:「暗号化レベル」「タイムアウト」「セッション制限」など将来の強化設定。
責務分離により、障害切り分けと監査が容易になります。
変更管理と段階展開
| 段階 | 対象 | 目的 | 成功判定 |
|---|---|---|---|
| Dev | IT 管理部の検証端末 | スクリプトの収束確認 | ログ・レジストリ・FW の状態が意図通り |
| Pilot | 1~2 部門(10~30 台) | ユーザー体験・権限境界の確認 | 接続成功率 > 95%、非メンバー拒否 100% |
| Prod | 全社 OU | 本番リリース | 障害チケットの発生が許容範囲内 |
よくある落とし穴と対処
- 別 GPO で RDP を禁止:上位 OU で「接続拒否」系の設定が競合していないか整理。
- 「Deny log on through RDS」に Domain Users 等が入っている:優先的に拒否されます。明示的に除外。
- サードパーティ製 FW/EDR:Windows Defender 以外の層が 3389/TCP を遮断していないか。
- ポート変更:既に RDP ポートを変更している PC がある場合、
HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp\PortNumberを確認。 - 資格情報/証明書:自己署名 RDP 証明書の名前不一致で警告が出るのは正常。社内 CA の自動配布は別途検討。
- UAC リモート制限:管理共有(C$)の操作失敗と RDP は別問題。UAC 制限ポリシーを無闇に緩めない。
- DC への適用:DC は原則 RDP 閉塞または厳格管理。ファイル レプリケーションや権限逸脱のリスクが高い。
トラブルシューティング・チェックリスト
- RDP フラグ:
fDenyTSConnections=0か。 - NLA:
UserAuthentication=1か。非 NLA クライアントは弾かれる。 - FW 規則:ドメイン/プライベート プロファイルで Remote Desktop が有効。
- ローカル グループ:
Remote Desktop UsersにRDP-Usersが表示される。 - ユーザー権利:「Deny log on through RDS」に対象が入っていない。
- イベント:1149(接続試行)、4624/4625(ログオン結果)を追跡。
- ネットワーク経路:VPN/ゼロトラスト機器・L3 ACL・社内 FW の 3389/TCP を確認。
実装テンプレート(まとめ)
GPO 1:RDP-Enable(起動スクリプト)
- 配下:コンピューターの構成 > ポリシー > Windows の設定 > スクリプト(スタートアップ)
- 内容:本記事の PowerShell。NLA=1、FW=On。
GPO 2:RDP-Auth(Restricted Groups)
- 配下:コンピューターの構成 > ポリシー > Windows 設定 > セキュリティ設定 > Restricted Groups
- 設定:
RDP-Usersを「このグループが所属するグループ」にRemote Desktop Usersとして追加。
GPO 3:RDP-Firewall(任意)
- 配下:Windows Defender ファイアウォール の受信規則で Remote Desktop グループを有効化。
- またはスクリプトで
Enable-NetFirewallRule。
ケーススタディ:部署横断の段階展開例
情報システム部で 1 週間のパイロットを実施。端末 25 台で起動スクリプトの収束率 100%、RDP-Users 非メンバーの誤許可 0 件を確認のうえ、本番 OU へリンク。以後は運用上の追加要望(非 NLA の旧端末からの接続)を却下し、NLA 必須の姿勢を維持しました。監査ログは SIEM に転送し、イベント ID 1149/4624/4625 を相関分析、ブルートフォース兆候を検知したら自動で RDP-Users から該当ユーザーを一時除外する運用ルールを定義しています。
FAQ
Q1. 「Allow users to connect remotely …」はもう使わないべき?
A. 旧来 OS では引き続き有効な選択肢です。ただし Windows 11 24H2/Windows 2025 では UI ロックや表示の齟齬が起きやすいため、レジストリ+FW をスクリプトで収束させる方が実運用では堅牢です。
Q2. Restricted Groups ではなく、GPP(ローカル ユーザーとグループ)で直接「Remote Desktop Users」に追加してもよい?
A. 可能ですが、誰が誰をどこに入れるかの権限境界が見えづらくなりがちです。組織内の統制・監査の観点では、AD グループ(RDP-Users)を一次ソースとして管理し、それを端末側のローカル グループに編入する方式が推奨です。
Q3. NLA を必須にすると古いクライアントが接続できません。
A. セキュリティと互換性のトレードオフです。どうしても必要な端末は隔離ネットワークに置く等の代替策を検討してください。NLA 無効は例外運用として期間と対象を限定し、別 OU/GPO で管理するのが安全です。
Q4. メンバーシップ変更が即時反映されない。
A. Kerberos トークンの再発行が必要です。ユーザーは一度サインアウト、または klist purge を実行。端末側は gpupdate /force と再ログオンで同期します。
Q5. 監査は何を見ればよい?
A. Security(4624/4625)と TerminalServices-RemoteConnectionManager(1149)を収集し、失敗回数の急増や時間帯の偏りをアラート化します。併せて GroupPolicy/Operational の適用イベントでドリフト検知を行うと堅牢です。
まとめ
- 旧来 OS:GPO「Allow users to connect remotely …」+ Restricted Groups で安定運用が可能。
- Windows 11 24H2/Windows 2025:UI グレーアウトや OFF 固定の事象により、起動スクリプトで
fDenyTSConnections=0・NLA・FW を収束させる構成が実用的。 - いずれも、「RDP を有効化」「誰が接続できるか」「FW/NLA」の 3 点を OU 単位で一括配布し、検証→段階展開→監査までをプロセス化することが鍵です。
参考実務メモ(貼って使える断片)
管理者の確認ワンライナー
# RDP 有効&FW 許可&グループ編入の 3 点を概観
"fDenyTSConnections=" + (Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server' -Name fDenyTSConnections).fDenyTSConnections
Get-NetFirewallRule -DisplayGroup 'Remote Desktop' | Select-Object DisplayName, Enabled | Format-Table -Auto
net localgroup "Remote Desktop Users"
ユーザー権利の確認
# "Allow log on through Remote Desktop Services" の内容を確認(RSOP/ローカル)
# 直接の UI では gpedit.msc > ローカル ポリシー > ユーザー権利の割り当て
secedit /export /cfg C:\secpol.cfg
Select-String -Path C:\secpol.cfg -Pattern "SeRemoteInteractiveLogonRight"
監査イベントの即席抽出
# 直近 24 時間の RDP 関連イベントを拾う
$since = (Get-Date).AddDays(-1)
Get-WinEvent -FilterHashtable @{LogName='Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational'; StartTime=$since} |
Where-Object Id -eq 1149 |
Select-Object TimeCreated, Id, Message
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4624; StartTime=$since} |
Select-Object TimeCreated, Id, @{n='Account';e={$_.Properties[5].Value}}
例外 OU(非 NLA/一時許可)を作るときの注意
- 例外用途の OU を明確に分離し、適用 GPO を最小化する。
- 終了日・対象端末・責任者をチケット化し、満了時に自動ロールバックする。
以上を踏まえ、「RDP を有効化」「接続許可グループの限定」「FW/NLA」の 3 本柱を OU 単位で確実に収束させれば、混在環境でも安全かつ予測可能な RDP 運用が実現できます。

コメント