2019/06/16(日)RDP ログイン自動化マクロ

はてブ数 2019/06/16 05:16 Macro::macro サンプル

RDP ログイン自動化マクロ

このサンプルマクロは、以下の仕様を満たすものとします。

マクロの目的

Windows RDP でのアクセス情報を保持し、同一ホストに対する 2 回目以降のパスワード入力を回避します。

また、毎回デフォルト設定で良いか問い合わせ、アクセス情報の変更があった場合も収集情報を保持することとします。
この機能により、アクセス先情報を変更した同一ファイルを複数実行しても、パスワードファイル内でコンフリクトしないようになります。

利用可能環境

Teraterm
依存する Tera Term バージョン:Tera Term 4.71 以降*1

利用する Tera Term コマンド:
種別:制御Ver機能の簡易説明
callサブルーチンをコールする。
endマクロの実行そのものを終了する。
pause休止する。
returnサブルーチンを抜け、メインルーチンへ戻る。
種別:文字列操作Ver機能の簡易説明
expandenv4.71以降環境変数文字列を展開する。
sprintf24.62以降フォーマットされた出力を返す。
種別:ファイル操作Ver機能の簡易説明
filecloseファイルハンドルを閉じる。
fileopenファイルを開く。
filewritelnファイルに文字列を改行付きで書き込む。
getdirMACRO の現在のディレクトリを得る。
makepathフルパス名を作成する。
種別:パスワードコマンドVer機能の簡易説明
getpasswordパスワードを読み出す。
種別:その他Ver機能の簡易説明
execアプリケーションを起動する。
4.63以降起動したアプリケーションの終了を待つオプションの追加。
4.78以降カレントディレクトリを指定するオプションの追加。
gettime現在の時刻を得る。
4.57以降書式を指定するオプションの追加。
4.58以降互換性維持のための仕様変更。
4.74以降タイムゾーンを指定するオプションの追加。
4.80以降マクロ実行前後でタイムゾーンを復元するよう仕様変更。
inputbox文字列を入力するためのダイアログボックスを開く。
4.53以降デフォルト入力文字を設定するオプションの追加。
4.54以降特殊文字の解釈を制御するオプションの追加。

マクロの使い方

実行タイミング
任意のタイミングで実行可能です。
マクロの指定方法
詳細は TeraTerm マクロの使い方 を参照してください。
ttpmacro.exe を利用する場合
ファイルの拡張子 .ttl を ttpmacro.exe へ関連付けしておきます。
.ttl ファイルをダブルクリック等で実行します。
ttermpro.exe を利用する場合
ttermpro.exe を利用する場合は、起動時にオプションへ /M=xxx.ttl のように指定します。
メニューから実行する場合
Tera Term メニューから「コントロール(O)」→「マクロ(M)」を選択します。
対象ファイルを選択して「開く」ボタンをクリックすると、実行されます。

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

コード

著作権情報

このサンプルマクロに関する著作権は、当サイトが所有しています。
著作権者
神場 和也
ライセンス
修正 BSD ライセンス
関連情報
(なし)

コード

ファイルダウンロード
rdplogin.zip

※ 解凍してご利用ください。
項目内容
文字コードUTF-8 (BOM付)
実行確認バージョンローカル側
Tera Term バージョン 4.102
リモート側
Windows 10 バージョン 1903 (OS ビルド 18362.207)
備考下記コピペ用ソースコードをファイルに保存したものです。
コピペ用
以下のソースコードをファイルに保存のうえご利用ください。

※ UTF-8 で保存した場合は、Tera Term Ver 4.102 以降で実行する必要があります。詳細は マクロファイルの仕様 を参照してください。

・cmdkey と mstsc.exe を利用してリモートデスクトップ接続を行うマクロ
想定ファイル名:rdplogin.ttl
; RDP login macro of Tera Term
;
; File: rdplogin.ttl
; Description: auto login with SSH2 protocol
; Environment: generic
; Update: 2019/6/16
; Author: Kazuya Jimba

;;; 環境設定 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; アクセス先
defaulthost = '192.168.0.1'

;; ポート番号
portnumber = 3389

;; ユーザ情報
defaultuser = 'administrator'

;; ディレクトリ情報
getdir pBaseDir

;; ファイル情報
pPasswdData = 'password.dat'
gettime pLogData "teraterm-rdp-%Y%m%d.log"

;; パス情報
; パスワード暗号化ファイル
makepath pPasswdFile pBaseDir pPasswdData

; Tera Term ログ
makepath pPasswdFile pBaseDir pPasswdData
makepath pLogFile    pBaseDir pLogData

; サブルーチン fnLog 用変数初期化
pOutputLine = ''

; RDP コマンドフルパス確定処理
RDP = "%windir%\system32\mstsc.exe"
expandenv RDP

;;; ログイン情報収集 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

pOutputLine = 'rdplogin.ttl マクロ開始'
call fnLog

inputbox 'ユーザ名を入力してください' 'アカウント入力' defaultuser
username = inputstr

sprintf2 msg "%s でアクセスするホスト名を入力してください。" username
inputbox msg 'ホスト名入力' defaulthost
hostname = inputstr

sprintf2 pPasswdName "%s@%s" username hostname
getpassword pPasswdFile pPasswdName Password

pOutputLine = '情報収集完了'
call fnLog

;;; メイン処理 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

pOutputLine = 'メイン処理開始'
call fnLog

;; Windows OS へのアカウント登録
sprintf2 line "cmdkey /generic:TERMSRV/%s /user:%s /pass:%s" hostname username password
exec line

; 実行コマンドの組み立て
sprintf2 CMD "%s /v:%s:%d" RDP hostname portnumber

sprintf2 pOutputLine "%s へのRDP ログイン実行" hostname
call fnLog

;; ログイン
exec CMD

; 接続中に登録情報を削除してしまうことがあるため、30秒待機します。
; バージョン 4.63 以降に追加された exec のオプション wait は、今回除外しています。

pause 30

; Windows OS に登録したアカウント情報の削除
sprintf2 line "cmdkey /delete:TERMSRV/%s:%d" hostname portnumber
exec line

;;; 終了処理 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

pOutputLine = 'rdplogin.ttl マクロ終了'
call fnLog

end

;;; 関数処理 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; マクロログ取得
:fnLog
    ; 変数 pOutputLine の内容をログファイルへ出力するサブルーチン。
    fileopen fhLog pLogFile 1

    ; ログ出力時刻情報取得
    gettime pLogTime "%Y/%m/%d %H:%M:%S"

    ; メッセージ生成
    sprintf2 MsgLine "%s %s" pLogTime pOutputLine

    ; ファイルへ追記して終了
    filewriteln fhLog MsgLine
    fileclose fhLog

return

備考

logopen は connect での接続後に有効となるため、RDP 接続には使えません。そのため、Tera Term 実行ログとして fileopen を利用しています。