2019/07/17(水)RDP ログイン自動化マクロ(マスターパスワード利用版)

2021/05/21 06:42 Macro::macro サンプル

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 以降*1
exec の機能のうち、Tera Term バージョン 4.78以降が必要になる機能*2は未使用です。

利用する Tera Term コマンド:
種別:制御Ver機能の簡易説明
callサブルーチンをコールする。
endマクロの実行そのものを終了する。
gotoラベルへジャンプする。
if,then,elseif,else,endif条件分岐
pause休止する。
returnサブルーチンを抜け、メインルーチンへ戻る。
種別:文字列操作Ver機能の簡易説明
expandenv4.71以降環境変数文字列を展開する。
sprintf24.62以降フォーマットされた出力を返す。
strspecial4.67以降特殊文字を変換する。
種別:ファイル操作Ver機能の簡易説明
filedeleteファイルを削除する。
filesearchファイルまたはフォルダがあるか確かめる。
foldersearch4.69以降フォルダがあるか確かめる。
getdirMACRO の現在のディレクトリを得る。
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アドレスでは別管理になります。
ユーザ名入力
ログインのためのユーザ名入力画面が表示されます。

自身の利用されるユーザ名を入力してください。
ユーザ名入力


ユーザ名は、パスワード管理ファイルにおける識別名の一部として利用されます。
マスターパスワード
マスターパスワードの入力画面が表示されます。

パスワードファイルを暗号化/復号化するためのパスワードを入力してください。
マスターパスワード入力


マスターパスワードはパスワードファイルを管理するための情報であるため、毎回必ず入力します。
ログインパスワード入力
初回アクセス時、アクセス先ホスト用のパスワード入力画面が表示されます。
ユーザ名に対応したパスワードを入力してください。
アクセス先パスワード入力


"ユーザ名+ホスト名" が過去にアクセスした情報と合致した場合は、表示されません。
過去に入力した情報を利用します。
接続待ち
リモートデスクトップ接続を行います。

RDP 接続待ち



リモートデスクトップ接続で利用するアクセス情報は、接続開始後 10 秒程度で削除します。
セッションの開始に 10 秒以上かかる場合は、適宜数値を大きくしてください。

*1 : 保存する文字コードによっては Tera Term バージョン 4.102 以降

*2 : exec において、カレントディレクトリを指定するオプション

コード

著作権情報

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/24RDPSecurityLogin_v4.zip・コマンドライン版 7zip で、誤ったパスワード入力で生成される、内容の壊れた解凍ファイルに対策した。
・関連して、アカウント情報の処理順序を入れ替えた。
・パスワードファイルのアーカイブ処理を、情報収集完了の直後に移動した。
・Windows に登録したアカウント情報を削除するタイミング(秒数)を変数に置き換えた。
第3版2019/7/18RDPSecurityLogin_v3.zip・アカウントの管理用識別子を、hostname@user から user@hostname の形式に変更した。
第2版2019/7/17 PMRDPSecurityLogin_v2.zip・コマンドライン版 7zip は、圧縮時に上書き保存する仕様。マクロファイルの動作に問題はないが、マクロの仕様として正しくないため上書きしないようにファイルの確認を追加した。
・パスワード zip ファイルは、解凍後すぐに削除するよう修正した。
初版2019/7/17 AMRDPSecurityLogin.ZIP・初版を公開した。