获取注册表数据

可以使用 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

注意

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

注意

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

注册表提供程序托管在 LocalService 中,而不是 LocalSystem。 因此,无法从子树 HKEY_CURRENT_USER 远程获取信息。 但是,在本地计算机上运行的脚本仍 可访问HKEY_CURRENT_USER。 可以将托管模型设置为远程计算机上的 LocalSystem,但这是一个安全风险,因为远程计算机上的注册表容易受到恶意访问。 有关详细信息,请参阅提供程序托管和安全性

WMI 任务:注册表