VBScriptで暴く「ファイルの嘘」:FSOによるタイムスタンプ監査の極意
こんにちは。現場の最前線で自動化の泥臭い戦いを潜り抜けてきたエンジニアです。
皆さんは、ファイルサーバーの管理をしていて「このファイル、中身は昨日更新されたはずなのに、なぜか作成日時の方が新しいぞ?」と、違和感を覚えたことはありませんか?あるいは、同期ソフトのミスでファイルが壊れていないか不安になったことはないでしょうか。
今日は、Windows自動化の古豪であるVBScriptと、その心臓部であるFileSystemObject (FSO)を使い、ファイルの「タイムスタンプの整合性」を監視する、いわばデジタル監査官のようなスクリプトを一緒に作りましょう。
マクロの記録を卒業し、「OSの深淵」に触れる準備はいいですか?
—
1. なぜ「タイムスタンプ」を疑うのか?
Windowsのファイルには、主に以下の3つの時間情報が刻まれています。
- DateCreated: ファイルが生まれた瞬間。
- DateLastModified: 内容が最後に書き換えられた瞬間。
- DateLastAccessed: 最後に開かれた(アクセスされた)瞬間。
通常、理論上は「作成日時 ≦ 更新日時」であるはずです。もし「作成日時 > 更新日時」であれば、それは「ファイルがコピーや移動を経て、本来の履歴が隠蔽・改ざんされた」可能性を示唆します。これは、セキュリティ監査やバックアップの整合性チェックにおいて、非常に重要な「不整合のサイン」なのです。
—
2. 【実装】FSOによるタイムスタンプ監査スクリプト
それでは、実際にファイルをスキャンし、異常があれば警告を出すスクリプトを見てみましょう。
‘ — 監査スクリプト:AuditFileTimestamp.vbs —
Option Explicit
Dim fso, folder, file
Dim targetPath
‘ 監査したいフォルダのパスを指定
targetPath = “C:\AuditTarget”
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ フォルダが存在するかチェック
If Not fso.FolderExists(targetPath) Then
WScript.Echo “エラー: 指定されたフォルダが見つかりません。”
WScript.Quit
End If
Set folder = fso.GetFolder(targetPath)
WScript.Echo “— 監査開始: ” & targetPath & ” —”
‘ フォルダ内の全ファイルをループ
For Each file In folder.Files
‘ ここが極意:DateCreatedとDateLastModifiedを比較する
If file.DateCreated > file.DateLastModified Then
WScript.Echo “[警告] 不整合検知: ” & file.Name
WScript.Echo ” 作成日時: ” & file.DateCreated
WScript.Echo ” 更新日時: ” & file.DateLastModified
WScript.Echo ” ——————————–”
End If
Next
WScript.Echo “— 監査終了 —”
‘ オブジェクトの解放(メモリ管理の基本中の基本!)
Set file = Nothing
Set folder = Nothing
Set fso = Nothing
このコードの「賢いポイント」
1. Option Explicit: これを書かないエンジニアは信用してはいけません。変数の宣言を強制し、誤字による「動かない、なぜか動くがバグる」という悲劇を未然に防ぎます。
2. オブジェクトの解放: スクリプト終了時に `Set Nothing` を行うのは、メモリリークを防ぐための礼儀です。大規模なファイルシステムを扱う際、この一手間が安定性を左右します。
—
3. 初学者が陥りやすい「罠」
このスクリプトを運用する上で、いくつか注意すべき「沼」があります。
罠1:OSの仕様による「コピー」の影響
Windowsでファイルを単純コピーすると、新しいファイルとして扱われるため、「作成日時」が「コピーしたその瞬間」に書き換わります。 つまり、このスクリプトで検知されるのは「不正な改ざん」だけでなく「単なるバックアップ・移動」も含まれます。
- 解決策: 業務で使う際は「特定の期間より古いファイルだけ見る」など、条件を絞るロジックを追加しましょう。
罠2:権限の問題
`FileSystemObject` は実行ユーザーの権限で動作します。アクセス権のないシステムフォルダを触ろうとすると、スクリプトは容赦なく「Permission Denied(書き込み権限がありません)」というエラーを吐いて停止します。
- 解決策: `On Error Resume Next` を使い、エラーが発生しても飛ばして次のファイルを処理する「堅牢なループ」を意識してください。
—
4. 最後に:エンジニアとしての一歩先へ
今回学んだのは「ファイルの過去を読み解く」技術です。VBScriptは古い言語ですが、OSの深部を直接叩けるその軽量さは、現代の複雑な自動化ツールにも引けを取りません。
「マクロの記録」は便利ですが、それはあくまで「誰かが作ったルートをなぞる」行為です。こうしてFSOのようなオブジェクトを直接操作できるようになると、あなたは「OSそのものを意のままに操る」領域に一歩近づいたことになります。
今回のスクリプトをベースに、ログをテキストファイルに出力したり、異常があればメールで通知したりと、自分なりに改造してみてください。それが、真の自動化エンジニアへの最短ルートです。
ここをクリアしたあなたなら、もう大丈夫。自信を持って自動化の荒波へ漕ぎ出してください。応援しています!
