リモートデスクトップした先のPCに自動で文字入力したい、
あるいは、特定の操作を自動でさせたい。
先日とある要件でリモートデスクトップ先に文字入力させる必要があり
その実現方法について、備忘録として記録します。
結果として、要件は満たせていますが、見る人が見るとルール無視無視状態だと思いますがご容赦のほど。
VBAではリモートデスクトップ先を操作できない
以前、ソフトウェアからレポートを定期的に取得するために
VBスクリプトでSendkeysを駆使して実現したことがあったため
RDP先も同様に操作できないか試してみました。
が、結果はNGでした。
リモートデスクトップ接続までは上手く実行できるものの
制御がリモートPCに移ると、スクリプトの動作が停止してしまい
そこで処理が止まってしまいました。
https://oshiete.goo.ne.jp/qa/8221763.html
はじめにこのあたりを読んでいれば。。。
他に手段がないか調べたものの、正解にたどりつかず
仕方がないため、既存のツールを使って作成することにしました。
UWSCで解決
PC自体を自動操作するツールはいくつかありますが
比較して試すのも辛かったので、以前見かけたことがある
UWSCを試したところ、制御がリモート先のPCに移っても
スクリプトが動き続けてくれたので、こちらを利用することにしました。
※本家サイトが、閉鎖しているページもありと見かけたので、ベクターからダウンロードする
https://www.vector.co.jp/soft/winnt/util/se115105.html
インストール不要の親切ツールです。
作成したコード
今回は実際に作成したものを一部変更して記載しておきます。
動作としては、
リモートデスクトップを起動して、操作対象PCへリモートログイン
⇒リモートデスクトップ先のメモ帳を起動
⇒あらかじめ作成した文字列(英数字のみ)を打ち込む
という動作です。
①資材準備
各資材を同じフォルダ階層に格納します。
リモートデスクトップ接続用のremotePC.rdpファイルは、あらかじめ接続先情報を保存し、接続先確認をスキップできるように準備しておいて下さい。
親フォルダ\
・remotePC.rdp
・MojisendTool.ps1 ←今回作りこんだソース
・uwsc5302\uwscフォルダ(配下にVectorからダウンロードして解凍済みのファイル一式)

②ソースファイル準備
MojisendTool.ps1を作成します。
コードの中身は以下のブロックから構成されています。
〇特殊文字変換ブロック
### UWSC Virutal key convert ###
function VKeyConv ($WORD)
{
switch($WORD){
. { $ADDWORD = 'KBD(VK_OEM_PERIOD,DOWN,100)' }
`# { $ADDWORD = 'KBD(VK_RSHIFT,DOWN,50)' + "`n" + 'KBD(VK_3,CLICK,300)' + "`n" + 'KBD(VK_RSHIFT,UP,50)'}
`! { $ADDWORD = 'KBD(VK_RSHIFT,DOWN,50)' + "`n" + 'KBD(VK_1,CLICK,300)' + "`n" + 'KBD(VK_RSHIFT,UP,50)'}
`\ { $ADDWORD = 'KBD(VK_OEM_5,CLICK,50)' + "`n"}
default { $ADDWORD = "KBD(VK_$WORD,CLICK,100)" }
}
return $ADDWORD;
}
ココがミソ
外部関数として特殊文字を変換するためのブロック「VKConv」を入れています。
これを作成することで、#、!、\を入力できるようになります。他に利用したい記号などある場合もここに追記できます。
また、キーボード配列によっては入力文字の番号が異なってくる可能性があるため、うまく動かなかった(別の文字が入力されてしまう)場合は
こちらの変換のマッピングを変更してみてください。
※UWSCの自動記録で実際に打ちこむと、対応したコード番号が取れます。
〇UWSCコンフィグの作成
### UWSC Config Create ###
function CREATE_UWSC_CNF ($START_APP_NAME_S, $INPUT_CHAR_S)
{
# Run
$UWCS_config = $UWCS_config + "KBD(255,CLICK,2891)`n"
$UWCS_config = $UWCS_config + "KBD(VK_TAB,CLICK,200) `n"
$UWCS_config = $UWCS_config + "KBD(VK_WIN,DOWN,200) `n"
$UWCS_config = $UWCS_config + "KBD(VK_R,CLICK,10) `n"
$UWCS_config = $UWCS_config + "KBD(VK_WIN,UP,200) `n"
$UWCS_config = $UWCS_config + "ACW(GETID(`"ファイル名を指定して実行`",`"#32770`"),15,863,399,206,0) `n"
$i = 0
while($i -ne $START_APP_NAME_S.Length){
$ADD = VKeyConv $START_APP_NAME_S.Substring($i,1)
$UWCS_config = $UWCS_config + "$ADD `n"
$i++;
}
$UWCS_config = $UWCS_config + "SLEEP(1)`n"
$UWCS_config = $UWCS_config + "KBD(VK_RETURN,CLICK,200) `n"
$UWCS_config = $UWCS_config + "SLEEP(1)`n"
$i = 0
while($i -ne $INPUT_CHAR_S.Length){
$ADD = VKeyConv $INPUT_CHAR_S.Substring($i,1)
$UWCS_config = $UWCS_config + "$ADD `n"
$i++;
}
return $UWCS_config
}
このブロックで引数で受け取った内容を、UWSCに食わせるためのコンフィグを生成しています。
引数「START_APP_NAME_S」で受け取ったアプリ名を「ファイル名を指定して実行」に入力して起動し、起動したアプリ(ここではメモ帳)に引数「INPUT_CHAR_S」で受け取ったを入力しています。
〇UWSCマクロの実行
######################
######## MAIN ########
######################
# start application name #
$START_APP_NAME = "notepad"
# input character #
$INPUT_CHAR = "test1#!\"
$scriptPath = $MyInvocation.MyCommand.Path
$Current_Directoty = Split-Path -Parent $scriptPath
### start main ###
$Yesno = Read-Host("リモートPCに接続し、作業を開始します。[Enter]")
$UWSC_CONF = CREATE_UWSC_CNF $START_APP_NAME $INPUT_CHAR
Write-Output $UWSC_CONF | Out-File $Current_Directoty\uwsc5302\AutoWork.UWS
start $Current_Directoty\RemotePC.rdp
Start-Sleep -s 5
Start-Process -FilePath "$Current_Directoty\uwsc5302\UWSC.exe" -ArgumentList "$Current_Directoty\uwsc5302\AutoWork.UWS" -Wait
UWSCに読み込ませるコンフィグファイルを生成する関数へ、引数を渡します。
起動したいアプリ名や、送信する文字列は頭に定義した変数に格納する内容を変更することで変更できます。
③ツールの実行
ここまで来たら準備完了です。
Powershellからツールを実行(「MojisendTooL.ps1」を選択して右クリック⇒「PowerShellで実行」を選択)します。

なお、Powershellが動かない場合は、権限が不足している可能性があるので、実行権限を付与するなど試してみてください。
>PowerShell -ExecutionPolicy RemoteSigned .\MojisendTool.ps1
まとめ – 作りこみは楽しい。が、時間が掛かる。
これまでほとんどプログラミングを経験せずに
時が過ぎてしまったため、コードを作るよい機会になりました。
たったこれだけの動作をさせるためにも、調査や動作を確かめるのにかなり時間が掛かかりました。
エラー処理やら、コーディングルールやら、お作法やらはすべてスルーしましたが、実際には守らなければいけないことが沢山あるはずで、お仕事で取り組んでいる方々には尊敬の限りです。
ここでは、自分だけが使う便利ツールなら気にしない。の精神で走りきりました!達成感!