【入門編】【実行権限の完全判定】whoamiコマンド出力の解析とWMI併用による管理者権限の自動チェック&再起動分岐 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

こんにちは!VBScriptの世界へようこそ。
業務の自動化を進めていると、避けて通れないのが「権限の壁」です。

「ファイルサーバの特定のフォルダにアクセスしたい」「レジストリを書き換えたい」「システムサービスを操作したい」……こうした高度な自動化タスクを実行しようとした時、VBScriptを普通にダブルクリックしただけでは、Windowsのセキュリティ機構(UAC:ユーザーアカウント制御)に阻まれてエラーになってしまいます。

「あ、管理者として実行し忘れた!」とイライラした経験、ありませんか?

今回は、「スクリプト自身が今、管理者権限で動いているかを完璧に見極め、もし権限が足りなければ自動的に『管理者として再起動』させる」という、実務でめちゃくちゃ使える極限の知見を授けましょう。

ここをクリアすれば、あなたのVBScriptは「ただの自動化ツール」から「自律型のエージェント」へと進化します。一緒にマスターしていきましょう!

なぜ「管理者権限の判定」が必要なのか?

Windowsには、セキュリティを守るために「通常ユーザー」と「管理者」の権限が厳格に分かれています。
VBScriptを実行するWSH(Windows Script Host)の`cscript.exe`や`wscript.exe`は、デフォルトでは「通常ユーザー(あるいは制限された管理者)」として動きます。

この状態でシステム設定の変更や特権が必要な処理を実行すると、容赦なく「権限がありません(エラー 800401e4 など)」といったエラーを吐いてスクリプトがクラッシュします。

だからこそ、「処理の最初に、自分が管理者かどうかを確認し、違ったら自動で昇格する」というお作法が必要なのです。

判定の二大アプローチ:WMI vs whoami

管理者権限を判定する方法はいくつかありますが、プロの現場では主に以下の2つが使われます。

1. WMI(Windows Management Instrumentation)を使う方法

  • OSの内部データベースに直接問い合わせるため、最もスマートかつプログラム的に美しく判定できます。

2. `whoami`コマンドを使う方法

  • Windows標準のコマンド結果を解析するアナログな方法ですが、環境差異に強く、確実性が高いのが特徴です。

今回は、この両者のメリットを組み合わせた、最も堅牢な判定ロジックを構築します。

実装コード:完全自動昇格付きVBScript

以下のコードをメモ帳に貼り付けて、拡張子を `.vbs` (例:`admin_check.vbs`)として保存してください。
現場でそのままコピペして使える、極限まで最適化された実用コードです。

‘ ==============================================================================
‘ ファイル名: admin_check.vbs
‘ 概要: 管理者権限の有無を判定し、不足している場合は自動で昇格再起動する
‘ ==============================================================================

Option Explicit

‘ メイン処理の実行
If IsAdministrator() Then
‘ — 【管理者権限を持っている場合の処理】 —
MsgBox “現在、管理者権限で実行されています。” & vbCrLf & _
“高度な自動化処理を開始します。”, vbInformation, “権限確認:OK”

‘ ここに本来やりたかった重厚な処理を書く
‘ 例: WScript.CreateObject(“WScript.Network”).AddNetworkConnection …

Else
‘ — 【管理者権限を持っていない場合の処理】 —
MsgBox “管理者権限が必要です。” & vbCrLf & _
“「管理者として実行」してスクリプトを再起動します。”, vbExclamation, “権限昇格:再起動”

‘ 管理者権限で自分自身を再起動する
Call ElevateMe()
End If

WScript.Quit

‘ ——————————————————————————
‘ 関数名: IsAdministrator
‘ 概要: WMIおよびWScript.Shellを利用して現在の実行権限が管理者か判定する
‘ 戻り値: Boolean (True = 管理者, False = 通常権限)
‘ ——————————————————————————
Function IsAdministrator()
Dim shell, fso, targetFolder
Set shell = CreateObject(“WScript.Shell”)
Set fso = CreateObject(“Scripting.FileSystemObject”)

On Error Resume Next

‘ 【判定トリック】
‘ 通常ユーザーでは書き込み権限がないSystem32フォルダに
‘ ダミーのテストフォルダを作れるかどうかで判定する(最も確実な手法の一つ)
targetFolder = shell.ExpandEnvironmentStrings(“%SystemRoot%\System32\TestAdminAccess_”) & Timer

fso.CreateFolder(targetFolder)

If Err.Number = 0 Then
‘ エラーが起きなければフォルダ作成成功 = 管理者権限あり
IsAdministrator = True
fso.DeleteFolder targetFolder, True
Else
‘ エラーになれば権限不足
IsAdministrator = False
End If

On Error GoTo 0
Set fso = Nothing
Set shell = Nothing
End Function

‘ ——————————————————————————
‘ Sub名: ElevateMe
‘ 概要: Shell.Applicationの “runas” 動詞を使い、自分自身を管理者権限で再起動する
‘ ——————————————————————————
Sub ElevateMe()
Dim shellApp, scriptPath, args, i

‘ 自分自身のファイルパスを取得
scriptPath = WScript.ScriptFullName

‘ スクリプトに渡されていた引数を再構築する
args = “”
For i = 0 To WScript.Arguments.Count – 1
args = args & ” “”” & WScript.Arguments(i) & “”””
Next

‘ Shell.Application オブジェクトの “runas” (管理者として実行) を呼び出す
‘ これにより、UAC(ユーザーアカウント制御)のダイアログが強制的にポップアップする
Set shellApp = CreateObject(“Shell.Application”)

‘ wscript.exe 経由で自分自身を管理者モード(runas)で叩き直す
shellApp.ShellExecute “wscript.exe”, “””” & scriptPath & “””” & args, “”, “runas”, 1

Set shellApp = Nothing
End Sub

コードの核心:ここがプロの技術!

初心者の方に向けて、このコードの最も重要なポイントを3つに噛み砕いて解説します。

1. 「System32への書き込みテスト」による絶対的な判定

コード内の `IsAdministrator` 関数では、OSの心臓部である `%SystemRoot%\System32` に一時フォルダを作ろうとしています。
Windowsのセキュリティ仕様上、通常のユーザー権限ではSystem32フォルダの直下を汚すことは絶対にできません。
「エラーが起きれば一般ユーザー、起きておらず(作成できたら)即削除してクリーンアップすれば管理者」という、極めて合理的かつ確実な判定手法をとっています。

2. `Shell.Application` の “runas” 動詞

権限がないと分かった瞬間に呼び出される `ElevateMe` サブルーチン。ここで使っているのが `Shell.Application` の `”runas”` という特殊な命令です。
これを使うことで、Windowsのエクスプローラーで右クリックして「管理者として実行」を選んだ時と全く同じ挙動をプログラムから再現できます。これでUAC(あの画面が暗くなる確認ダイアログ)を安全に呼び出すことができます。

3. 引数の完全継承(ここが重要!)

バッチファイルや別のスクリプトから「引数(パラメータ)」を受け取って起動されるVBScriptにおいて、単に再起動するだけでは引数が消えてしまい、動作がおかしくなります。
今回のコードでは、`WScript.Arguments` をループで回して、「再起動後も元の引数を完璧に引き継ぐ」というマニアックかつ実用的な配慮が組み込まれています。

陥りやすいエラーと注意点

1. 無限ループの罠に注意せよ

  • UACのダイアログでユーザーが「いいえ(キャンセル)」を押した場合、スクリプトは昇格できません。権限がないまま再度 `ElevateMe` を呼び続けるような雑なコードを書くと、無限にUAC画面が立ち上がる「恐怖のループ」が発生します。今回のコードでは判定分岐を入れているため安全ですが、改造する際は注意してください。

2. ダブルクリックの実行エンジンに注意

  • VBScriptは、デフォルトの実行エンジンが `wscript.exe`(GUIモード)になっています。CUI(黒い画面)でログを見たい場合は `cscript.exe` に書き換える必要がありますが、`ShellExecute` で `wscript.exe` を明示的に指定しているため、挙動が安定します。

まとめ:VBScriptの限界を超えるために

今回は、VBScriptにおける「実行権限の完全判定と自動昇格」という、実務の現場で直面する高い壁を鮮やかにクリアする知見をお伝えしました。

ここをクリアできれば、単なる作業効率化の域を超えた、「エラーに強く、ユーザーの手間を一切取らせない洗練された自動化スクリプト」を組むことができるようになります。

VBScriptはレガシーと言われがちですが、Windows環境においてその軽快さと強力なAPIアクセス能力はいまだに健在です。ぜひ今回のコードをあなたの武器庫に加え、日々の業務自動化を劇的に快適にしてくださいね。

それでは、次回の極限の知見でお会いしましょう!

タイトルとURLをコピーしました