VBScriptでレジストリの「REG_BINARY」を完全掌握する:WMI StdRegProvの深淵
こんにちは。自動化の現場でVBScriptの枯れた、しかし強力なパワーに何度も救われてきたエンジニアです。
皆さんが日常的に触れるレジストリ。`REG_SZ`(文字列)や `REG_DWORD`(数値)は扱いやすいですが、ネットワークアダプタの設定や高度なシステムパラメータで立ちはだかるのが「REG_BINARY(バイナリデータ)」という壁です。
「バイナリを読み書きしたいのに、VBScriptでは文字化けする……」
「設定したはずなのに、レジストリエディタで見ると値が壊れている……」
そんな悩みを持つあなたへ。今回は、Windows標準のWMI `StdRegProv` クラスを使い、このバイナリデータを「バイト配列」として正確に制御する極意を伝授します。ここを理解すれば、あなたの自動化スキルは間違いなく一段上の領域へ到達します。
—
1. なぜ「REG_BINARY」の操作は難しいのか?
VBScriptは本来、文字列処理が得意な言語です。しかし、REG_BINARYは「0と1の塊(バイト列)」です。これをVBScriptで扱う際、最も重要なのが「Variant型」の中に「バイト配列(Array of Bytes)」を格納するという概念です。
多くの初学者が陥る罠は、バイナリを「文字列」として渡そうとすることです。これをWMIの `StdRegProv` に渡すと、型不一致エラー(Type Mismatch)で即座に沈没します。
—
2. 実践:REG_BINARYを読み書きするアルゴリズム
まずは、WMIの `StdRegProv` を呼び出し、値を操作する「型」のルールを体感しましょう。
読み込みの基本コード
‘ WMI経由でStdRegProvをインスタンス化
Set objReg = GetObject(“winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv”)
‘ 読み込むパスの設定
strKeyPath = “SYSTEM\CurrentControlSet\Services\Tcpip\Parameters”
strValueName = “DhcpNameServer” ‘ バイナリ形式の例
‘ 読み込みを実行
‘ 戻り値として bytes 変数にバイト配列が格納される
objReg.GetBinaryValue &H80000002, strKeyPath, strValueName, bytes
If IsNull(bytes) Then
WScript.Echo “値が存在しないか、読み込めません。”
Else
‘ バイナリの中身を16進数で表示する
For i = 0 To UBound(bytes)
WScript.Echo “Byte[” & i & “]: ” & Hex(bytes(i))
Next
End If
書き込みの基本コード
書き込み時、最も注意すべきは「Array(バイト1, バイト2, … )」で配列を生成することです。
‘ 0x01, 0x02, 0xFF という3バイトのバイナリを書き込む例
Dim binData
binData = Array(&H01, &H02, &HFF)
‘ HKEY_LOCAL_MACHINE = &H80000002
objReg.SetBinaryValue &H80000002, “SOFTWARE\MyConfig”, “MyBinaryValue”, binData
WScript.Echo “書き込み完了。”
—
3. ここで差がつく!現場のプロが教える「陥りやすいエラー」
① 「型が一致しません (Type Mismatch)」エラーの正体
`SetBinaryValue` に普通の文字列や単一の数値を渡すと、VBScriptは「これはバイト配列ではない」と判断し、エラーを吐きます。必ず `Array()` 関数を使って、複数のバイト要素を格納したオブジェクトを渡してください。
② 16進数変換の罠
レジストリで見ると `A1` と表示されていても、コード内では `&HA1` と記述する必要があります。また、`UBound(bytes)` を使って配列の終端を正しく取得しないと、メモリ外アクセスによる予期せぬ挙動を招きます。常に `If IsArray(bytes)` で中身を検証する癖をつけましょう。
③ 権限の壁
WMI経由の操作は、実行しているスクリプトに「管理者権限」が必要です。コマンドプロンプトやタスクスケジューラで実行する際は、必ず「管理者として実行」されていることを確認してください。
—
4. まとめ:VBScriptを使いこなすために
REG_BINARYを操作できるということは、「Windowsの内部設定の深層部を、自由自在にコマンド一つで操れる」ということに他なりません。
1. StdRegProv を呼び出す。
2. バイト配列(Array) を正しく定義する。
3. IsArray や UBound で安全に処理する。
この3ステップさえ守れば、もう怖いものはありません。VBScriptは古臭い言語ではありません。WindowsというOSの心臓部に触れられる、極めて強力な「魔法の杖」なのです。
さあ、次はあなたの業務にある手作業のレジストリ設定を、このコードで自動化してみてください。きっと、驚くほど簡単に片付いてしまうはずですよ。
もし分からないことがあれば、またいつでも聞きに来てくださいね。あなたの自動化の旅を、心から応援しています。
