RDP接続時に資格情報を一時登録してmstscを起動する
はじめに
Windows端末から複数のサーバへリモートデスクトップ接続する運用では、
- 接続先サーバ名を毎回入力する
- ユーザー名を毎回入力する
- パスワード入力が何度も発生する
- 作業端末から決まったサーバへRDP接続する
- 一時的な作業で、接続手順を簡略化したい
といった場面があります。
リモートデスクトップ接続自体は、mstsc で簡単に起動できます。
ただ、資格情報の入力も含めて接続作業を補助したい場合、cmdkey を使ってWindows資格情報を一時的に登録し、その後 mstsc を起動する方法があります。
この記事では、batでRDP接続用の資格情報を一時登録し、mstsc を起動したあとに資格情報を削除するサンプルを紹介します。
想定する用途
このbatは、以下のような場面を想定しています。
- 閉域環境内での作業補助
- 検証環境や作業端末からのRDP接続補助
- 決まったサーバへ一時的に接続する作業
- 手順書どおりに接続先・ユーザーを指定したい場合
- 接続後に資格情報を残したくない場合
このbatは、資格情報を扱うため注意が必要です。
本番環境や不特定多数が触れる端末での利用、パスワードを平文で保存する運用は推奨しません。
やりたいこと
今回やりたいことは以下です。
- 接続先サーバ名を引数で受け取る
- 接続ユーザー名を引数で受け取る
- 接続パスワードを引数で受け取る
-
cmdkeyでRDP用の資格情報を一時登録する -
mstscでリモートデスクトップ接続を起動する - 接続後に登録した資格情報を削除する
使用するコマンド
主に以下を使います。
| コマンド | 用途 |
|---|---|
cmdkey |
Windows資格情報の登録・削除 |
mstsc |
リモートデスクトップ接続 |
reg add |
RDPクライアント設定の一時変更 |
reg delete |
一時変更した設定の削除 |
cmdkeyとは
cmdkey は、Windows資格情報をコマンドラインから登録・一覧表示・削除するためのコマンドです。
RDP接続用の資格情報を登録する場合は、以下のように指定します。
cmdkey /generic:TERMSRV/server01 /user:example\user01 /pass:password
TERMSRV/server01 は、RDP接続先に対する資格情報を意味します。
登録した資格情報を削除する場合は、以下のようにします。
cmdkey /delete:TERMSRV/server01
batサンプル
以下は、引数で接続先、ユーザー名、パスワードを受け取り、資格情報を一時登録してRDP接続を起動するbatのサンプルです。
@echo off
rem ==========================================
rem RDP接続補助bat
rem cmdkeyで資格情報を一時登録してmstscを起動する
rem ==========================================
rem 接続先情報
set SERVERNAME=%1
set USERNAME=%2
set PASSWORD=%3
set PORT=3389
rem 引数チェック
if "%SERVERNAME%"=="" goto error
if "%USERNAME%"=="" goto error
if "%PASSWORD%"=="" goto error
rem ==========================================
rem RDP接続時のID確認警告を一時的に回避する設定
rem 必要ない環境では、このreg add / reg deleteは削除する
rem ==========================================
reg add "HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client" /v AuthenticationLevelOverride /t REG_DWORD /d 0 /f
rem ==========================================
rem RDP用資格情報を一時登録
rem ==========================================
cmdkey /generic:TERMSRV/%SERVERNAME% /user:%USERNAME% /pass:%PASSWORD%
timeout /t 1 >nul
rem ==========================================
rem リモートデスクトップ接続
rem ==========================================
start mstsc /v:%SERVERNAME%:%PORT%
timeout /t 5 >nul
rem ==========================================
rem 登録した資格情報を削除
rem ==========================================
cmdkey /delete:TERMSRV/%SERVERNAME%
rem ==========================================
rem 一時的に変更したRDPクライアント設定を削除
rem ==========================================
reg delete "HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client" /v AuthenticationLevelOverride /f
goto end
:error
echo.
echo [Usage]
echo rdp_connect.bat ^<ServerName^> ^<UserName^> ^<Password^>
echo.
echo [Example]
echo rdp_connect.bat server01 example\user01 password
echo.
:end
実行例
以下のように実行します。
rdp_connect.bat server01 example\user01 password
この例では、
- 接続先:
server01 - ユーザー名:
example\user01 - パスワード:
password
として、RDP接続用の資格情報を一時登録します。
処理の流れ
このbatの流れは以下です。
1. 引数で接続先・ユーザー名・パスワードを受け取る
2. cmdkeyでTERMSRV/接続先の資格情報を登録する
3. mstscを起動する
4. 少し待つ
5. cmdkeyで登録した資格情報を削除する
6. 一時的に変更したレジストリ値を削除する
ポイントは、資格情報を登録しっぱなしにしないことです。
接続補助のために一時登録し、接続後に削除しています。
引数で渡す理由
接続先やユーザー名をbat内に固定で書くこともできます。
ただし、複数の接続先で使いたい場合は、引数で渡す方が使い回しやすくなります。
rdp_connect.bat server01 example\user01 password
rdp_connect.bat server02 example\user01 password
rdp_connect.bat server03 example\user01 password
接続先一覧を別batから呼び出すようにすれば、複数サーバへの接続補助にも使えます。
call rdp_connect.bat server01 example\user01 password
call rdp_connect.bat server02 example\user01 password
call rdp_connect.bat server03 example\user01 password
ただし、パスワードをbatに直接書くとリスクが高いため、実運用では慎重に扱ってください。
AuthenticationLevelOverrideについて
サンプルでは、以下のレジストリを一時的に追加しています。
reg add "HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client" /v AuthenticationLevelOverride /t REG_DWORD /d 0 /f
これは、RDP接続時に表示されることがある
このリモート コンピューターの ID を識別できません。
のような警告を回避する目的で使われることがあります。
ただし、この警告は接続先の証明書や識別に関わるものです。
安易に無視すべきものではありません。
検証環境や閉域の一時作業など、接続先が明確に分かっている場合に限定して扱うのがよいです。
不要な環境では、この reg add と reg delete の処理は削除してください。
資格情報を残さないための削除
登録した資格情報は、以下で削除しています。
cmdkey /delete:TERMSRV/%SERVERNAME%
作業端末に資格情報を残したままにすると、意図しない接続や情報漏えいのリスクがあります。
そのため、このbatでは接続後に削除する流れにしています。
ただし、mstsc 起動後すぐに削除すると、環境によっては認証タイミングと合わない場合があります。
そのため、サンプルでは timeout で少し待ってから削除しています。
timeout /t 5 >nul
待ち時間は環境に合わせて調整してください。
このbatでできること
このbatでは、以下のことができます。
- RDP接続先を引数で指定する
- 接続ユーザー名を引数で指定する
- 接続パスワードを引数で指定する
- RDP用の資格情報を一時登録する
-
mstscを起動する - 接続後に資格情報を削除する
- 接続作業の手順をある程度標準化する
注意点
パスワードを平文で扱う
このbatは、引数でパスワードを渡します。
そのため、以下の点に注意が必要です。
- コマンド履歴に残る可能性がある
- bat内に書くと平文で残る
- 画面を見られるとパスワードが見える
- 他のログに残る可能性がある
- 共有端末では特に危険
本番運用や不特定多数が使う端末では、安易に使わない方がよいです。
資格情報を保存しっぱなしにしない
cmdkey で登録した資格情報は、削除しない限り残ります。
確認したい場合は、以下で一覧表示できます。
cmdkey /list
不要な資格情報が残っている場合は、削除します。
cmdkey /delete:TERMSRV/server01
ID確認警告の回避は慎重に扱う
AuthenticationLevelOverride は、RDP接続時のID確認警告に関係します。
警告を回避すると、接続先の確認を弱めることになります。
以下のような環境では、むしろ警告を確認するべきです。
- インターネット越しの接続
- 接続先が不明確な環境
- DNS名や証明書が信頼できない環境
- 第三者が介在する可能性がある環境
閉域・検証・作業対象が明確な場合に限定して検討してください。
接続先名とcmdkeyの登録名を合わせる
cmdkey に登録する名前と、mstsc で接続する名前がずれると、資格情報が使われない場合があります。
たとえば、以下は別物として扱われることがあります。
server01
server01.example.local
192.168.1.10
mstsc で接続する名前に合わせて、TERMSRV/接続先 を登録してください。
管理者権限について
cmdkey は通常ユーザーでも実行できる場合がありますが、レジストリ変更や環境によっては権限が必要になることがあります。
うまく動作しない場合は、実行権限やグループポリシーの制限を確認してください。
より安全な方法も検討する
このbatは、現場作業の補助としては便利ですが、資格情報の扱いに注意が必要です。
環境によっては、以下のような方法も検討してください。
- RDPファイルを使う
- Windows資格情報マネージャーで事前登録する
- 管理用端末を限定する
- 踏み台サーバを使う
- MFAや特権ID管理の仕組みを使う
- 接続先ごとの権限を最小化する
まとめ
cmdkey を使うことで、RDP接続用の資格情報を一時的に登録し、mstsc を起動できます。
接続後に資格情報を削除することで、作業端末に資格情報を残しっぱなしにしない運用も可能です。
ただし、パスワードを引数で渡す方式はリスクがあります。
大事なのは、
接続を楽にすること
だけではなく、
資格情報をどこに残すのか、残さないのかを意識すること
だと思います。
閉域環境や検証作業など、用途を限定したうえで、接続補助として使うのがよいです。