更改注册表数据
适用于 WMI 的系统注册表提供程序类 StdRegProv 具有执行以下操作的方法:
创建或删除注册表项。
创建或删除命名值,这些值在注册表项下时称为条目。
使用新值的名称和 SetBinaryValue、SetDWORDValue、SetExpandedStringValue、SetMultiStringValue 或 SetStringValue 创建命名值。 使用 DeleteValue 删除命名值。
更改命名值。
使用值的名称和 Set 方法(详见上一个带项目符号的要点)来更改注册表项下现有的命名值。 必须知道值的名称才能更改它。 如果不知道注册表项下的值名称,请使用 EnumValues 方法获取名称。
本主题讨论以下部分:
使用 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。