【入門編】【セキュリティポリシー自動診断】Secedit コマンドログの自動パースによるローカルグループポリシー(GPO)の不整合検出 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

VBScriptで挑むセキュリティ監査の自動化:Secedit解析によるポリシー不整合の撲滅

こんにちは。自動化の現場で泥臭い作業をスマートに変えることに命をかけている、皆さんの先輩エンジニアです。

今回は、VBScriptを使って「PCのセキュリティ設定を自動で診断する」という、実務で非常に価値のあるテーマを扱います。「VBScriptなんて古い」と言う人もいますが、OS標準のWSH(Windows Script Host)環境で動くこの言語は、「OSの深淵を直接叩ける」という点で、現代でも最強の武器になり得ます。

マクロの記録ボタンを押すだけの世界から、一歩踏み込んでみませんか?

1. なぜ「Secedit」と「VBScript」なのか

企業のセキュリティ担当者にとって、各PCが標準ポリシー通りに設定されているかを確認するのは悪夢のような作業です。`secedit`コマンドを使えば、現在のポリシーをテキストファイルとして書き出せますが、その数は数千行にも及びます。

これを手動でチェックするのは現実的ではありません。そこでVBScriptの出番です。「ファイルを読み込み、特定のキーを探し、期待値と照合する」。この泥臭いテキスト処理こそ、VBScriptの真骨頂です。

2. 実装のステップ:診断ツールの心臓部

今回作成するツールは、以下の3ステップで動きます。

1. エクスポート: `secedit /export` で設定を書き出す。
2. パース(解析): テキストファイルを1行ずつ読み込む。
3. 判定: 会社標準値と比較し、異なればアラートを出す。

実践コード:セキュリティ診断スクリプト

‘ SecurityAudit.vbs – 端末セキュリティ設定の自動診断
Option Explicit

Dim objFSO, objShell, objFile, strLine
Dim strExportPath, strStandardValue, strCurrentValue
Dim strTargetKey

strExportPath = “C:\temp\security_policy.inf”
strTargetKey = “PasswordComplexity” ‘ 例:パスワードの複雑性
strStandardValue = “1” ‘ 標準値:有効(1)

Set objShell = CreateObject(“WScript.Shell”)
Set objFSO = CreateObject(“Scripting.FileSystemObject”)

‘ 1. Seceditによるポリシーのエクスポート
objShell.Run “secedit /export /cfg ” & strExportPath, 0, True

‘ 2. ファイルの読み込みと解析
If objFSO.FileExists(strExportPath) Then
Set objFile = objFSO.OpenTextFile(strExportPath, 1)

Do Until objFile.AtEndOfStream
strLine = objFile.ReadLine

‘ 対象のキーが含まれる行を探索
If InStr(strLine, strTargetKey) > 0 Then
strCurrentValue = Trim(Split(strLine, “=”)(1))

‘ 3. 判定とレポート
If strCurrentValue <> strStandardValue Then
WScript.Echo “[警告] 設定の不整合を検出!”
WScript.Echo “項目: ” & strTargetKey
WScript.Echo “期待値: ” & strStandardValue & ” / 実測値: ” & strCurrentValue
Else
WScript.Echo “[OK] ” & strTargetKey & ” は正常です。”
End If
End If
Loop
objFile.Close
Else
WScript.Echo “エラー: 設定ファイルが見つかりません。”
End If

3. 初学者が陥りやすい「罠」と解決策

① `Option Explicit` を必ず書く

VBScriptでは変数の宣言なしにいきなり値を代入できてしまいますが、これはバグの温床です。必ず冒頭に `Option Explicit` を書き、強制的に変数を宣言させる習慣をつけてください。これが「できるエンジニア」の第一歩です。

② ファイルパスの空白問題

Windowsのパスには `C:\Program Files` のように空白が含まれることがあります。コマンドラインで実行する際は、必ずパスを `Chr(34)` (ダブルクォーテーション)で囲むのが鉄則です。

③ インタプリタの特性を理解する

VBScriptは上から順に実行されます。`Set` を使ったオブジェクト生成は、使い終わったら `Set obj = Nothing` で解放するのがマナーです。小規模なスクリプトなら自動解放されますが、大規模な自動化ではメモリリークの原因になります。

4. さあ、ここからがスタート地点です

今回紹介したスクリプトは、あくまで「診断の入り口」です。ここからさらに、以下の要素を追加すると、より実用的な「ツール」へと進化します。

  • ログの保存: `WScript.Echo` で画面に出すのではなく、`objFSO.CreateTextFile` で結果をCSV形式で保存する。
  • メール通知: `CDO.Message` オブジェクトを使って、不整合があった場合に管理者へメールを飛ばす。
  • リモート実行: ネットワーク上の共有フォルダからこのスクリプトをタスクスケジューラで配布し、全社一斉診断を行う。

VBScriptは、決して過去の遺物ではありません。OSの構造を理解し、システムを制御するための「最も身近な言語」です。このスクリプトを改造し、自分の手でPCを管理する楽しさをぜひ味わってください。

もし詰まったら、いつでも質問してくださいね。皆さんの挑戦を応援しています。

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