レジストリ データの取得

WMI StdRegProv クラスとそのメソッドを使用して、レジストリ データを取得または変更できます。 Regedit ユーティリティを使用してローカル コンピューターのレジストリ値を表示および変更する場合、StdRegProv を使うと、ローカル コンピューターとリモート コンピューターでこのようなアクティビティを自動化するためにスクリプトまたはアプリケーションを使用できます。

StdRegProv には、次を行うためのメソッドが含まれています。

  • ユーザーのアクセス許可を確認する
  • レジストリ キーを作成、列挙、削除する
  • サブキーまたは名前付き値を作成、列挙、削除する
  • データ値の読み取り、書き込み、削除を行う

レジストリ データは、サブツリー、キー、および最上位のキーの下に入れ子になったサブキーによって編成されます。 実際のデータ値は、エントリまたは名前付き値と呼ばれます。

サブツリーには、次のものが含まれます。

  • HKEY_CLASSES_ROOT (省略形 HKCR)
  • HKEY_CURRENT_USER (HKCU)
  • HKEY_LOCAL_MACHINE (HKLM)
  • HKEY_USERS
  • HKEY_CURRENT_CONFIG

たとえば、レジストリ エントリ HKEY\SOFTWARE\Microsoft\DirectX\InstalledVersion の場合、HKEY サブツリーは SOFTWARE、サブキーは MicrosoftDirectX、名前付き値エントリは InstalledVersion です。

特定のキーに対する変更が発生したときに RegistryKeyChangeEvent が発生しますが、エントリは値がどのように変化するかを識別せず、指定したキーの下の変更によってこのイベントがトリガーされることもありません。 階層キー構造内の任意の場所での変更を識別するには、RegistryTreeChangeEvent を使用します。これは、発生した特定の値やキーの変更を返しません。 特定のエントリ値の変更を取得するには、RegistryValueChangeEvent を使用し、エントリを読み取ってベースライン値を取得します。

StdRegProv には、C++ またはスクリプトから呼び出すことができるメソッドのみが含まれています。これは、Win32 クラス構造とは異なります。

次のコード例は、StdRegProv.EnumKey メソッドを使用して、このレジストリ キーの下にあるすべての Microsoft ソフトウェア サブキーを一覧表示する方法を示しています。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft

const HKEY_LOCAL_MACHINE = &H80000002
strComputer = "."

Set objReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")

strKeyPath = "SOFTWARE\Microsoft"
objReg.EnumKey HKEY_LOCAL_MACHINE, strKeyPath, arrSubKeys

For Each subkey In arrSubKeys
Wscript.Echo subkey
    
Next

$HKEY_LOCAL_MACHINE = 2147483650
$strKeyPath = "SOFTWARE\Microsoft"

$objReg = [WMIClass]"root\default:StdRegProv"

$arrSubKeys = $objReg.EnumKey($HKEY_LOCAL_MACHINE, $strKeyPath)
foreach ($subKey in ($arrSubKeys.sNames))
{
    $subKey
}

StdRegProv には、さまざまなレジストリ エントリ値データ型を読み取るためのさまざまなメソッドがあります。 エントリに不明な値がある場合は、StdRegProv.EnumValues を呼び出して一覧表示できます。 次の表に、StdRegProv メソッドとデータ型の対応関係を示します。

メソッド データ型
GetBinaryValue REG_BINARY
GetDWORDValue REG_DWORD
GetExpandedStringValue REG_EXPAND_SZ
GetMultiStringValue REG_MULTI_SZ
GetStringValue REG_SZ

 

次の表に、新しいキーまたは値を作成したり、既存のものを変更したりするための対応するメソッドを示します。

メソッド データ型
SetBinaryValue REG_BINARY
SetDWORDValue REG_DWORD
SetExpandedStringValue REG_EXPAND_SZ
SetMultiStringValue REG_MULTI_SZ
SetStringValue REG_SZ

 

次の例では、レジストリ キーからシステム イベント ログのソースの一覧を読み取る方法を示します。

HKEY_LOCAL_MACHINE\SYSTEM\Current Control Set\Services\Eventlog\System

multistring 値の項目はコレクションまたは配列として扱われることに注意してください。

const HKEY_LOCAL_MACHINE = &H80000002
strComputer = "."

Set objReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" _ 
    & strComputer & "\root\default:StdRegProv")

strKeyPath = "SOFTWARE\Microsoft"
objReg.EnumKey HKEY_LOCAL_MACHINE, strKeyPath, arrSubKeys

For Each subkey In arrSubKeys
Wscript.Echo subkey
    
Next

レジストリ プロバイダーは LocalSystem ではなく LocalService でホストされます。 そのため、サブツリー HKEY_CURRENT_USER からリモートで情報を取得することはできません。 ただし、ローカル コンピューター上で実行されるスクリプトは引き続き HKEY_CURRENT_USER にアクセスできます。 リモート コンピューターではホスティング モデルを LocalSystem に設定できますが、リモート コンピューター上のレジストリが敵対的なアクセスに対して脆弱であるため、セキュリティ上のリスクがあります。 詳細については、「プロバイダーのホスティングとセキュリティ」を参照してください。

TechNet ギャラリーのバイナリ レジストリ値の読み取りの VBScript コード例では、WMI を使用してバイナリ レジストリ値を読み取っています。

WMI タスク: レジストリ