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を管理する楽しさをぜひ味わってください。
もし詰まったら、いつでも質問してくださいね。皆さんの挑戦を応援しています。
