2019/07/17(水)RDP ログイン自動化マクロ(マスターパスワード利用版)
2021/05/21 06:42
RDP ログイン自動化マクロ(マスターパスワード利用版)
このサンプルマクロは、以下の仕様を満たすものとします。マクロの目的
Windows RDP でのアクセス情報を保持し、同一ホストに対する 2 回目以降のパスワード入力を回避します。また、毎回デフォルト設定で良いか問い合わせ、アクセス情報の変更があった場合も収集情報を保持することとします。
この機能により、アクセス先情報を変更した同一ファイルを複数実行しても、パスワードファイル内でコンフリクトしないようになります。
ただし、保持するアクセス情報はサーバへのログインとは別に、毎回のパスワード入力を必須とします。
この目的のために Tera Term の getpasswd コマンドで作成したパスワードファイルを、暗号化または解凍します。
アーカイブ作成・解凍のための前提アプリに、コマンドライン版 7zip を利用します。
7zip は、GNU LGPL ライセンスによって開発されているアーカイバです。
https://sevenzip.osdn.jp/
利用可能環境
Windows (リモートデスクトップ)
リモートデスクトップは、Windows 標準のプログラムを利用します。・リモートデスクトップ接続クライアント
%windir%\system32\mstsc.exe
Windows (7zip)
7zip を利用するための環境は、以下の通りです。インストールディレクトリ = C:\7za920
実行ファイル名 = 7za.exe
※ 上記フォルダは、マクロの設定ファイルで任意のものに書き換えることが可能です。
サンプルスクリプトでは、コマンドライン版 7zip を上記フォルダに格納していることが前提です。
マクロの設定ファイルを、環境に合わせて書き換えてください。
Tera Term
依存する Tera Term バージョン:Tera Term 4.71 以降*1exec の機能のうち、Tera Term バージョン 4.78以降が必要になる機能*2は未使用です。
利用する Tera Term コマンド:
種別:制御 | Ver | 機能の簡易説明 |
---|---|---|
call | サブルーチンをコールする。 | |
end | マクロの実行そのものを終了する。 | |
goto | ラベルへジャンプする。 | |
if,then,elseif,else,endif | 条件分岐 | |
pause | 休止する。 | |
return | サブルーチンを抜け、メインルーチンへ戻る。 | |
種別:文字列操作 | Ver | 機能の簡易説明 |
expandenv | 4.71以降 | 環境変数文字列を展開する。 |
sprintf2 | 4.62以降 | フォーマットされた出力を返す。 |
strspecial | 4.67以降 | 特殊文字を変換する。 |
種別:ファイル操作 | Ver | 機能の簡易説明 |
filedelete | ファイルを削除する。 | |
filesearch | ファイルまたはフォルダがあるか確かめる。 | |
foldersearch | 4.69以降 | フォルダがあるか確かめる。 |
getdir | MACRO の現在のディレクトリを得る。 | |
makepath | フルパス名を作成する。 | |
種別:パスワードコマンド | Ver | 機能の簡易説明 |
getpassword | パスワードを読み出す。 | |
passwordbox | パスワードを入力するためのダイアログボックスを開く。 | |
4.54以降 | 特殊文字の解釈を制御するオプションの追加。 | |
種別:その他 | Ver | 機能の簡易説明 |
exec | アプリケーションを起動する。 | |
4.63以降 | 起動したアプリケーションの終了を待つオプションの追加。 | |
4.78以降 | カレントディレクトリを指定するオプションの追加。 | |
inputbox | 文字列を入力するためのダイアログボックスを開く。 | |
4.53以降 | デフォルト入力文字を設定するオプションの追加。 | |
4.54以降 | 特殊文字の解釈を制御するオプションの追加。 | |
messagebox | ダイアログボックスを開き、ユーザーにメッセージを知らせる。 | |
4.54以降 | 特殊文字の解釈を制御するオプションの追加。 | |
4.60以降 | キャンセル時にマクロ停止を確認する機能の追加。 | |
yesnobox | ダイアログボックスを開き、ユーザーに「はい」/「いいえ」を選択させる。 | |
4.54以降 | 特殊文字の解釈を制御するオプションの追加。 | |
4.60以降 | キャンセル時にマクロ停止を確認する機能の追加。 |
当サンプルスクリプトで getpassword コマンドで生成するファイルは、マクロファイルと同じフォルダに置いてあることが前提です。
適宜、マクロの設定ファイルで任意のものに書き換えてください。
マクロの使い方
実行タイミング
任意のタイミングで実行可能です。マクロの指定方法
詳細は TeraTerm マクロの使い方 を参照してください。ttpmacro.exe を利用する場合
ファイルの拡張子 .ttl を ttpmacro.exe へ関連付けしておきます。.ttl ファイルをダブルクリック等で実行します。
ttermpro.exe を利用する場合
ttermpro.exe を利用する場合は、起動時にオプションへ /M=xxx.ttl のように指定します。メニューから実行する場合
Tera Term メニューから「コントロール(O)」→「マクロ(M)」を選択します。対象ファイルを選択して「開く」ボタンをクリックすると、実行されます。
実行時の入力情報
入力する情報は、「ホスト名」→「ユーザ名」→「マスターパスワード」の順になります。マスターパスワードで解凍するパスワードファイルに、対象のユーザパスワードがない場合は「ログインパスワード」を入力します。
ホスト名入力
アクセス先ホスト名の入力画面が表示されます。ホスト名もしくはIPアドレスを入力してください。
ホスト名は、パスワード管理ファイルにおける識別名の一部として利用されます。
アクセス対象が同じでも、ホスト名とIPアドレスでは別管理になります。
ユーザ名入力
ログインのためのユーザ名入力画面が表示されます。自身の利用されるユーザ名を入力してください。
ユーザ名は、パスワード管理ファイルにおける識別名の一部として利用されます。
マスターパスワード
マスターパスワードの入力画面が表示されます。パスワードファイルを暗号化/復号化するためのパスワードを入力してください。
マスターパスワードはパスワードファイルを管理するための情報であるため、毎回必ず入力します。
ログインパスワード入力
初回アクセス時、アクセス先ホスト用のパスワード入力画面が表示されます。ユーザ名に対応したパスワードを入力してください。
"ユーザ名+ホスト名" が過去にアクセスした情報と合致した場合は、表示されません。
過去に入力した情報を利用します。
接続待ち
リモートデスクトップ接続を行います。リモートデスクトップ接続で利用するアクセス情報は、接続開始後 10 秒程度で削除します。
セッションの開始に 10 秒以上かかる場合は、適宜数値を大きくしてください。
コード
著作権情報
7zip に関する著作権は、7zip 開発プロジェクトおよび参加されている開発者が所有しています。https://sevenzip.osdn.jp/ を参照してください。
以下、著作権情報はサンプルマクロに限定して記述します。
このサンプルマクロに関する著作権は、当サイト管理者が所有しています。
著作権者
神場 和也ライセンス
3条項BSDライセンス関連情報
このマクロは、以下のサンプルスクリプトの組み合わせで実現しています。サンプルコード
ファイルダウンロード
RDPSecurityLogin_v4.zip※ 解凍してご利用ください。
項目 | 内容 |
---|---|
文字コード | Shift JIS |
実行確認バージョン | ローカル側 Tera Term バージョン 4.103 リモート側 Windows 10 バージョン 1903 (OS ビルド 18362.239) |
初版 | 2019/7/17 AM 初版作成 |
備考 | 下記コピペ用ソースコードをファイルに保存したものです。 |
コピペ用
以下のソースコードをファイルに保存のうえご利用ください。※ UTF-8 で保存した場合は、Tera Term Ver 4.102 以降で実行する必要があります。詳細は マクロファイルの仕様 を参照してください。
・cmdkey / コマンドライン版 7zip / mstsc.exe を利用してリモートデスクトップ接続を行うマクロ
想定ファイル名:RDPsecurityLogin.ttl
; RDP access ttl macro. ; File: RDPsecurityLogin.ttl ; Description: auto login with SSH2 protocol ; Environment: generic ; Update: 2019/7/24 ; Author: Kazuya Jimba ;;; 環境設定 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; デフォルトユーザ名の指定 _defaultUserName = 'User' ; デフォルトアクセス先情報の指定 _defaultHostName = '192.168.0.1' ; 当スクリプトが管理するファイルを置くディレクトリの指定 getdir _pwdir ; 当スクリプトが管理するファイル名の指定 _defaultPassFile = 'SecurityLogin.dat' _defaultPassZip = 'SecurityLogin.zip' ; 暗号化/復号化する、コマンドライン版 7zip のパス情報指定 _7zipDir = 'C:\7za920' _7zipExe = '7za.exe' ; RDP 接続時における、Windows 登録情報削除までの待機時間 _DeleteWaitTime = 10 ; 利用に際して、変更すべき情報は以上です。 ; パス生成 makepath _7zip _7zipDir _7zipExe makepath _pwdat _pwdir _defaultPassFile makepath _pwzip _pwdir _defaultPassZip ; 環境ファイルの確認 ; パスワードファイルの有無 _target = _pwdat call subFileSearch _flagPassFile = result ; zip ファイルの有無 _target = _pwzip call subFileSearch _flagPassZip = result ;;; メイン処理 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; 情報収集 ;; アクセス情報取得 sprintf2 msg "アクセスするホスト名を入力してください。" inputbox msg 'ホスト名入力' _defaultHostName hostname = inputstr inputbox 'ユーザ名を入力してください' 'アカウント入力' _defaultUserName username = inputstr ;; パスワード情報取得 _msgtitle = 'マスターパスワード入力' _msgline = '暗号化/復号化のためのマスターパスワードが必要です。\nマスターパスワードを入力してください。' strspecial _msgline passwordbox _msgline _msgtitle 1 _filepassword = inputstr ; もし .dat があるなら処理の続行を確認。 if _flagPassFile == 1 then sprintf2 _msg "%s が存在します。\n処理を続行しますか?" _defaultPassFile strspecial _msg yesnobox _msg 'Error' if result then ; YES ; もし Zip があったらエラー。 if _flagPassZip <> 0 then sprintf2 _msg "ZIP ファイル(%s)が存在します。\nいずれかを削除し、当スクリプトの稼働環境を修復してください。" _defaultPassZip strspecial _msg messagebox _msg 'Error' end endif else ; NO goto NormalEnd endif elseif _flagPassFile == 0 then ; .dat がなければ、zip を探す。 if _flagPassZip == 1 then ; zip が存在すれば解凍 sprintf2 _ExtractCmd "%s x -tzip -p%s %s -o%s" _7zip _filepassword _pwzip _pwdir exec _ExtractCmd 'hide' 1 ; result (errorlevel) が 0 なら成功とみなして zip ファイルを削除する。 if result == 0 then filedelete _pwzip elseif result then ; メッセージ生成 sprintf2 msg 'パスワードファイルの解凍に失敗しました。\n\n 対象ファイル: %s\n Exit Code: %d' _pwzip result sprintf2 title '解凍失敗' strspecial msg messagebox msg title ;; 7zip エラーコードの意味(7zip のヘルプより引用) ; Code Meaning ; 0 No error ; 1 Warning (Non fatal error(s)). For example, one or more files were locked by some other application, so they were not compressed. ; 2 Fatal error ; 7 Command line error ; 8 Not enough memory for operation ; 255 User stopped the process ; もしファイルがあれば削除 ; (パスワードを間違えると、内容の破壊されたパスワードファイルができることがある) _target = _pwdat call subFileSearch if result == 1 then filedelete _pwdat endif end endif elseif _flagPassZip < 0 then ; ディレクトリならエラー終了 goto ErrorEnd endif else ; ディレクトリならエラー終了 goto ErrorEnd endif sprintf2 account "%s@%s" username hostname getpassword _defaultPassFile account password ; 必要な情報は全て変数へ格納したので、ファイルはアーカイブしておく。 ; 圧縮コマンドの生成 sprintf2 _ArchiveCmd "%s a -tzip -p%s %s %s" _7zip _filepassword _pwzip _pwdat ; 暗号化処理コマンドラインを実行する。 exec _ArchiveCmd 'hide' 1 ; result (errorlevel) が 0 なら成功とみなして dat ファイルを削除する。 if result == 0 then filedelete _pwdat else ; メッセージ生成 sprintf2 msg 'パスワードファイルの圧縮に失敗しました。\n\n 対象ファイル: %s\n Exit Code: %d' _pwzip result sprintf2 title '圧縮失敗' strspecial msg messagebox msg title end endif ; 元ファイルを削除する。 filedelete _pwdat if result = 1 then sprintf2 msg 'ファイル %s が削除できませんでした。' _pwdat end endif ;;; 接続処理 ; Windows へのアカウント登録 sprintf2 line "cmdkey /generic:TERMSRV/%s /user:%s /pass:%s" hostname username password exec line ; Remote Desktop 接続 expandenv RDP "%windir%\system32\mstsc.exe" sprintf2 CMD "%s /v:%s" RDP hostname exec CMD ;;; 接続後処理 ; RDP 接続できたら、以下のマクロはバックグランドで動作。 ; 接続中に Windows への登録情報を削除してしまうことがあるため、待機 pause _DeleteWaitTime ; 登録した情報の削除コマンド sprintf2 line "cmdkey /delete:TERMSRV/%s" hostname exec line ;;; 終了処理 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; :NormalEnd end :ErrorEnd sprintf2 _msg "予期しないエラーを検知しました。\nスクリプトの処理を終了します。" strspecial _msg messagebox _msg 'Error' end ;;; サブルーチン ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; :subFileSearch ; ################################# ; # サブルーチン:subFileSearch ; ################################# ;; 対象を確認する。 ;; -1 対象はディレクトリ ;; 0 存在しない ;; 1 対象はファイル filesearch _target if result = 1 then ; ファイルかフォルダが存在するので、選別 foldersearch _target if result = 1 then ; 対象はフォルダ _result = -1 else ; 対象はファイル _result = 1 endif else ; ファイルもフォルダも存在しない _result = 0 endif result = _result return
備考
改版履歴
バージョン | 公開日付 | 添付ファイル | 内容 |
---|---|---|---|
第4版 | 2019/7/24 | RDPSecurityLogin_v4.zip | ・コマンドライン版 7zip で、誤ったパスワード入力で生成される、内容の壊れた解凍ファイルに対策した。 ・関連して、アカウント情報の処理順序を入れ替えた。 ・パスワードファイルのアーカイブ処理を、情報収集完了の直後に移動した。 ・Windows に登録したアカウント情報を削除するタイミング(秒数)を変数に置き換えた。 |
第3版 | 2019/7/18 | RDPSecurityLogin_v3.zip | ・アカウントの管理用識別子を、hostname@user から user@hostname の形式に変更した。 |
第2版 | 2019/7/17 PM | RDPSecurityLogin_v2.zip | ・コマンドライン版 7zip は、圧縮時に上書き保存する仕様。マクロファイルの動作に問題はないが、マクロの仕様として正しくないため上書きしないようにファイルの確認を追加した。 ・パスワード zip ファイルは、解凍後すぐに削除するよう修正した。 |
初版 | 2019/7/17 AM | RDPSecurityLogin.ZIP | ・初版を公開した。 |