treedown’s Report

システム管理者に巻き起こる様々な事象を読者の貴方へ報告するブログです。会社でも家庭でも"システム"に携わるすべての方の共感を目指しています。

※https化しました。その影響でしばらくリンク切れなどがあるかもしれませんが徐々に修正していきます。 リンク切れなどのお気づきの点がございましたらコメントなどでご指摘いただけますと助かります。

Windows11のRDPはパスワード保存ができないので対処

Windows11のリモートデスクトップを使っていて、Windows10までは出来ていたパスワード保存が出来なくなっていたので対処を実施することにしました。
実施した対処方法をご報告です。

現象

リモートデスクトップで他のPCに接続する時にユーザIDとパスワードという認証情報を保存することができますが、Windows11では保存した認証情報でRDP接続を試行するとエラーが発生してしまい、パスワードの再入力を要求されます。

エラーメッセージは
「Windows Defender Credential Guard では、保存された資格情報を使用できません。資格情報を入力してください。」

と記載されています。

調べる

調べたところ、Windows11 22H2から発生している問題のようです。22H2より前のWindows11では発生していないようですが、もうすぐサポート終了で22H2を強制されるはずなので、いま発生していない人でもアップデート後に発生すると考えられます。

Microsoft Learnに同様の問題が報告されていました。

Windows 11 22H2 - Can't use saved credential:
https://learn.microsoft.com/en-us/answers/questions/1021785/windows-11-22h2-can39t-use-saved-credential.html

ここで解決策として提示されているのはレジストリ設定の方法とcmdkeyで個別に認証情報を登録する方法の二種類でした。

以前やっていたcmdkeyを使う方法での対処方法をやってみることにします。

コマンドcmdkeyでRDP用の認証情報を登録する

さっそくコマンドcmdkeyを使って、リモートデスクトップで使用する認証情報を登録していきます。

コマンドの書式は、

cmdkey /generic:TERMSRV/%hostname% /user:%UserName% /pass

が基本の形になります。例えば、RDP接続の接続先のPC名が「hogePC」でユーザ名が「hogeUser」ならcmdkeyの構文は

cmdkey /generic:TERMSRV/hogePC /user:hogeUser /pass

となるのですが、登録される認証情報が「%COMPUTERNAME%\%UserName%」で登録される関係から

cmdkey /generic:TERMSRV/hogePC /user:hogePC\hogeUser /pass

と実行しています。

コマンドcmdkey実行してみる

さっそく実行してみました。

管理者で開いたコマンドプロンプトで

cmdkey /generic:TERMSRV/hogePC /user:hogePC\hogeUser /pass

を実行してみます。(※これ以降のコマンド実行は全て管理者:として実行したコマンドプロンプトで動作確認しています。)

実行すると、コマンドの下にパスワードを入力してくださいというプロンプトが表示され、画面は変化しませんがキーボードからパスワードを入力します。

パスワードの文字列を入力したら「Enterキー」を押下して確定させると
「資格情報を正しく追加しました。」と画面に表示され、RDPで使用する認証情報が登録されたことを示してくれます。

RDPで接続先のPCがローカルアカウントでなく、Microsoftアカウントを使っている用でも問題なくできることが確認できました。

この場合のコマンドは、ユーザの箇所をMicrosoftアカウントにするだけです。

cmdkey /generic:TERMSRV/%hostname% /user:%MicrosoftAccountAddr% /pass

で登録から接続まで可能でした。
「%MicrosoftAccountAddr%」の箇所は例えば<hoge@hotmail.com>とか<hoge@outlook.com>という感じでMicrosoftアカウントそのままの文字列になります。

--------------------------------------------------------------
実行例
--------------------------------------------------------------
C:\Users\k-hajime>cmdkey /generic:TERMSRV/hogePC /user:hoge@outlook.com /pass
'TERMSRV/hogePC' に接続するための 'hoge@outlook.com' のパスワードを入力してください:

CMDKEY: 資格情報を正しく追加しました。

C:\Users\k-hajime>cmdkey /list
(途中省略)
    ターゲット: LegacyGeneric:target=TERMSRV/hogePC3
    種類: 汎用
    ユーザー: hoge@outlook.com
--------------------------------------------------------------
これでMicrosoftアカウントでサインインしているPCに対してのリモートデスクトップ接続でもパスワードが聞かれなくなりました。

違いを比べてみる

GUIで認証情報を保存した場合(正常に動作しない)と、cmdkeyで認証情報を保存した場合(正常に動作する)の両方の認証情報を見比べてみると、なんとなく原因が見えてきました。

「cmdkey /list」の実行結果

--------------------------------------------------------------
(中略)

    ターゲット: Domain:target=TERMSRV/hogePC01
    種類: ドメイン パスワード
    ユーザー: hogePC01\hogeUser
    ローカル コンピューターの常設

    ターゲット: LegacyGeneric:target=TERMSRV/hogePC2
    種類: 汎用
    ユーザー: hogePC2\hogeUser

    ターゲット: LegacyGeneric:target=TERMSRV/hogePC3
    種類: 汎用
    ユーザー: hoge@outlook.com

--------------------------------------------------------------

「TERMSRV」の種類は「汎用」となっているのが正常に動作するタイプなのですが、GUIで認証情報を保存したリモートデスクトップ接続情報では種類が「ドメイン パスワード」と表示されています。これがバグの正体のようです。(保存する認証情報の種類が誤っている)
22H2のバグのせいで、正常に認証情報を保存することが出来なくなっているせいで、「Windows Defender Credential Guard では、保存された資格情報を使用できません。資格情報を入力してください。」エラーが発生する、ということだと考えられます。

この誤った認証情報を削除する方法も、cmdkeyで実行可能です。

コマンドcmdkeyの「/delete:」オプションを使用して、"target="で指定された文字列を指定して削除を実行できます。
前述の例ではhogePC01の認証情報が誤って登録されているため、

--------------------------------------------------------------
cmdkey /delete:TERMSRV/hogePC01

CMDKEY: 資格情報を正しく削除しました。
--------------------------------------------------------------

このように記憶された認証情報の削除が可能です。

レジストリ操作で解決する方法もある

今回cmdkeyで解決したのですが、この問題はレジストリエントリ追加で解決している人が多い印象です。

レジストリは

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceGuard

ここに、
「EnableVirtualizationBasedSecurity」キー追加、DWORD値で「0」に設定
「RequirePlatformSecurityFeature」キーを追加、DWORD値「0」に設定

別のレジストリキー
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa

ここに
「LsaCfgFlags」キー追加、DWORD値で「0」に設定

とこの三つのキーを追加した後、OSをリブートして動作を確認すると解消しているらしい。とはいえ今回はやっていないのでどのようになるか不明です。

Credential Guardを無効化するアプローチなので、以前と同じになるという対処法なのですが、今回はcmdkeyで個別に登録をしたので、Credential Guardは有効なまま、RDP接続でパスワードを聞かれないように設定したことになります。(なのでレジストリ設定は使っていない。)

何かでレジストリ設定を使わないといけない時のために自分用にメモを残しておく狙いです。