こんにちは。自動化の現場で血の滲むようなデバッグを乗り越えてきた皆さん、ようこそ。
今日は、VBScriptを単なる「古い言語」から「現場を支えるインテリジェントなツール」へと昇華させるための、RDP(リモートデスクトップ)セッション判定という極めて実用的なトピックをお話しします。
マクロの記録から一歩踏み出し、環境に応じた「空気の読めるスクリプト」を書けるようになれば、あなたの自動化ライフは劇的に安定します。さあ、一緒に深掘りしていきましょう。
—
なぜ「RDP環境」の判定が必要なのか?
皆さんが書いたVBScriptが、突然「GUIダイアログが表示されず、バックグラウンドで処理がスタックしてしまった」という経験はありませんか?
それは、RDPセッションとローカルコンソール(直接操作している画面)の決定的な違いによるものです。
- ローカル: ユーザーの目視が前提。GUI(`MsgBox`等)が正しく表示される。
- RDP: セッションが切断されると、GUIを保持するリソースが開放され、`MsgBox`を呼び出すとスクリプトが永久凍結する(ハングアップする)危険がある。
この「環境の境界線」を識別し、「GUIを出すべきか、ログ出力に徹するべきか」を自動で判断させる。これがプロの自動化エンジニアの嗜みです。
—
判定の極意:WMIという「OSの心臓部」を叩く
VBScriptで環境を識別するには、WMI(Windows Management Instrumentation)を利用します。これはWindowsの管理情報を司る強力なインターフェースです。
今回は、`Win32_ComputerSystem`というクラスから、現在のユーザーの操作状態を覗き見ます。
実践:RDP判定スクリプト
以下のコードは、まさに現場の第一線で使われている「環境切り替え」のテンプレートです。
‘ — RDPセッション判定・自動制御用スクリプト —
Option Explicit
Dim isRDP
isRDP = CheckIfRDP()
If isRDP Then
‘ RDP環境時はGUIを出さず、ログファイルへ書き込む等のサイレント処理へ
WScript.Echo “RDP環境を検知:GUIを抑制し、ログ出力モードに移行します。”
‘ Call LoggingRoutine(“処理開始”)
Else
‘ ローカル環境時はGUIでユーザーに通知
MsgBox “ローカル環境で実行中。GUIの表示が可能です。”, 64, “環境判定システム”
End If
‘ ———————————————————
‘ 判定関数:WMI経由でセッション状態を確認
‘ ———————————————————
Function CheckIfRDP()
Dim objWMIService, colItems, objItem
‘ WMI接続の準備
Set objWMIService = GetObject(“winmgmts:\\.\root\cimv2”)
Set colItems = objWMIService.ExecQuery(“Select from Win32_ComputerSystem”)
‘ 判定ロジック:NameプロパティやUserNameの特性を確認
‘ 実は、もっとも手軽なのは環境変数を使う方法だが、
‘ WMIはより詳細なハードウェア構成や仮想環境の判定にも応用が効く
For Each objItem in colItems
‘ コンピュータ名やセッション情報を取得
‘ ※ここでは単純化のため、特定の環境変数 “SESSIONNAME” を併用するのが定石
If InStr(UCase(CreateObject(“WScript.Shell”).Environment(“PROCESS”)(“SESSIONNAME”)), “RDP”) > 0 Then
CheckIfRDP = True
Else
CheckIfRDP = False
End If
Next
End Function
—
陥りやすいエラーと回避の知恵
初心者がこのコードで躓くポイントを、先輩として先回りして伝授します。
1. 「WScript.Shell」の乱用:
`CreateObject(“WScript.Shell”)`は非常に強力ですが、ループの中で何度も呼び出すとメモリリークの原因になります。必ず変数に格納し、使い回してください。
2. `WScript.Echo`の罠:
`WScript.exe`で実行している場合、`Echo`はダイアログボックスになりますが、`Cscript.exe`で実行するとコマンドプロンプトに文字が出ます。自動化の際は`Cscript //nologo`を使って実行環境を統一するのが鉄則です。
3. 権限の問題:
WMIへのアクセスは管理者権限を要求される場合があります。スクリプトが動作しないときは、実行ユーザーの権限を確認しましょう。
—
ここをクリアすれば、あなたはもう「自動化のプロ」です
いかがでしたか?
単に「動くコード」を書くのではなく、「どこで動いても破綻しないコード」を書く。これこそが、VBScriptを使いこなす醍醐味です。RDP判定を組み込むだけで、あなたのスクリプトの信頼性は格段に向上します。
「自動化しているはずなのに、結局エラーの監視で人間が張り付いている」なんていう本末転倒な状況から、これで卒業です。
もし分からないことがあれば、いつでもまた聞きに来てください。あなたのコードが、現場の過酷な環境でもスマートに生き抜けることを願っています。頑張ってくださいね!
