連載
» 2007年11月28日 00時00分 公開

基礎解説 演習方式で身につけるチェック式WSH超入門:第13回 WshShellオブジェクトを利用する(2) (2/3)

[牟田口大介(Microsoft MVP Windows Server - Admin Frameworks),著]

レジストリに値を書き込むRegWriteメソッド

 RegWriteメソッドを用いると、任意のキーや任意のキーに任意のエントリを書き込むことができる。ここでは、アプリケーション・ソフトが設定を保持するのに通常用いられる「HKEY_CURRENT_USER\Software」キー以下に、ダミーのサブキー「WSH Lesson」を作成し、そこにダミーのエントリ(名前:「FutaenoKiwami」、種類:「REG_SZ」、値:「Axtu-!」)を書き込んでみよう。また、文字列だけではなく数値も書き込めることを示すために、2つ目のダミーのエントリ(名前:「Miku Age」、種類:「REG_DWORD」、値:「16」)も書き込む。さらに、キーに値が持てることを示すのに、名前:「(既定)」に種類:「REG_DWORD」、値:「13」も書き込む。このサンプルを動作させる際は、レジストリ・エディタを立ち上げて該当キーを追いながら、どのように値が書き込まれていくかを追ってもらいたい。

※ファイル:WriteReg.vbs

Option Explicit

'オブジェクト変数の宣言とWshShellオブジェクトの作成。
Dim objWshShell
Set objWshShell = WScript.CreateObject("WScript.Shell")

'書き込むキー、エントリ名の宣言と代入。
Dim strRegKey
Dim lngRegKeyValue
Dim strRegEntry1,strRegEntry2
Dim strRegValue1,lngRegValue2

strRegKey = "HKEY_CURRENT_USER\Software\WSH Lesson\"
lngRegKeyValue = 13
strRegEntry1 = "FutaenoKiwami"
strRegValue1 = "Axtu-!"
strRegEntry2 = "Miku Age"
lngRegValue2 = 16

'文字列のエントリを書き込む。
objWshShell.RegWrite strRegKey & strRegEntry1, strRegValue1,"REG_SZ"

'数値のエントリを書き込む。
objWshShell.RegWrite strRegKey & strRegEntry2, lngRegValue2,"REG_DWORD"

'キーに数値を書き込む。
objWshShell.RegWrite strRegKey, lngRegKeyValue,"REG_DWORD"

Set objWshShell = Nothing

 このスクリプトを実行して、レジストリ・エディタを立ち上げると次のようなキーができているはずだ。

RegWriteメソッドでレジストリ・キーとエントリを書き込む
WSH Lessonキーの中に2つのエントリが書き込まれ、キー自体にも数値が書き込まれた。
  (1)新たに書き込んだキー。
  (2)キー自体に書き込まれた数値。
  (3)書き込まれた文字列のエントリ。
  (4)書き込まれた数値のエントリ

 RegWriteメソッドは、エントリを書き込む場合は第1引数に「キー\エントリの名前」を、第2引数にエントリの値を、第3引数にエントリの種類を文字列で指定する。第3引数は省略でき、省略すると「REG_SZ」(文字列)が指定されたことになる。

 なお、キーHKEY_CURRENT_USER\Software\WSH Lessonが存在しなくても、HKEY_CURRENT_USER\Software\WSH Lessonのエントリ(「FutaenoKiwami」と「Miku Age」)を第1引数に指定しRegWriteメソッドを実行することで自動的にキーも作成される。階層化されたキーを一度に作成することも可能だ。逆にキーだけを作成したい場合は、「キー\」を第1引数に指定し、第2引数に「""」(長さ0の文字列)を指定すればよい(厳密にはキーの値が「(値の設定なし)」のキー(値がないキー)はRegWriteメソッド単独では作れない。一度ダミーのエントリをRegWriteメソッドで作成し、その後そのエントリを次に述べるRegDeleteメソッドで削除することで可能である)。

※注:RegWriteメソッドではREG_BINARY値はLong型の最大値までしか書き込めない。それを超える値を書き込みたい場合はWMIを使う必要がある。SetBinaryValueメソッドの引数にArray関数で作ったバリアント配列を渡すことで可能となる。詳しくは、以下のページを参照していただきたい。
Hey, Scripting Guy!「バイナリ データをレジストリに書き込む方法はありますか」(マイクロソフトTechNet)


レジストリからキーやエントリを削除するRegDeleteメソッド

 レジストリからキーやエントリを削除するにはRegDeleteメソッドを用いる。先ほど作ったダミーのエントリとキーを削除する例をご覧にいれよう。

※ファイル:DeleteReg.vbs

Option Explicit

'オブジェクト変数の宣言とWshShellオブジェクトの作成。
Dim objWshShell
Set objWshShell = WScript.CreateObject("WScript.Shell")

'書き込むキー、エントリ名の宣言と代入。
Dim strRegKey
Dim lngRegKeyValue
Dim strRegEntry1,strRegEntry2
Dim strRegValue1,lngRegValue2

strRegKey = "HKEY_CURRENT_USER\Software\WSH Lesson\"
strRegEntry1 = "FutaenoKiwami"
strRegEntry2 = "Miku Age"

'エントリを削除する(この部分はなくてもOK)。
objWshShell.RegDelete strRegKey & strRegEntry1
objWshShell.RegDelete strRegKey & strRegEntry2

'キーを削除する
objWshShell.RegDelete strRegKey

Set objWshShell = Nothing

 このようにRegDeleteメソッドの引数に削除したいキーやエントリを渡すと、それらが削除される。キーを削除する際は後ろに「\」を付ける、エントリを削除する場合は付けないのがここでもポイントとなる。この例では最初にエントリを削除してからキーを削除しているが、エントリをすべて削除せずともキーだけを削除すればエントリごとすべて消える。

 少し応用例を示そう。先ほども書いた通り、「HKEY_CLASSES_ROOT\.<拡張子>」キーには、関連付けの情報が含まれている。ここにサブキー「ShellNew」を作成し、その中に「NullFile」という長さ0のREG_SZ(文字列)のエントリを作成すると、再ログオン後にエクスプローラの新規作成メニューから、そのファイルを作成することができるようになる。ここでは、vbsファイルを新規作成できるようにしてみよう。また、すでにその設定がされている場合は設定を解除するようにしよう。これを問題とする。なお、このスクリプトをWindows Vista上で実行する場合は管理者権限でコマンド・プロンプトを起動し([スタート]メニュー上の[コマンド プロンプト]を右クリックし、ポップアップ・メニューから[管理者として実行]を選択する)、そこからwscript.exe MakeVBSNullFileRegEntry.vbsと実行してもらいたい(HKEY_CLASSES_ROOTへの書き込みには管理者権限が必要なため)。

CHECK!

マーカーで隠れたところを選択してチェックしてみよう。


※ファイル:MakeVBSNullFileRegEntry.vbs

Option Explicit

'オブジェクト変数の宣言とWshShellオブジェクトの作成。
Dim objWshShell
Set objWshShell = WScript.CreateObject("WScript.Shell")

Dim strRegKey, strRegEntry, strRegValue

'参照するレジストリ・キーおよびレジストリ・エントリを指定。
strRegKey = "HKEY_CLASSES_ROOT\.vbs\ShellNew\"
strRegEntry = strRegKey & "NullFile"
'エントリに書き込む値を指定。
strRegValue = ""

On Error Resume Next
    'ためしにレジストリ・エントリを読み込んでみる。
    objWshShell.RegRead strRegEntry
    If Err.Number = -2147024894 Then
On Error Goto 0
        'もしエラーならエントリがないということなので書き込む。
        objWshShell.RegWrite strRegEntry, strRegValue, "REG_SZ"
        MsgBox "新規作成メニューにvbsファイルを登録しました。"
On Error Resume Next
    ElseIf Err.Number = 0 Then
On Error Goto 0
        'もしエラーでなければエントリがあるということなので削除する。
        objWshShell.RegDelete strRegKey
        MsgBox "新規作成メニューからvbsファイルを削除しました。"
    End If
    Err.Clear
Set objWshShell = Nothing

 このスクリプトを実行したのち再ログオンすると、新規作成メニューに[VBScript Script ファイル]が追加されているはずである。また、もう一度このスクリプトを実行すると設定が削除され、再ログオン後にはメニューに表示されなくなるはずである。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。