WMI 工作:登錄

登錄的 WMI 工作會建立及修改登錄機碼和值。 如需其他範例,請參閱 位於 的 TechNet ScriptCenter https://www.microsoft.com/technet

本主題所示的腳本範例只會從本機電腦取得資料。 如需如何使用腳本從遠端電腦取得資料的詳細資訊,請參閱 連線到遠端電腦上的 WMI

下列程式描述如何執行腳本。

執行指令碼

  1. 複製程式碼,並將它儲存在副檔名為 .vbs 的檔案中,例如 filename.vbs。 請確定文字編輯器不會將.txt副檔名新增至檔案。
  2. 開啟命令提示字元視窗,並流覽至您儲存檔案的目錄。
  3. 在命令提示字元中輸入 cscript filename.vbs
  4. 如果您無法存取事件記錄檔,請檢查您是否從提升許可權的命令提示字元執行。 某些事件記錄檔,例如安全性事件記錄檔,可能會受到使用者存取控制 (UAC) 保護。

注意

根據預設,cscript 會在命令提示字元視窗中顯示腳本的輸出。 因為 WMI 腳本可以產生大量的輸出,所以您可能會想要將輸出重新導向至檔案。 在命令提示字元中輸入 cscript filename.vbs > outfile.txt ,將 filename.vbs 腳本的輸出重新導向至 outfile.txt

下表列出可用來從本機電腦取得各種資料類型的腳本範例。

如何… WMI 類別或方法
...使用 WMI 讀取登錄機碼值嗎? 使用位於 root\default 命名空間中的 StdRegProv 類別。 您無法取得此類別的任何實例,因為 系統登錄提供者 只是方法和事件提供者。 不過,您可以透過 EnumKeyEnumValue等方法來取得登錄資料。 位於 root\cimv2 命名空間中的 Win32_Registry會取得整個登錄的相關資料,例如大小。
VB
const HKEY_CURRENT_USER = &H80000001
strComputer = "."
Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
strKeyPath = "Console"
strValueName = "HistoryBufferSize"
oReg.GetDWORDValue HKEY_CURRENT_USER,strKeyPath,strValueName,dwValue
WScript.Echo "Current History Buffer Size: " & dwValue
PowerShell
$HKEY_CURRENT_USER =2147483649
$computer ='.'
$reg = [WMIClass]"ROOT\DEFAULT:StdRegProv"
$Key = "Console"
$Value = "HistoryBufferSize"
$results = $reg.GetDWORDValue($HKEY_CURRENT_USER, $Key, $value)
"Current History Buffer Size: {0}" -f $results.uValue
...建立新的登錄機碼嗎?

使用位於 root\default 命名空間和CreateKey方法的StdRegProv類別。

VB
const HKEY_LOCAL_MACHINE = &H80000002 strComputer = 「.設定 objReg=GetObject ( 「winmgmts:{impersonationLevel=impersonate}!\」 & strComputer & 「\root\default:StdRegProv」) 

strKeyPath = "SOFTWARE\NewKey" objReg.CreateKey HKEY_LOCAL_MACHINE,strKeyPath WScript.Echo "Created registry key HKEY_LOCAL_MACHINE\SOFTWARE\NewKey"

PowerShell
$HKEY_Local_Machine =2147483650 
$computer ='.'
$reg = [WMIClass]"ROOT\DEFAULT:StdRegProv"
$Key     = "SOFTWARE\NewKey"
$results   = $reg.CreateKey($HKEY_LOCAL_MACHINE, $Key)
If ($results.Returnvalue -eq 0) {"Key created"} 
...在機碼下建立新的登錄值?

使用位於 root\default 命名空間和CreateKey方法的StdRegProv類別。 然後,根據值的登錄資料類型,使用其中一個 Set 方法,例如 SetDWORDValue。 如果 Set 方法不存在,則會建立值。 如需詳細資訊,請參閱 將登錄資料類型對應至 WMI 資料類型

VB
Const HKEY_LOCAL_MACHINE = &H80000002
strKeyPath = "SOFTWARE\NewKey"
strComputer = "."
Set objReg=GetObject( "winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
strValueName = "Example_Expanded_String_Value"
strValue = "%PATHEXT%"
objReg.SetExpandedStringValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue
WScript.Echo "Example expanded_String_Value at " & "HKEY_LOCAL_MACHINE\SOFTWARE\NewKey"
PowerShell
$HKEY_Local_Machine =2147483650 
$computer ='.'
$reg = [WMIClass]"ROOT\DEFAULT:StdRegProv"
$ValueName = "Example_Expanded_String_Value"
$Value     = "%PATHEXT%"
$Key       = "SOFTWARE\NewKey"
$results   = $reg.SetExpandedStringValue($HKEY_LOCAL_MACHINE, $Key, $ValueName, $Value)
If ($results.Returnvalue -eq 0) {"Value created"}
...避免在嘗試撰寫腳本以讀取登錄時收到不正確類別錯誤?

存取 StdRegProv 類別時,請使用 root\default 命名空間。 StdRegProv 不是 cimv2 命名空間的一部分,因此如果您嘗試連線到 「root\cimv2:StdRegProv」,就會產生「無效類別」錯誤。

VB
Const HKEY_CURRENT_USER = &H80000001
strComputer = "."
Set oReg=GetObject( "winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv") 
strKeyPath = "Console"
strValueName = "HistoryBufferSize"
oReg.GetDWORDValue HKEY_CURRENT_USER, strKeyPath, strValueName, dwValue
Wscript.Echo "Current History Buffer Size: " & dwValue
...檢查特定登錄機碼的安全性嗎?

使用位於 root\default 命名空間和CheckAccess方法的StdRegProv類別。 您只能檢查執行腳本或應用程式之目前使用者的存取權限。 您無法檢查另一個指定使用者的存取權限。

...讀取和寫入二進位登錄值?

使用位於 「Root\Default」 命名空間和GetBinaryValueSetBinaryValue方法的StdRegProv類別。 以一系列位元組十六進位值形式出現在 RegEdt32 公用程式中的登錄值,以 REG_BINARY 資料格式顯示。 如需詳細資訊,請參閱 將登錄資料類型對應至 WMI 資料類型。 下列 VBScript 程式碼範例會建立具有二進位值的新索引鍵。 二進位值是在 Hex 中指定的 iValues 位元組陣列中提供。

VB
const HKEY_LOCAL_MACHINE = &H80000002 strKeyPath = 「SOFTWARE\NewKey」 strComputer = 「.」 iValues = Array (&H01,&Ha2,&H10) Set oReg=GetObject ( 「winmgmts:{impersonationLevel=impersonate}!\\」 & strComputer & 「\root\default:StdRegProv」) oReg.CreateKey HKEY_LOCAL_MACHINE,strKeyPath strKeyPath = 「SOFTWARE\NewKey」 BinaryValueName = 「Example Binary Value」

oReg.SetBinaryValue HKEY_LOCAL_MACHINE,strKeyPath,BinaryValueName,iValues

下列腳本會讀取二進位值。

VB
const HKEY_LOCAL_MACHINE = &H80000002 
strKeyPath = "SOFTWARE\NewKey"
strValueName = "Example Binary Value"
strComputer = "."
dim iValues(3)
Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
oReg.GetBinaryValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,iValues
For i = lBound(iValues) to uBound(iValues)
Wscript.Echo iValues(i)
Next
PowerShell
$HKEY_Local_Machine =2147483650 
$computer ='.'
$reg = [WMIClass]"ROOT\DEFAULT:StdRegProv"
$ValueName = "Example Binary Value"
$Values     = @(0x54, 0x46, 0x4C)
$Key       = "SOFTWARE\NewKey"
$results   = $reg.GetBinaryValue($HKEY_LOCAL_MACHINE, $Key, $ValueName)
Foreach ($byte in $results.uvalue) {"{0}" -f $byte.tostring("x")}
...讀取和寫入包含多個字串的登錄值?

使用 StdRegProv 類別,位於 root\default 命名空間和 GetMultiStringValueSetMultiStringValue 方法中。 以空格分隔的一系列字串,出現在 RegEdt32 公用程式中的登錄機碼會以 資料格式REG_MULTI_SZ 。 如需詳細資訊,請參閱 將登錄資料類型對應至 WMI 資料類型。 下列 VBScript 程式碼範例會建立新的索引鍵和新的多字串值。

VB
const HKEY_LOCAL_MACHINE = &H80000002
strKeyPath = "SOFTWARE\NewKey"
MultValueName = "Example Multistring Value"
strComputer = "."
iValues = Array("string1", "string2")
Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
oReg.CreateKey HKEY_LOCAL_MACHINE,strKeyPath
oReg.SetMultiStringValue HKEY_LOCAL_MACHINE,strKeyPath,MultValueName,iValues
PowerShell
$HKEY_Local_Machine =2147483650 
$computer ='.'
$reg = [WMIClass]"ROOT\DEFAULT:StdRegProv"
$Key       = "SOFTWARE\NewKey"
$ValueName = "Example MultiString Value"
$Values     = @("Thomas", "Susan", "Rebecca")
$Key       = "SOFTWARE\NewKey"
$results   = $reg.SetMultiStringValue($HKEY_LOCAL_MACHINE, $Key, $ValueName, $Values)
If ($results.Returnvalue -eq 0) {"Value Set"} 

下列腳本會讀取多重字串值。

VB
const HKEY_LOCAL_MACHINE = &H80000002
strKeyPath = "SOFTWARE\NewKey"
strComputer = "."
iValues = Array("string1", "string2")
Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
MultValueName = "Example Multistring Value"
oReg.GetMultiStringValue HKEY_LOCAL_MACHINE,strKeyPath,MultValueName,iValues
For Each strValue In iValues
WScript.echo strValue
Next
PowerShell
# Define Constants
$HKEY_Local_Machine =2147483650 
$computer ='.'
$reg = [WMIClass]"ROOT\DEFAULT:StdRegProv"
$Key       = "SOFTWARE\NewKey"
$ValueName = "Example MultiString Value"
$results   = $reg.GetMultiStringValue($HKEY_LOCAL_MACHINE, $Key, $ValueName)
$results.svalue
...移除登錄機碼嗎?

使用位於 root\default 命名空間和DeleteKey方法的StdRegProv類別。

PowerShell
$HKEY_Local_Machine =2147483650 
$computer ='.'
$reg = [WMIClass]"ROOT\DEFAULT:StdRegProv"
$Key     = "SOFTWARE\NewKey"
$results   = $reg.DeleteKey($HKEY_LOCAL_MACHINE, $Key)
If ($results.Returnvalue -eq 0) {"Key Removed"} 

腳本和應用程式的 WMI 工作

WMI C++ 應用程式範例

TechNet ScriptCenter

修改系統登錄

StdRegProv