【極限の知見】VBScriptで「特定のPCでしか動かない」魔法をかける方法:Drive.SerialNumberの真髄
「マクロの記録はできるようになったけれど、もっと高度な、まるでプロが書いたようなプログラムを作りたい」
そう思った瞬間、あなたは「自動化の記録者」から「エンジニア」への第一歩を踏み出しました。素晴らしい志です。
今日、私があなたに伝授するのは、単なるコードの書き方ではありません。VBScriptという道具を使って、「スクリプトの実行権限をコントロールする」という、実務における「守り」の技術です。
具体的には、`FileSystemObject`(FSO)の`Drive.SerialNumber`プロパティを使い、「許可された特定のPCやストレージでしか動作しない、安全なスクリプト」を構築する方法を解説します。ここをクリアすれば、VBScriptの基本はバッチリですよ。
1. なぜ「シリアルナンバー」が必要なのか?
想像してみてください。あなたが苦労して作った、業務を劇的に効率化する神ツールがあるとします。それを部下や友人に渡したとき、もしそのツールが勝手にコピーされ、知らない誰かのPCで実行されてしまったら……?
データの誤操作や、意図しないシステムへの影響など、リスクは計り知れません。
そこで登場するのが、個体識別という考え方です。
Windowsのドライブ(CドライブやUSBメモリなど)には、そのボリューム(領域)ごとに固有の「シリアルナンバー」が割り当てられています。
- ボリュームラベル(名前):ユーザーがいつでも自由に変更できる(例:「DATA」を「MY_DISK」に変えるのは簡単)。
- シリアルナンバー:フォーマット(初期化)しない限り変わらない、ハードウェアに近い識別子。
この「シリアルナンバー」をスクリプトの「鍵」として使うことで、「特定のPC(特定のドライブ)でしか動かないスクリプト」という、一種のライセンス制限のような仕組みを実装できるのです。
2. 武器の準備:FileSystemObject (FSO) とは
VBScriptでファイルやフォルダ、ドライブを操作するための最強の武器が、`FileSystemObject`です。
これを使うには、まず「オブジェクト」という概念を理解する必要があります。オブジェクトとは、いわば「特定の機能を持った道具箱」です。FSOという道具箱を開けることで、私たちはWindowsのファイルシステムという広大な世界にアクセスできるようになります。
基本的な構造のイメージ
1. FSO (FileSystemObject):すべての操作の入り口(マスターキー)。
2. Drive (ドライブオブジェクト):FSOから取り出せる「特定のドライブ」という道具。
3. SerialNumber (プロパティ):そのドライブが持つ「固有の番号」。
3. 実践:特定ドライブでのみ動作する「ガード付きスクリプト」
それでは、実際に動くコードを見てみましょう。
ここでは、「特定のシリアルナンバーを持つCドライブで実行されたときのみ、処理を進める」というロジックを書いています。
' ============================================================
' スクリプト名: SecurityGate.vbs
' 概要: 特定のドライブシリアルナンバーを確認し、一致する場合のみ実行する
' ============================================================
Option Explicit ' 変数の宣言を強制する(プロの鉄則!)
' --- 設定エリア ---
' 許可するドライブのシリアルナンバーをここに記述します
' ※あらかじめ自分のPCの番号を調べておく必要があります
Const ALLOWED_SERIAL = "12345678"
Const TARGET_DRIVE = "C:"
' ------------------
Dim fso, drv, currentSerial
' 1. FileSystemObjectの生成(オブジェクトのライフサイクル開始)
Set fso = CreateObject("Scripting.FileSystemObject")
' 2. エラーハンドリング(重要!)
' ドライブが存在しない、あるいは読み取り不可の場合にスクリプトが落ちるのを防ぐ
On Error Resume Next
' 3. 対象のドライブオブジェクトを取得
Set drv = fso.GetDrive(TARGET_DRIVE)
' エラーチェック:ドライブが取得できなかった場合
If Err.Number <> 0 Then
MsgBox "エラー: ドライブ " & TARGET_DRIVE & " が見つからないか、アクセスできません。", vbCritical, "システムエラー"
Err.Clear
WScript.Quit ' スクリプトを終了
End If
' 4. シリアルナンバーの取得
currentSerial = drv.SerialNumber
' エラーチェック:シリアルナンバーが取得できなかった場合
If Err.Number <> 0 Then
MsgBox "エラー: ドライブのシリアルナンバーを取得できませんでした。", vbCritical, "システムエラー"
Err.Clear
WScript.Quit
End If
' エラーハンドリングを元に戻す
On Error GoTo 0
' 5. 判定ロジック:鍵(シリアル)が合っているか?
If CStr(currentSerial) = ALLOWED_SERIAL Then
' --- 【ここから実行許可された処理】 ---
MsgBox "認証成功!" & vbCrLf & _
"シリアルナンバー: " & currentSerial & vbCrLf & _
"業務プロセスを開始します。", vbInformation, "アクセス許可"
' ここに本来やりたい業務自動化コードを記述します
' --------------------------------------
Else
' --- 【認証失敗時の処理】 ---
MsgBox "警告: 未許可のデバイスです。" & vbCrLf & _
"実行中のシリアル: " & currentSerial & vbCrLf & _
"このスクリプトの使用は禁止されています。", vbExclamation, "アクセス拒否"
' --------------------------------------
WScript.Quit
End If
' 6. 後片付け(オブジェクトのライフサイクル終了)
' 使い終わった道具箱は明示的に片付けるのが、一流のエンジニアの作法です
Set drv = Nothing
Set fso = Nothing
4. プロが教える「陥りやすい罠」と回避術
このコードを動かす際、初心者が必ずと言っていいほど躓くポイントが3つあります。
① 自分のシリアルナンバーを知る方法
「許可する番号(`ALLOWED_SERIAL`)に何を書けばいいかわからない!」と思いますよね。
まずは、自分のPCの番号を調べるための「調査用スクリプト」を一度だけ実行しましょう。
' 調査用コード
Set fso = CreateObject("Scripting.FileSystemObject")
Set drv = fso.GetDrive("C:")
MsgBox "あなたのCドライブのシリアルは: " & drv.SerialNumber
これで表示された数字を、本番用のスクリプトにコピーしてください。
② `On Error Resume Next` の魔法と代償
コードの中に `On Error Resume Next` という記述があります。これは「エラーが起きても無視して次の行へ進め」という命令です。
一見便利ですが、「なぜエラーが起きたのか」を隠してしまう諸刃の剣でもあります。
必ず、エラーが起きた後に `Err.Number` をチェックして、適切に処理(`WScript.Quit` など)を行うようにしてください。これを怠ると、原因不明のバグに悩まされることになります。
③ オブジェクトの解放(Nothing)
VBScriptはメモリ管理を自動で行ってくれますが、大規模なシステムや、長時間動き続けるスクリプトの場合、`Set fso = Nothing` のように、使い終わったオブジェクトを明示的に解放する習慣をつけておきましょう。これが、システムのパフォーマンスを安定させる「エンジニアの美学」です。
まとめ:制御できる者こそが、自動化を支配する
いかがでしたか?
単に「ファイルをコピーする」「Excelを開く」といった動作の裏側に、「誰に、どこで、実行させるか」という制御ロジックを組み込む。これこそが、ツールを「ただのプログラム」から「信頼できる業務システム」へと昇華させるプロセスです。
`Drive.SerialNumber` を使いこなせるようになれば、あなたはもう、マクロの記録に頼るだけの初心者ではありません。
「ここをクリアすれば、VBScriptの基本はバッチリですよ」
さあ、次はどのような自動化に挑戦しますか? 応援していますよ!
