【入門編】【特権グループ自動監査】WinNTプロバイダを用いた Administrators グループメンバーの動的調査と変更検知 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

VBScriptで掴む「特権の深淵」:Administratorsグループを自動監視する極限の知見

こんにちは。自動化の現場で血と汗を流してきたエンジニア諸君。
今日は、枯れた技術と思われがちな「VBScript」を使って、Windowsセキュリティの要である「Administratorsグループ」を監視する、実戦的なコードを紐解いていく。

「なぜ今さらVBScriptなのか?」と思うかもしれない。だが、VBScriptはWindows環境に標準搭載されており、インストール不要で即座に動く。この「環境依存の少なさ」こそが、有事の際の監査ツールとして最強の武器になるんだ。

今回は、ただ動くだけのコードではなく、メモリ管理とオブジェクトのライフサイクルを意識した「現場品質」のコードを伝授しよう。

1. なぜ「WinNTプロバイダ」なのか?

Windowsのユーザー管理において、私たちが頼るべきは ADSI (Active Directory Service Interfaces) だ。その中でも、ローカルマシンの管理には `WinNT://` というプロバイダ(接続窓口)を使う。

これを理解するには、OSを一つの巨大な「巨大なツリー構造のデータベース」とイメージしてほしい。

  • `WinNT://.` (ドットは自分自身を指す)
  • そこから `Administrators` という「グループ」へアクセスする。
  • その中にある「メンバー」を列挙する。

たったこれだけで、OSの特権階級のリストが手に入る。シンプルだろう?

2. 特権グループ監査コード(実戦版)

まずは、このコードを見てほしい。エラーハンドリングとオブジェクト解放(メモリのクリーンアップ)を徹底した構成だ。

‘ — 特権グループ監査ツール (AuditAdmin.vbs) —
Option Explicit

Dim strComputer, objGroup, objMember
Dim strOutput

strComputer = “.”
strOutput = “— Administrators Group Audit —” & vbCrLf

‘ 1. WinNTプロバイダでグループオブジェクトを取得
‘ ここで接続に失敗すると即座にエラーになるため、On Errorを使います
On Error Resume Next
Set objGroup = GetObject(“WinNT://” & strComputer & “/Administrators,group”)

If Err.Number <> 0 Then
WScript.Echo “致命的エラー: グループへのアクセスに失敗しました。” & Err.Description
WScript.Quit
End If
On Error GoTo 0

‘ 2. メンバーの列挙
For Each objMember In objGroup.Members
‘ objMember.Name でユーザー名を取得
strOutput = strOutput & “Member: ” & objMember.Name & vbCrLf
Next

‘ 3. レポート出力(今回はコンソールへ)
WScript.Echo strOutput

‘ 4. オブジェクトの解放 (重要: ここを怠るとメモリリークの温床になる)
Set objMember = Nothing
Set objGroup = Nothing

3. コードの「魂」を解説する

① `Option Explicit` を必ず書く

これを書かないと、変数の宣言ミスをVBScriptは「勝手に新しい変数を作った」と解釈してしまう。これは大規模なスクリプトでは致命的なバグの温床だ。プロの現場では必須の作法だよ。

② `On Error Resume Next` の正しい使い方

外部リソース(ネットワークやOSの権限)に触れるとき、予期せぬエラーはつきものだ。この記述は「エラーが出ても止まらず、次の行へ進む」という意味。その直後に `Err` オブジェクトをチェックすることで、安全なエラーハンドリングができる。

③ オブジェクトの解放 (`Set … = Nothing`)

VBScriptはガベージコレクションが強力ではない。特にWSHのような環境では、大きなオブジェクトをメモリに残したままにすると、リソース枯渇の原因になる。使い終わったら必ず `Nothing` を代入して、メモリをOSに返してやる。これが「できるエンジニア」の流儀だ。

4. 陥りやすい罠:ここをクリアすれば君も一人前

初心者がよくつまずくポイントを2つ紹介する。

  • 権限不足: このスクリプトは、実行権限のないユーザーが叩いても「アクセス拒否」になる。管理者として実行(管理者としてコマンドプロンプトを開く)することを忘れないように。
  • 名前解決のタイムラグ: `WinNT` プロバイダは、ネットワーク越しにドメインユーザーを解決しようとすると、少し時間がかかることがある。もし遅いと感じたら、それはスクリプトのせいではなく、ネットワークやドメインコントローラーの応答待ちだと理解しよう。

5. 次のステップ:自動化の先へ

今回学んだのは「メンバーの一覧を取得する」ことだが、これを応用すれば、以下のようなツールに進化させることができる。

1. ホワイトリスト比較: 許可されたユーザーリスト(テキストファイル)と現在の一覧を比較し、差分があればアラートをメール送信する。
2. 定期実行: Windowsタスクスケジューラに登録し、毎朝8時に実行する。

VBScriptは古い言語かもしれないが、「OSの深層に直接触れられる」という点では、現代の高級言語にも引けを取らないパワーを持っている。

まずは今日のコードを動かしてみて、自分のPCにどんな権限を持つユーザーが潜んでいるか、その目で確かめてみてほしい。セキュリティの第一歩は、まず「現状を知る」ことから始まるのだから。

何か不明点があれば、またいつでも聞きに来てくれ。君の自動化ライフを応援しているよ。

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