Remote Desktop Serviceのライセンスタイプに関する私的まとめ

2023.08.01

しばたです。

Windows ServerのRemote Desktop Service(以後 RDS)はOS内部にライセンス種別の情報を持ち、その内容によってOSとしての挙動が変わります。

今回必要があってどのタイミングでライセンス種別が変わるのかを動作確認したのでその結果を共有します。

ライセンス種別を取得する方法

ライセンス種別はWMIから取得できます。

このWin32_TerminalServiceSettingクラスのLicensingTypeプロパティがライセンス種別を表し以下の値を取るとされています。

名称 備考
0 Personal Terminal Server
1 Remote Desktop for Administration 管理用途専用モード
2 Per Device デバイスRDS CALを使用するモード
4 Per User ユーザーRDS CAL/RDS SALを使用するモード
5 Not Configured ライセンスタイプ未指定の状態
7 RDS External Connector (ドキュメントに無いが実在の値として存在している)

(上記ドキュメントの記述と若干異なる、が、実際の挙動を確認するとこの値が正しい)

簡単に言ってしまうと1 : Remote Desktop for AdministrationがWindows Server初期導入時の「管理用途に限り2セッションまで利用可能」なモードです。
そしてMicrosoft RemoteApp等の利用のためにRemote Desktop Session Host(RDSH)を構成した際は2:Per Deviceまたは4:Per Userを選び適切なRDS CAL(またはRDS SAL)を使用する形となります。

この他にサーバーで利用可能なタイプを表現するPossibleLicensingTypesも存在します。
こちらはフラグ値で以下の値を取るとされています。

名称 備考
1 Personal RD Session Host server licenses are supported.
2 Remote Desktop licenses are supported.
4 Per device licenses are supported.
8 Per user licenses are supported.
16 不明 Windows Server 2022に存在
32 不明 Windows Server 2022に存在

そしてRDSHを構成しているか否かでTerminalServerModeの値が変わります。

名称 備考
0 RemoteAdmin デフォルト設定
1 AppServer Application Serverモード

最後にライセンス情報を取得するRD Licensing Serverの情報はGetSpecifiedLicenseServerList()メソッドから取得できます。

上記の内容はPowerShellコンソールから以下のコマンドを使えば取得可能です。

# 要管理者権限
$obj = Get-WmiObject -Namespace "Root/CIMV2/TerminalServices" Win32_TerminalServiceSetting
Write-Output ("現在のライセンスタイプ : {0} ({1})" -f $obj.LicensingType, $obj.LicensingName)
Write-Output ("適用可能ライセンス(bitmap) : {0}" -f $obj.PossibleLicensingTypes)

# Terminal Server Mode
Write-Output ("サーバーモード : {0}" -f $obj.TerminalServerMode)

# RD Licensing Server
Write-Output ("ライセンスサーバー : {0}" -f $($obj.GetSpecifiedLicenseServerList().SpecifiedLSList))

動作確認

ここから動作確認した結果を記載していきます。

構成図

今回私の検証用AWSアカウントの東京リージョンにあるVPC環境内に

  • Windows Server 2022 ドメインコントローラー
  • Windows Server 2019 RD Connection Broker/RD Web/RD Licensing Server兼務インスタンス
  • Windows Server 2019 RDSH Server

の3インスタンスを用意しています。

ドメインコントローラー以外のインスタンスに関してはWindows Server 2022にしたパターンも動作確認しましたが、ほとんど違いが無かったので記事内ではWindows Server 2019前提で話を進めていきます。

1. Windows Server 初期状態

最初に、作成したばかりの状態のWindows Server 2019/2022インスタンスに対して上記コマンドを使い設定値を確認すると以下の結果になりました。

# Windows Serverの初期状態で試した結果
PS C:\> $obj = Get-WmiObject -Namespace "Root/CIMV2/TerminalServices" Win32_TerminalServiceSetting
PS C:\> Write-Output ("現在のライセンスタイプ : {0} ({1})" -f $obj.LicensingType, $obj.LicensingName)
現在のライセンスタイプ : 1 ()
PS C:\> Write-Output ("適用可能ライセンス(bitmap) : {0}" -f $obj.PossibleLicensingTypes)
適用可能ライセンス(bitmap) : 2
PS C:\>
PS C:\> # Terminal Server Mode
PS C:\> Write-Output ("サーバーモード : {0}" -f $obj.TerminalServerMode)
サーバーモード : 0
PS C:\>
PS C:\> # RD Licensing Server
PS C:\> Write-Output ("ライセンスサーバー : {0}" -f $($obj.GetSpecifiedLicenseServerList().SpecifiedLSList))
"GetSpecifiedLicenseServerList" の呼び出し中に例外が発生しました: ""
発生場所 行:1 文字:38
+ ... バー : {0}" -f $($obj.GetSpecifiedLicenseServerList().SpecifiedLSList))
+                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : WMIMethodException

表にまとめるとこんな感じです。

項目 設定値 備考
ライセンスタイプ 1 : Remote Desktop for Administration 既定の設定
変更可能なタイプ 2 : Remote Desktop licenses are supported 既定の設定
サーバーモード 0 : RemoteAdmin 既定の設定
ライセンスサーバー なし(例外発生)

これがWindows Serverのデフォルト設定であり「管理用途に限り2セッションまで利用可能」な状態となります。
ライセンスサーバーの情報を取得しようとすると例外が発生します。

そして上記の設定はドメインに参加しても変わることはありませんでした。

1. RD Connection Broker / RD Webインストール後

1台のインスタンスに対しRD Connection BrokerとRD Webの機能をインストールした後の状態を調べましたが特に内容に変化はありませんでした。

項目 設定値 備考
ライセンスタイプ 1 : Remote Desktop for Administration 変化なし
変更可能なタイプ 2 : Remote Desktop licenses are supported 変化なし
サーバーモード 0 : RemoteAdmin 変化なし
ライセンスサーバー なし(例外発生)

2. RD Licensing Serverインストール後

続けて同じインスタンスにRD Licensing Serverの機能をインストールするとライセンスサーバーの情報を取得する際に例外が発生しなくなりました。
まだライセンスサーバー自体の指定をしてない状態のため値を取れないのは正常な挙動です。

項目 設定値 備考
ライセンスタイプ 1 : Remote Desktop for Administration 変化なし
変更可能なタイプ 2 : Remote Desktop licenses are supported 変化なし
サーバーモード 0 : RemoteAdmin 変化なし
ライセンスサーバー なし 例外は発生しなくなる

3. RDSHインストール直後

次に別のインスタンスにRDSHの機能をインストールした直後の状態を調べました。

この時点でサーバーモードが1 : AppServerに変わり、ライセンスタイプは5 : Not Configuredと未設定状態に変化しライセンスサーバーの取得も例外が出なくなります。

変更可能なタイプは12と「Per UserまたはPer Deviceを設定可能」に変化しました。

項目 設定値 備考
ライセンスタイプ 5 : Not Configured 未設定状態。警告が出る
変更可能なタイプ 12 (1100) : Per user licenses are supported + Per device licenses are supported Windows Server 2019の結果
サーバーモード 1 : AppServer サーバーモードが変化
ライセンスサーバー なし 例外にはならない

(ライセンスタイプ未設定時の警告)

余談 : Widows Server 2022の場合

Windows Server 2022で動作確認をした場合、RDSHの機能をインストールすると変更可能なタイプの値が60(二進数だと0011 1100)となり、前述の12の他にドキュメントに無い1632のフラグ値が増えていることが分かりました。

これらの値に関する情報が全く見つからないため何なのかは不明です。
私個人の勝手な予想としては「Windows Virtual Desktopに関するものかなぁ?」と考えています...

4. RDSHサーバーでライセンスサーバー指定後

サーバーマネージャーのGUIでライセンスサーバーの設定をしただけではRDSHサーバーの設定は変わりませんでした。

(初期状態で設定してもRDSHサーバーには反映されない)

「コレクション」を新規に作成した時点でコレクション内のRDSHサーバーの設定が以下の様に更新されました。

(コレクションを追加してはじめてRDSHサーバーに反映される)

項目 設定値 備考
ライセンスタイプ 4 : Per User 「接続ユーザー数」を選んだ場合
変更可能なタイプ 12 (1100) : Per user licenses are supported + Per device licenses are supported 変化なし
サーバーモード 1 : AppServer
ライセンスサーバー rdcb2019.corp.contoso.com 設定値が取得可能に

この変更は以下のレジストリに保存され、手作業でレジストリを更新した場合と同じ挙動となります。

  • ライセンスタイプ : HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\RCM\Licensing Core
  • ライセンスサーバー : Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TermService\Parameters\LicenseServers

5. RDSHをアンインストールした場合

最後にRDSHサーバーからRDSHの機能をアンインストールした際の挙動を確認します。

まず、「コレクションを削除する」「サーバーマネージャーのGUIからRDSHセッションホストを除外する」だけでは一度更新されたライセンス情報はそのまま残る形になりました。

項目 設定値 備考
ライセンスタイプ 4 : Per User 変化なし
変更可能なタイプ 12 (1100) : Per user licenses are supported + Per device licenses are supported 変化なし
サーバーモード 1 : AppServer
ライセンスサーバー rdcb2019.corp.contoso.com 変化なし

サーバーからRDSHの機能を削除してはじめて設定値が変わります。
セッションホストを除外する際に同時に機能のアンインストールを行うか、個別に機能を削除を行ってください。

(ホストを除外するのと同時に機能のアンインストールを行う)

# PowerShellから機能の削除を行う場合 : 要再起動
Uninstall-WindowsFeature -Name RDS-RD-Server -Restart

機能をアンインストールした後の値を確認すると以下の様に元に戻ります。

項目 設定値 備考
ライセンスタイプ 1 : Remote Desktop for Administration 既定の設定
変更可能なタイプ 2 : Remote Desktop licenses are supported 既定の設定
サーバーモード 0 : RemoteAdmin 既定の設定
ライセンスサーバー なし(例外発生)

ただし、ライセンスサーバーの設定に関しては情報取得時に例外が出る様に戻るもののレジストリ値はクリアされずに残っていました。

(Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TermService\Parameters\LicenseServers の値はクリアされない)

動作上特に問題はありませんでしたが、気になる場合は手作業で消しておくと良いでしょう。

補足 : グループポリシーでライセンスを設定した場合

RDSHサーバーのライセンス設定はグループポリシーから行うことも可能です。

グループポリシーで設定を行った場合はRDSHの機能をアンインストールした後もポリシーが強制され設定値が残るのでご注意ください。

項目 設定値 備考
ライセンスタイプ 4 : Per User グループポリシーにより強制されたまま
変更可能なタイプ 2 : Remote Desktop licenses are supported
サーバーモード 0 : RemoteAdmin
ライセンスサーバー なし(例外発生) グループポリシーの設定はあれど例外が発生

グループポリシーを無効にしてやればきれいに元に戻ります。

項目 設定値 備考
ライセンスタイプ 1 : Remote Desktop for Administration グループポリシー無効で元通りに
変更可能なタイプ 2 : Remote Desktop licenses are supported
サーバーモード 0 : RemoteAdmin
ライセンスサーバー なし(例外発生)

まとめ

ここまでの結果をざっくりまとめると以下の通りです。

  • Windows Serverのデフォルト設定は「管理用途に限り2セッションまで利用可能」なモード (0 : RemoteAdmin)
    • この場合のライセンスタイプは1 : Remote Desktop for Administration
  • RDSHの機能を追加するとモードが変わる (1 : AppServer)
    • モードが変わるのはあくまでRDSH ServerのみでありRD Connection Broker, RD Web Server, RD Licensing Serverは影響を受けない
    • この場合のライセンスタイプは最初は5 : Not Configuredであり、環境に応じた種別に変更する必要がある
  • 一度変えたモードを戻すにはRDSHの機能を削除する必要がある (要再起動)
    • ライセンスタイプをレジストリで設定した場合は一部を除き元に戻る
    • ライセンスタイプをグループポリシーで設定した場合はポリシーを無効にしない限り設定が強制されてしまう
  • サーバーマネージャーのライセンス設定は「コレクション」に対して伝播される
    • 「コレクション」が無い状態では設定がRDSH Serverに反映されない
  • Microsoftのドキュメントは意外と間違えており、加えてアンドキュメントな設定が増えている

最後に

以上となります。

私は前職時代から結構長い間Remote Desktop Serviceと向き合っているのですが、未だにわからない事が多いです...
Remote Desktop Serviceは非常に歴史の長いサービスであるためMicrosoft公式のドキュメントもカオスになっており率直に言って信頼できません。(OSバージョン間の差異が整理されていないのが致命的につらい...)

このため気になる点は実際の挙動ベースで試すしかないです。
本記事の内容がどの程度役に立つか分かりませんが誰かの役に立てばうれしい限りです。