2017年1月19日木曜日

リモートデスクトップ接続中か否かの判定はリアルタイムではできない

リモートデスクトップ接続状態の判定について、環境変数の「ClientName」が定義されていれば接続中という情報があったので試してみたのですが、正しく判定できないケースがありました。




動作確認用ソース
<html>
<title>clientName</title>
<body>
<button id=btn>push</button>
</body>
<script>
AXO = function(name){return new ActiveXObject(name)}
shell = AXO('WScript.Shell')
fs = AXO('Scripting.FileSystemObject')
gsf2 = fs.GetSpecialFolder(2)
Read = function(p){var o=fs.OpenTextFile(p), s=o.AtEndOfStream?'':o.ReadAll(); o.Close(); return s}
Write = function(path,v){with(fs.CreateTextFile(path)){Write(v);return Close()} }
btn.onclick = function(){
var path=gsf2+'/'+(new Date()).getTime()+'.wsf'
Write(path, ['<job>','<'+'script>','('+function(){
WScript.Echo((new ActiveXObject('WScript.Shell')).ExpandEnvironmentStrings("%CLIENTNAME%"))
}+')()','</'+'script>','</job>'].join('\r\n'))
var ex = shell.exec('cscript "'+path+'"')
this.innerText = ex.StdOut.ReadAll()
fs.DeleteFile(path)
}
</script>
</html>
view raw clientName.wsf hosted with ❤ by GitHub


正しく判定できなかったのは以下のケース

【ケース1】
1.PC_AからPC_Bにリモートデスクトップ接続する
2.接続先で上記prgを実行する
3.ボタンをクリックすると表示が「PC_A」になる ←ここまではOK
4.PC_Bに普通に(リモートデスクトップ接続ではない、そのPCに繋がっているマウスやキーボードを操作して)ログインする
5.2の手順で起動したままになっているprgのボタンを再度クリックする→ボタンの表示は「PC_A」のまま ← 本当は%CLIENTNAME%になるのが理想
6.PC_Bで上記prgをもう一つ起動してボタンをクリックする → %CLIENTNAME%と表示される ←これはOK


【ケース2】
1.PC_Bに普通に(リモートデスクトップ接続ではない、そのPCに繋がっているマウスやキーボードを操作して)ログインする
2.PC_Bで上記prgを実行する
3.ボタンをクリックすると表示が「%CLIENTNAME%」になる ←ここまではOK
4.PC_AからPC_Bにリモートデスクトップ接続する
5.2の手順で起動したままになっているprgのボタンを再度クリックする→ボタンの表示は「%CLIENTNAME%」のまま ← 本当はPC_Aになるのが理想
6.PC_Bで上記prgをもう一つ起動してボタンをクリックする → PC_Aと表示される ←これはOK


環境変数はプログラム起動時の値がプログラムごとに保持されているような感じです。
そして、その値は各プログラムから呼び出された別プログラムにも継承されている模様。。

リモートデスクトップ接続中かどうかで処理を切り替えたかったのですが、プログラム起動中の状態の変化は感知できないようです。。

0 件のコメント:

コメントを投稿