隣のwindowsXPの画面に出てるボタンを押す方法

ちょっと前までは、WMI経由で、WIN32_Processを使えばリモートの画面を触るプログラムは簡単に書けた。
こういう感じかな

// aaa.js という名前で保存して次のように実行する
// CScript aaa.js
// 
var sh =WScript.CreateObject("WScript.Shell");
var locator = new ActiveXObject("WbemScripting.SWbemLocator.1");
var service = locator.ConnectServer("192.168.0.100", "root\cimv2", "administrator", "adminpass");
var p = service.Get("Win32_Process");
p.Create("calc.exe");

こう書いたスクリプトを実行すると、192.168.0.100の(パスワードがadminpassである)administratorで電卓が起動する。ただし、非表示だ。windows2000のsp2ぐらいから、画面表示しなくなってきた。だから、画面上のプログラムにメッセージを送る方法は途絶えたものだと思ってた。例えば、実際には、calc.exeの部分にfindwindowして、狙ったwindowに特定のメッセージを投げつけるような処理も、昔は許されたが、今はもう書けない。この方法ではfindwindowが失敗するようになった(それだけ、windowsのセキュリティが上がった)
では、何らかの管理上の理由で隣のwindowsXPとか2003serverとかのボタンを押せばいいだろう?今は、wmi経由で頑張るのは正しくなく、正しいやり方は、タスクを使う、つまり、schtasks.exeだ。
こいつを上手く使うと、隣の端末のwindowにまで制御を及ぼすことができる。
1.タスク登録時の実行ユーザが、制御相手のwindowsに現在ログオンしているユーザと一致している
2.相手の端末のIPアドレス、ユーザ名、パスワードを知っている(つまり管理対象である)
3.タスクに画面上へ制御を及ぼすタスクが登録されている(findWindowしたり、Sendkeysで特定のキーイベント送ったり)
という状況下で

schtasks /RUN タスク名 /S ipアドレス /U ユーザ名 /P パスワード

という風に実行すると、タスクが画面を操作できるようになる。
schtasksは他にも面白い使い方がたくさんあり、リモートマシンへのタスク登録も実施できたりするのでちょっと重い処理はLANMANと組み合わせてリモートマシン側に登録を任せ終了したらイベントログに書き込むようにして、、こっちではイベントログを監視するようなスクリプトを組んで、、というような分散処理も比較的簡単に書けてしまう。


小室逮捕。

逮捕にびっくりしたが、keikoがkcoとか名前を変えてシングルデビューしてたり、今年になってglobe名義でGetWind出してたり、関連ニュースにも驚いた。
時代の寵児というか、しっかり俺も彼の掌で踊らされてたんだがなんだか、ブームが去って当事者の逮捕というニュースを見ると歳取ったな、と、思う。