更改注册表数据

适用于 WMI 的系统注册表提供程序StdRegProv 具有执行以下操作的方法:

本主题讨论以下部分:

使用 VBScript 创建注册表项

注册表是操作系统、应用程序和服务的中央配置数据库,因此在将更改写入注册表值或删除注册表项时要谨慎。

注意

无法监视 HKEY_CURRENT_USER (HKCU) 的 HKEY_CLASSES_ROOT 子项。 子项会在加载配置单元时显示再消失,因此不建议监视 HKEY_USERS。

 

以下代码示例演示如何创建新注册表项和子项。

HKEY_LOCAL_MACHINE = &H80000002
strComputer = "."

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

strPath = "SOFTWARE\MyKey\MySubKey"

Return = objRegistry.CreateKey(HKEY_LOCAL_MACHINE, strPath)

If Return <> 0 Then
    WScript.Echo "The operation failed." & Err.Number
    WScript.Quit
Else
    wScript.Echo "New registry key created" & VBCRLF & "HKLM\SOFTWARE\MYKey\"

End If

$HKEY_LOCAL_MACHINE = 2147483650 
$strComputer = "."
$strPath = "SOFTWARE\MyKey\MySubKey"

$reg = [wmiclass]"\\$strComputer\root\default:StdRegprov"

[void]$reg.CreateKey($HKEY_LOCAL_MACHINE, $strPath)

使用 PowerShell 和 VBScript 创建已命名注册表值

以下代码示例显示如何在前面脚本创建的 HKEY_LOCAL_MACHINE\SOFTWARE\MyKey\MySubKey 注册表项下创建名为 MultiStringValue 的已命名值。 该脚本调用 StdRegProv.SetMultiStringValue 来将字符串值写入新的命名值。

const HKEY_LOCAL_MACHINE = &H80000002 
strComputer = "."

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

strKeyPath = "SOFTWARE\MyKey\MySubKey"
strValueName = "MultiStringValue"
arrStringValues = Array("one", "two","three", "four")

objRegistry.SetMultiStringValue HKEY_LOCAL_MACHINE, strKeyPath,_
    strValueName, arrStringValues

' Read the values that were just written
objRegistry.GetMultiStringValue HKEY_LOCAL_MACHINE, strKeyPath,_
    strValueName, arrStringValues   

For Each strValue in arrStringValues
    WScript.Echo strValue 
Next

$HKEY_LOCAL_MACHINE = 2147483650 
$strComputer = "."
$strPath = "SOFTWARE\MyKey\MySubKey"

$strValueName = "MultiStringValue"
$arrStringValues = @("one", "two","three", "four")

$reg = [wmiclass]"\\$strComputer\root\default:StdRegprov"

[void]$reg.SetMultiStringValue($HKEY_LOCAL_MACHINE, $strKeyPath, $strValueName, $arrStringValues)

$multiValues = $reg.GetMultiStringValue($HKEY_LOCAL_MACHINE, $strKeyPath, $strValueName)
$multiValues.sValue

如果使用 WMI,不能在注册表项上设置访问安全性。 不过,StdRegProv.CheckAccess 方法会将当前用户的安全设置与注册表项上的安全描述符进行比较,以确定用户是否具有特定权限,例如 KEY_SET_VALUE。