StdRegProv類所屬方法的使用(之一)

在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
}

 

本文轉載自 http://bbs.winos.cn/thread-70624-1-1.html

發佈了11 篇原創文章 · 獲贊 2 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章