【入門編】【シュレッダー削除】FSOでファイルを削除する前にダミーデータで上書きし復元を防止するセキュリティスクリプト – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

こんにちは!現場でバリバリ自動化を進めていると、「ファイルをサクッと消すだけじゃなくて、データ復元ソフトでも絶対に復元できないように完全に抹消したい」というシビアな要件にぶつかることがありますよね。

一般的なVBScriptの `DeleteFile` メソッドは、実はファイルシステム上の「ここ空いてますよ」という目印を消しているだけで、実際のデータ本体はHDDやSSDの片隅にそのまま残っています。これでは、専門的な復元ソフトを使えば簡単に中身を覗き見されてしまいます。

今回は、プログラミング初学者の方でも安心して実務で使えるように、「ファイルを消す前にゼロデータで上書きし、復元を完全にブロックする【シュレッダー削除】スクリプト」の作り方を、優しく徹底的に解説していきますね!ここをクリアすれば、ファイル操作の引き出しがグッと広がりますよ。

—

1. なぜ通常の `DeleteFile` では危険なのか?

VBScriptでファイル消去を行う際、最もよく使われるのがこのコードです。

Dim fso
Set fso = CreateObject(“Scripting.FileSystemObject”)
fso.DeleteFile “C:\data\secret.txt”
Set fso = Nothing

このコード、手軽で便利なのですが、冒頭でお話しした通り「本の目次ページだけを破り捨てる」ようなものです。本のページ(実際のデータ)は本棚の奥底に残ったままなので、技術がある人が見れば簡単に復元できてしまいます。

そこで、今回目指す【シュレッダー削除】のステップは以下の通りです。

1. 対象ファイルのサイズ(バイト数)を正確に取得する。
2. ファイルを「書き込みモード」で開き、ファイルサイズと同じ量の「ゼロ(`0`)」やダミーデータで完全に上書きする。
3. 上書きし終えてから、通常通り `DeleteFile` でファイルを消去する。

これなら、仮にデータを復元されたとしても、中身はすべて「0」の海になっているため、機密情報を完全に守ることができます。

—

2. 実装コード:完全抹消シュレッダー・スクリプト

それでは実際のコードを見てみましょう。
メモ帳を開いて、以下のコードを貼り付け、拡張子を `.vbs` (例: `shredder.vbs`)として保存してください。

‘ ==============================================================================
‘ スクリプト名: SecureFileShredder.vbs
‘ 概要: 指定されたファイルをダミーデータ(ゼロ)で上書きしてから完全に削除します。
‘ ==============================================================================

Option Explicit

‘ 削除対象のファイルパス(ご自身の環境に合わせて変更してください)
Dim targetFilePath
targetFilePath = “C:\TestFolder\secret_document.txt”

‘ 関数を呼び出してシュレッダー実行
Call SecureDeleteFile(targetFilePath)

‘ ——————————————————————————
‘ 関数名: SecureDeleteFile
‘ 引数: strPath (String) – 抹消したいファイルのフルパス
‘ ——————————————————————————
Sub SecureDeleteFile(strPath)
Dim fso, fileObj, fileSize, stream, i

Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ 1. ファイルが存在するかチェック
If Not fso.FileExists(strPath) Then
WScript.Echo “エラー: 指定されたファイルが見つかりません。” & vbCrLf & strPath
Exit Sub
End If

‘ 2. ファイルオブジェクトを取得し、サイズ(バイト数)を控える
Set fileObj = fso.GetFile(strPath)
fileSize = fileObj.Size

WScript.Echo “【処理開始】ファイルサイズ: ” & fileSize & ” バイト”

On Error Resume Next ‘万が一のエラー(ファイルが開かれている等)をハンドリング

‘ 3. ファイルをバイナリ/テキスト書き込みモードでオープンして上書き
‘ (ForWriting = 2, True = 存在しない場合は新規作成)
Set stream = fso.OpenTextFile(strPath, 2, True)

If Err.Number <> 0 Then
WScript.Echo “エラー: ファイルを開けませんでした。他のアプリで使用中の可能性があります。”
Exit Sub
End If

‘ 4. ファイルサイズ分だけ「0」を書き込んでデータを完全に粉砕する
‘ ※超巨大ファイルの場合はループ回数が膨大になるため、実務ではブロック単位の書き込みを推奨しますが、
‘ 今回は初学者向けに分かりやすく「ゼロを埋める」ロジックにしています。
Dim zeroBlock
‘ 1024バイト(1KB)分のゼロを作成
zeroBlock = String(1024, “0”)

Dim writtenBytes
writtenBytes = 0

Do While writtenBytes < fileSize If (fileSize - writtenBytes) >= 1024 Then
stream.Write zeroBlock
writtenBytes = writtenBytes + 1024
Else
‘ 最後の端数分を書き込む
stream.Write Left(zeroBlock, fileSize – writtenBytes)
writtenBytes = fileSize
End If
Loop

stream.Close
Set stream = Nothing

If Err.Number <> 0 Then
WScript.Echo “エラー: 上書き処理中に問題が発生しました: ” & Err.Description
Exit Sub
End If

‘ 5. 中身が空っぽ(ゼロ)になったファイル本体を削除
fileObj.Delete True

On Error GoTo 0 ‘ エラー監視を元に戻す

WScript.Echo “【完了】ファイルのシュレッダー削除(完全抹消)が成功しました。”

Set fileObj = Nothing
Set fso = Nothing
End Sub

—

3. コードの重要ポイントと「初学者が陥りやすい罠」

このスクリプトには、現場のプロが実践するテクニックがいくつか詰め込まれています。特に躓きやすいポイントを解説しますね。

① `OpenTextFile` の第2引数(IOMode)の魔法

コード内の `fso.OpenTextFile(strPath, 2, True)` という部分。

  • 第2引数の `2` は `ForWriting`(書き込み専用モード) を意味します。これを開いた瞬間に、ファイルの中身が一度クリア(リセット)されます。
  • 第3引数の `True` は、もしファイルがなかったら新規作成する設定ですが、今回は存在チェックを入れているので安全弁として機能します。

② なぜ「1KB(1024バイト)ごと」に書き込んでいるのか?

VBScriptで1バイトずつ書き込もうとすると、巨大なファイル(例えば数十MBのファイル)を処理するときにスクリプトがフリーズしたような状態になり、パフォーマンスが著しく低下します。
そのため、このコードでは1KB分のゼロの塊(`String(1024, “0”)`)をループで一気に書き込むことで、メモリと処理速度のバランスを取る「エンジニアの知恵」を取り入れています。

③ エラーハンドリング(`On Error Resume Next`)の作法

実務でファイル操作をする際、最も多いエラーが「そのファイルを他のアプリ(Excelやメモ帳など)が開いているため、アクセスが拒否された」というケースです。
`On Error Resume Next` を使うことで、スクリプトが突然強制終了(クラッシュ)するのを防ぎ、「ファイルが開けませんでした」と優しくユーザーにメッセージを返すことができます。処理が終わったら `On Error GoTo 0` で監視をリセットするのも忘れないようにしましょう。

—

4. まとめ

今回は、単なるファイル削除の一歩先を行く「FSOを用いたファイルの完全抹消(シュレッダー削除)」について解説しました。

  • 単なる `DeleteFile` は目次を消すだけなので復元リスクがある。
  • 消去の「前」に、同サイズ以上のダミーデータ(ゼロなど)でファイルを上書きするのがセキュアな鉄則。
  • FSOのストリーム操作とループ処理を組み合わせることで、安全かつ効率的な実装ができる。

ここをクリアできれば、単なるマクロの記録やネットのコピペ脱却レベルを大きく超えて、「セキュリティを考慮した堅牢な自動化スクリプトが書けるエンジニア」の仲間入りです!

日々の業務自動化に、ぜひこの知見を取り入れてみてくださいね。それでは、また次のテクニックでお会いしましょう!

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