2016-12-07 36 views
1

我使用路徑來查找包含可以更改的guid的信息片段。我有guid值硬編碼,但當它改變它不起作用。我需要動態地發現那個guid。我知道在guid的另一端有一個值,並有一個REG查詢來查找整個路徑,但我無法弄清楚如何捕獲該路徑。使用vbs搜索註冊表以查找路徑的未知部分

這裏的REG查詢:

REG Query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products /D /V /F "Microsoft Office Professional Plus 2010" /S /E 

它返回值「顯示名稱」和它的內容「Microsoft Office專業增強版」

當從一個批處理文件運行它也顯示了包括整個路徑難以捉摸的指導。我想從一個VB腳本做到這一點。

回答

1

此外,較新的Windows Scripting Host Shell對象也使登錄訪問變得容易。

Set wshshell = CreateObject("WScript.Shell") 

wshshell.RegDelete(strName) 

wshshell.RegRead(strName) 

wshshell.RegWrite(strName, anyValue [,strType]) 

https://msdn.microsoft.com/en-us/library/293bt9hh(v=vs.84).aspx

而且WMI可以訪問註冊表。與上述兩種方法不同,它可以枚舉,所以你可以在事先不知道的情況下看到有什麼。

Dim proglist() 
Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv") 
ret = oReg.EnumKey(&H80000002, "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", proglist) 
If err.num =0 then 
    For each prog in proglist 
     msgbox prog 
    Next 
Else 
    Msgbox err.num & " " & err.description & " " & err.source 
    err.clear 
End If 

https://msdn.microsoft.com/en-us/library/aa390387(v=vs.85).aspx

它還可以檢查安全和監控更改密鑰。

這將監視對Windows卸載密鑰的更改。

Set objWMIService = GetObject("winmgmts:root/default") 
Set objEvents = objWMIService.ExecNotificationQuery("SELECT * FROM RegistryTreeChangeEvent WHERE Hive='HKEY_LOCAL_MACHINE' AND RootPath='SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall'") 

Do 
    Set objReceivedEvent = objEvents.NextEvent 
    msgbox objReceivedEvent.GetObjectText_() 
Loop 

https://msdn.microsoft.com/en-us/library/aa393041(v=vs.85).aspx

遞歸用於行走的每個節點中的一棵樹。該函數每次遇到節點時都調用它自己。從下面的程序開始使用cscript來避免幾千msgbox - cscript //nologo c:\folder\RecurseReg.vbs

Set wshshell = CreateObject("WScript.Shell") 

EnumReg "SOFTWARE\CLASSES" 

Sub EnumReg(RegKey) 
    On Error Resume Next 
    wscript.echo "---------------------------------------" 
    wscript.echo "HKLM\" & RegKey & " = " & wshshell.RegRead("HKLM\" & RegKey & "\") 
    err.clear 
    Dim KeyList() 
    Dim ValueNameList() 
    Dim ValueList() 
    Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv") 
    If err.number <> 0 then 
     wscript.echo err.number 
     err.clear 
    End If 
    ret = oReg.EnumValues(&H80000002, RegKey, ValueNameList, ValueList) 
    If err.number = 0 then 
     For each valuename in ValueNameList 
     If valuename <> "" then 
      Value = wshshell.RegRead("HKLM\" & RegKey & "\" & valuename) 
      err.clear 
       wscript.echo valuename & " - " & Value 
     End If 
     Next 
    Else 
     Msgbox err.num & " " & err.description & " " & err.source 
     err.clear 
    End If 


    ret = oReg.EnumKey(&H80000002, RegKey, Keylist) 
    If err.number =0 then 
     For each key in keylist 
      EnumReg RegKey & "\" & key 
     Next 
    Else 
     Msgbox err.num & " " & err.description & " " & err.source 
     err.clear 
    End If 
End Sub 

把兩者一起(這樣做VC 2008運行時它應該是在所有計算機上)

Dim proglist() 
Set wshshell = CreateObject("WScript.Shell") 
On Error Resume Next 
Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv") 
ret = oReg.EnumKey(&H80000002, "SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products", proglist) 
If err.num =0 then 
    For each prog in proglist 
'  msgbox prog 
     If wshshell.RegRead("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\" & Prog & "\InstallProperties\DisplayName") = "Microsoft Visual C++ 2008 Redistributable - x64 9.0.30729.17" then 
      Msgbox "Found " & Prog 
     End If 
    Next 
Else 
    Msgbox err.num & " " & err.description & " " & err.source 
    err.clear 
End If 

對於V6或VBA

註冊表是一個簡單的VBA。這是非常有限的,並使用ini文件的概念。 那裏有幾個人,如(從對象瀏覽器[F2]在VBA編輯)

Function GetAllSettings(AppName As String, Section As String) 
Member of VBA.Interaction 

Sub SaveSetting(AppName As String, Section As String, Key As String, Setting As String) 
Member of VBA.Interaction 

Sub DeleteSetting(AppName As String, [Section], [Key]) 
Member of VBA.Interaction 

Function GetSetting(AppName As String, Section As String, Key As String, [Default]) As String 
Member of VBA.Interaction 

也可以使用Windows API調用。

RegOpenKeyEx

的RegOpenKeyEx函數打開指定的註冊表項。

LONG RegOpenKeyEx(
    HKEY hKey,   // handle to open key 
    LPCTSTR lpSubKey, // subkey name 
    DWORD ulOptions, // reserved 
    REGSAM samDesired, // security access mask 
    PHKEY phkResult // handle to open key 
); 
相關問題