【入門編】【レジストリバイナリデータ操作】StdRegProv クラスを用いた REG_BINARY(16進データ)の相互変換と設定改変 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

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の心臓部に触れられる、極めて強力な「魔法の杖」なのです。

さあ、次はあなたの業務にある手作業のレジストリ設定を、このコードで自動化してみてください。きっと、驚くほど簡単に片付いてしまうはずですよ。

もし分からないことがあれば、またいつでも聞きに来てくださいね。あなたの自動化の旅を、心から応援しています。

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