レジストリ データの取得
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 です。サブキーは Microsoft と DirectX で、名前付き値のエントリは 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
Note
VBScript は非推奨となっています。 詳細については、ブログ記事 「VBScript の非推奨:タイムラインと次の手順」を参照してください。
# The signature for EnumKey method of StdRegProv class:
#
# uint32 EnumKey(
# [in] uint32 hDefKey = HKEY_LOCAL_MACHINE,
# [in] string sSubKeyName,
# [out] string sNames[]
# );
$arguments = @{
hDefKey = [uint32]2147483650 # HKEY_LOCAL_MACHINE
sSubKeyName = 'SOFTWARE\Microsoft'
}
$subkeys = Invoke-CimMethod -ClassName StdRegProv -MethodName EnumKey -Arguments $arguments
subkeys.sNames
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\
複数文字列値の項目はコレクションまたは配列として扱われることに注意してください。
const HKEY_LOCAL_MACHINE = &H80000002
strComputer = "."
Set objReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
strKeyPath = "SYSTEM\CurrentControlSet\Services\Eventlog\System"
objReg.EnumKey HKEY_LOCAL_MACHINE, strKeyPath, arrSubKeys
For Each subkey In arrSubKeys
Wscript.Echo subkey
Next
Note
VBScript は非推奨となっています。 詳細については、ブログ記事 「VBScript の非推奨:タイムラインと次の手順」を参照してください。
# The signature for EnumKey method of StdRegProv class:
#
# uint32 EnumKey(
# [in] uint32 hDefKey = HKEY_LOCAL_MACHINE,
# [in] string sSubKeyName,
# [out] string sNames[]
# );
$arguments = @{
hDefKey = [uint32]2147483650 # HKEY_LOCAL_MACHINE
sSubKeyName = 'SYSTEM\CurrentControlSet\Services\Eventlog\System'
}
$subkeys = Invoke-CimMethod -ClassName StdRegProv -MethodName EnumKey -Arguments $arguments
subkeys.sNames
レジストリ プロバイダーは LocalSystem ではなく LocalService でホストされます。 そのため、サブツリー HKEY_CURRENT_USER からリモートで情報を取得することはできません。 ただし、ローカル コンピューターで実行されるスクリプトは引き続きHKEY_CURRENT_USERにアクセスできます。 リモート コンピューターでホスティング モデルを LocalSystem に設定できますが、リモート コンピューター上のレジストリは敵対的なアクセスに対して脆弱であるため、セキュリティ上のリスクがあります。 詳細については、「プロバイダーのホスティングとセキュリティ」を参照してください。
関連トピック