在root\default命名空間中的StdRegProv類(標準註冊表提供程序)提供了下面16種方法,我們將陸續介紹這些方法的使用規則,並給出分別用WBscript和Powershell編寫的例子。
GetBinaryValue – 讀取BINARY 類型的鍵值數據
GetDWORDValue – 讀取DWORD 類型的鍵值數據
GetExpandedStringValue – 讀取 EXPANDED STRING 類型的鍵值數據
GetMultiStringValue - 讀取MULTI STRING 類型的鍵值數據。
GetStringValue - 讀取STRING 類型的鍵值數據
CreateKey - 創建子鍵
SetBinaryValue - 爲鍵值設置 BINARY 類型的鍵值數據。
SetDWORDValue - 爲鍵值設置DWORD類型鍵值數據
SetExpandedStringValue – 爲鍵值設置 EXPANDED STRING 類型鍵值數據
SetMultiStringValue - 爲鍵值設置MULTI STRING 類型鍵值數據
SetStringValue - 爲鍵值設置STRING類型鍵值數據
DeleteKey - 刪除子鍵
DeleteValue - 刪除鍵值
EnumKey - 列舉子鍵
EnumValues - 列舉鍵值
CheckAccess - 檢查當前帳戶權限
下面是在註冊表操作時用到有關帳戶權限、根鍵、鍵值類型等代碼。
帳戶權限類型:
名稱 數值 描述
KEY_QUERY_VALUE &H0001 ability to query registry value
KEY_SET_VALUE &H0002 ability to set registry value
KEY_CREATE_SUB_KEY &H0004 ability to create subkey
KEY_ENUMERATE_SUB_KEYS &H0008 ability to enumerate subke
KEY_NOTIFY &H0010 ability to audit changes to the key
KEY_CREATE_LINK &H0020 ability to create a symbolic link to the key (example of such a link is the one that exists
between HKEY_CLASSES_ROOT and HKEY_LOCAL_MACHINE\SOFTWARE\Classes)
DELETE &H00010000 ability to delete current key
READ_CONTROL &H00020000 ability to read permissions on the current key
WRITE_DAC &H00040000 ability to modify permissions on the current key
WRITE_OWNER &H00080000 ability to take ownership of the current key
根鍵的代碼:
名稱 數值
HKEY_CLASSES_ROOT 2147483648, &H80000000
HKEY_CURRENT_USER 2147483649, &H80000001
HKEY_LOCAL_MACHINE 2147483650, &H80000002
HKEY_USERS 2147483651, &H80000003
HKEY_CURRENT_CONFIG 2147483653, &H80000005
HKEY_DYN_DATA 2147483654, &H80000006
鍵值類型的代碼
名稱 數值 描述
REG_SZ 1 字符串值
REG_EXPAND_SZ 2 可擴充字符串值
REG_BINARY 3 二進制值
REG_DWORD 4 DWORD值
REG_MULTI_SZ 7 多字符串值
使用wbemtest工具查看\root\default:StdRegProv可以知道指定方法的輸入輸出參數。例如EnumKey方法有兩個輸入參數(hDefKey,sSubKeyName)和兩個輸出參數(ReturnValue,sNames[])。
(01) EnumKey
列舉指定路徑下的子鍵(SubKey)。
Uint32 EnumKey(
[in,optional] unit32 hDefKey = 2147483650, (&H80000002,默認)
[in] string sSubKeyName,
[out] string sNames[]
);
例1:列舉註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services下的子鍵名稱
Const HKEY_LOCAL_MACHINE = &H80000002
strComputer = "."
Set objReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\"&_
strComputer & "\root\default:StdRegProv")
strKeyPath = "SYSTEM\CurrentControlSet\Services"
' 輸出arrSubKeys 即是sNames[]
objReg.EnumKey HKEY_LOCAL_MACHINE, strKeyPath, arrSubKeys
WScript.Echo "Subkeys under " _
& "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services"
For Each subkey In arrSubKeys
WScript.Echo subkey
Next
例2:通過ExecMethod_()方法調用EnumKey。
Const HKEY_LOCAL_MACHINE = &H80000002
sComputer = "."
sMethod = "EnumKey"
hTree = HKEY_LOCAL_MACHINE
sKey = "SYSTEM\CurrentControlSet\Services"
Set oRegistry = GetObject("winmgmts:{impersonationLevel=impersonate}//" & _
sComputer & "/root/default:StdRegProv")
' 創建輸入參數
Set oMethod = oRegistry.Methods_(sMethod)
Set oInParam = oMethod.inParameters.SpawnInstance_()
oInParam.hDefKey = hTree
oInParam.sSubKeyName = sKey
' 執行EnumKey方法
Set oOutParam = oRegistry.ExecMethod_(sMethod, oInParam)
' 顯示執行EnumKey方法的執行狀態。一種是讀取執行的返回碼,另一種是讀取輸出參數。
WScript.Echo "The return code of ExecMethod EnumKey is: " & oOutParam.ReturnValue
WScript.Echo "The return code of ExecMethod EnumKey is: " & oOutParam.Properties_("ReturnValue")
' 另一個輸出參數是數組sNames[],顯示子鍵的名稱。
For i=0 To UBound(oOutParam.Properties_("sNames"))
WScript.Echo oOutParam.Properties_("sNames")(i)
Next
從例1和例2中可以知道,通過SWbemObject訪問CIM對象和類的屬性和方法,可以使用下面兩種方法之一訪問低層CIM對象的屬性和方法:
直接調用StdRegProv類的方法時(如例1),只需要使用它的原名稱執行方法或屬性來獲取數據,好象它就是一個SWbemObject屬性或方法。
使用SWbemServices.ExecMethod、SWbemObject.ExecMothod_、SWbemObject.ExecMothodAsync_ 間接調用StdRegProv類的方法時(如例2),需要通過Properties_集合來獲取數據。
例3:相應的Powershell程序。因爲是直接使用EnumKey方法,通過輸出參數獲取數據。在PS中EnumKey方法格式有所不同:
EnumKey(System.UInt32 hDefKey, System.string sSubKeyName)
$computer = "."
$namespace = "root\Default"
$HKLM = "&H80000002" # 也可以寫成 $HKLM = 2147483650
$strKeyPath = "SYSTEM\CurrentControlSet\Services"
$oreg = get-wmiobject -list -namespace $namespace -ComputerName $computer | where-object { $_.name -eq "StdRegProv" }
$arrSubKeys = $oreg.EnumKey($HKLM, $strKeyPath)
"Subkeys under " + "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services"
ForEach($subkey In $arrSubKeys)
{
"Return code is : " + $subkey.returnvalue
$subkey.sNames
}