2018/11/30

WAC 1809 のリモート デスクトップ機能が使えない問題の解決

※ この問題↓は、2019年1月リリースの WAC 1809.5で解決されています。

HTML5 ベースの Windows Server (2019/2016/2012/2012 R2/2008 R2)および Windows 10 の管理ツール、 Windows Admin Center (WAC) の最新バージョンは WAC 1809 ですが...

Windows Admin Center
https://docs.microsoft.com/en-us/windows-server/manage/windows-admin-center/overview
Windows Admin Center 1809 GA(このブログ、2018/09/21)

WAC 1804 のときは動いていた[リモート デスクトップ]機能が、WAC 1809 になって機能しなくなったと、悩んでいる人はいないでしょうか。[PowerShell] とか他の機能が問題なく機能するなら、[リモート デスクトップ]の問題は簡単に解決できるかもしれません。私は、2 か月以上かかってやっと問題解消できました(WAC 1804 の後に出た 1806 Preview や 1808 Preview でも動かなかったのでほんと 5 か月くらい? でもそもそもバグかなにかで機能しないと思っていたので放置してたんですが、問題なく動く環境を手にしてから調査&問題解決にかかったのは実質数時間)。

(注:あくまでも筆者の環境での話。別の問題で接続できない可能性もあり。)



どんな問題かというと、[リモート デスクトップ]を開くと、丸い点々が永遠と表示されるだけ。[設定]の[リモート デスクトップ]を開くと、"リモート デスクトップの設定を取得できませんでした。エラー: RemoteException: Get-Member コマンドレットにオブジェクトを指定する必要があります。"というエラー。Windows 10 にデスクトップ モードでインストールした場合も(Windows 10 ver 1709 以降にインストール可能)、Windows Server にゲートウェイ モードでインストールした場合も同じ状況。

同様の悩みを抱えている人は多いらしい。でも動く人は動くらしくて、原因や解決策が見当たらない。(一番上の投稿に今回の解消方法を Reply × 3 してあります。→ 12/1 追記:何名かの方がこの記事の方法で解決できたようです!)

Remote Desktop not working in Admin Center
https://techcommunity.microsoft.com/t5/Windows-Admin-Center/Remote-Desktop-not-working-in-Admin-Center/m-p/279203#M203
windows admin center "RemoteException" in remote desktop connection
https://techcommunity.microsoft.com/t5/Windows-Admin-Center/windows-admin-center-quot-RemoteException-quot-in-remote-desktop/td-p/262522
Windows Admin Center 1809 Generally Available!
https://techcommunity.microsoft.com/t5/Windows-Admin-Center/Windows-Admin-Center-1809-Generally-Available/m-p/267971/highlight/true#M166 

言語環境の問題なのかと思い英語版の環境をオンプレに準備したり、認証の問題なのかと思って AD ドメイン環境で試してみたりしましたが、どれも問題を解決できず。

ところが、昨日、Azure VM 環境にセットアップしたら、何の苦労もなく、普通に動くことがわかりました(このページのトップの画面)。というわけでこれまで見なかったことにしてた機能不全問題に取り組むことに。

言語環境や認証まわりでないとしたら、原因は接続先のリモート デスクトップ接続の設定なのではと思い、クリーンインストールしてリモート デスクトップ接続を有効化した Windows 10 Enterprise 評価版 ver 1809 と、Visual Studio の Windows 10 Enterprise N (x64) からデプロイした直後の Azure VM のリモート デスクトップ サービス関連のレジストリを比較してみました。すると、Azure VM 側のHKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services キーに KeepAliveEnable と KeepAliveInterval という REG_DWORD 値が存在し、データとして 1 が設定されていることに注目。


接続先の Windows Server や Windows 10 に同じレジストリを作成してみたところ、問題は解消されました(接続先の再起動不要)。(※最後に追記しましたが、これらのレジストリ値が重要なのではなく、何かしらのレジストリ値が1つでも存在することが重要なのだと思います。でもダミーを作るよりは、何か意味のあるものを作成しておくのほうが安心。)

コマンドプロンプトなら

REG ADD "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v "KeepAliveEnable" /t REG_DWORD /d 1 /f
REG ADD "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v "KeepAliveInterval" /t REG_DWORD /d 1 /f

PowerShell なら

New-ItemProperty -Path "HKLM:SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" -Name "KeepAliveEnable" -PropertyType DWord -Value 1 -Force
New-ItemProperty -Path "HKLM:SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" -Name "KeepAliveInterval" -PropertyType DWord -Value 1 -Force

WAC 1809 の[PowerShell]で接続して実行すれば、WAC 1809 のコンソールから DISM または New-ItemProperty でリモート側を変更できます(以下は、AD に未参加の Windows 10 の WAC 1809 から AD のサーバーに接続してます)。WAC 1809 の[レジストリ]から GUI で編集することもできます。

こんな画面がでてきたら、この次に認証情報を入力して接続できるように。
Azure VM に存在していたレジストリ値ですが、Azure にカスタム イメージをアップロードする際に仕込んでおくものの中に入ってました(「5. キープアライブ値を設定します」のとこ)。

Azure にアップロードする Windows VHD または VHDX を準備する
https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/prepare-for-upload-vhd-image

追記) 原因の考察ともう 1 つの回避策

もしかすると、KeepAliveEnable や KeepAliveInterval はどうでもよくて、この場所に何か値が存在すること自体が重要なののかもしれません。WAC 1809 に含まれている PowerShell スクリプトを調べても、これらの値はチェックしていません(同じ場所にあるかもしれない別の値 UserAuthentication とか fDenyTSConnections とかチェックしてます)。

[>_]ボタンをクリックすると、WAC 1809 が使っている(と思う)PowerShell の関数とかが出てくるのですが、例えば、以下のコードの $registryKey の値が null になって、その後ろのコード(Get-Member)はエラーになるんじゃないかと想像。
似たような簡単なコードを書いて実行すると、レジストリ値なしの場合はエラーが出る。[設定]の[リモート デスクトップ]を開くと出るエラーとそっくり。

レジストリありだとエラーは出ず。


明らかにコードのバグだと思いますです。例えば、こうしないと...

    $registryKey = Get-ItemProperty ...
    if ($registryKey -ne $null) {
      if ((Get-Member  -InputObject $registryKey ...)) {
        ...
      }
    }

またはこう?

    $registryKey = Get-ItemProperty ...
    if ((Get-Member -InputObject $registryKey ... -ErrorAction SilentlyContinue) -and (...) {
       ...
    }

いずれにせよ、コード署名されているので勝手に変更できませんが。というわけで、KeepAliveEnable や KeepAliveInterval やその他のダミーのレジストリ値を作成するというのがこの問題の 1 つの回避策になると思います。

もう 1 つの回避策

ローカル コンピューター ポリシー(Gpedit.msc)やグループ ポリシーで「コンピューターの構成\(ポリシー)\管理用テンプレート\Windows コンポーネント\リモート デスクトップ セッション ホスト\接続\ユーザーがリモート デスクトップ サービスを使ってリモート接続を許可する:有効」を設定するのが、別の回避策になると思います。別の回避策といっても、問題のキーの場所にレジストリ値を作成するポリシー(この場合、fDenyTSConnections)なので同じことなんですが...

REG ADD "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v "fDenyTSConnections" /t REG_DWORD /d 0 /f




念のため確認。[リモート デスクトップ]も、[設定]の[リモート デスクトップ]を開いたときの Get-Member エラーも解消。


(”リモート アプリ ツール”は ”RemoteApp ツール”だと思うけど、どんな機能かよくわかりません。WAC 1809 の Known issues として Remote App – After enabling the Remote App tool from Remote Desktop settings, the tool may not appear in the tool list when managing a Server with Desktop Experience.って書いてるし。現状の動きは、HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TsAppAllowList キーの fDisabledAllowList の 1 と 0 を切り替えてるだけに見えます)



ちなみに、WAC 1804 はどうなってたかというと、作りが違うのでわかりませんでした。WAC 1809 だと C:\Program Files\Windows Admin Center\UX.zip\modules\msft.sme.remote-desktop\powershell-module\Microsoft.SME.RemoteDesktop\Microsoft.SME.RemoteDesktop.psm1 にスクリプトがあるのですが、WAC 1804 は PowerShell スクリプトの表示機能が実装されてなかったので、よくわかりません。

ところで、この問題に遭遇した人の多くが、クリーン インストールした環境なのに動かないのは??? って感じだと思います。その理由はクリーン インストールだからこそのクリーンな環境(HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services に値が何もない)+ PowerShell スクリプトのバグ(HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services に値が何もないときの動きを想定していない)だから。いろいろいじってて何かしらレジストリ値があれば(例えば、Azure VM には既定で KeepAlive... が存在する)、すんなり動くってことでした。

12/3 追記)
[設定]の[リモート デスクトップ]で何かしら設定を変更し、保存すると、別のエラー”リモート デスクトップ設定を更新できませんでした。エラー: RemoteException: プロパティ 'DisplayGroup' が 'Remote Desktop' の MSFT_NetFirewallRule オブジェクトが見つかりません。...”が表示されますが、これはまた別の問題(ファイアウォールの設定は失敗しますが、設定の保存はされます)。日本語環境だとファイアウォールのルール グループ名は「Remote Desktop」ではなくて、「リモート デスクトップ」ですから。このあたりも多言語環境を想定していない残念なつくりだって感じます。


問題の場所は、PowerShell スクリプトの Set-RemoteDesktop ファンクションの中。

function Set-RemoteDesktop {
...
Enable-NetFirewallRule -DisplayGroup 'Remote Desktop'
}

Enable- を Getー に変えて、ローカルで実行してみれば、同じエラーを確認できます。

以上

12/12 追記) Windows Admin Center 1809.5 Preview (1.1.1812.03003) が出ました。 近いうちに GA 向けにも更新として提供されると思います。

Announcing Windows Admin Center 1809.5 Insider Preview
https://blogs.windows.com/windowsexperience/2018/12/11/announcing-windows-admin-center-1809-5-insider-preview/

Preview ではモジュールが修正されているので、このバグは修正されていると思います。

(1809 GA は左、1809.5 Preview は右)

1 件のコメント:

  1. 2019/1/9 に 1809.5 がリリースされました。1809 を導入済みの場合、Windows Update で 1809.5 に更新されます。

    返信削除

注: コメントを投稿できるのは、このブログのメンバーだけです。