vbscript - VBS Windows 64bit/32bit registreringsdatabase læs problem

Indlæg af Hanne Mølgaard Plasc

Problem



Det, jeg forsøger at opnå, føler jeg, skal være ret simpelt, men det kører mig helt sindssyg.


Baggrund:
Vi driver et systemovervågningsværktøj på tværs af vores kunder, som har evnen til at køre .vbs scripts eksternt. Dette virker meget godt normalt.


Hvad jeg forsøger at opnå i øjeblikket, er at kunne læse en linje fra registreringsdatabasen på både 32bit versioner af Windows og 64 bit versioner.


Client side.exe, der overvåger maskinen, kører som en 32bit-proces på begge platforme (dette er tricket).


Jeg vil gerne læse en nøgle fra HKEY\_LOCAL\_MACHINE \ SOFTWARE \ for eksempel. Mit script fungerer perfekt fint på 32bit. eksempel: objRegistry.RegRead ('HKEY\_LOCAL\_MACHINE \ Software \ anything')


Problemet jeg har, er, når jeg kører den samme linje på en 64bit-mappe, kigges der automatisk i mappen wow64node. Eksempel: objRegistry.RegRead ('HKEY\_LOCAL\_MACHINE \ Software \ wow64node \').


Jeg har brug for at få det til at tjekke ind på det samme sted.


Nøglen den læser er en del af et program, der kører både 32bit og 64bit versioner, hvorfor det ikke er installeret i mappen wow64node.


På dette tidspunkt kan jeg ikke køre .VBS-scriptet som en 64bit-proces, der ville løse mit problem helt, da det ikke ville se i wow64node-mappen.


Hvis nogen har nogen ideer overhovedet, lad mig det vide.

Bedste reference


Jeg løst det ved hjælp af dette stykke kode.


Const HKEY\_LOCAL\_MACHINE = &H80000002
sPath = ReadRegStr (HKEY\_LOCAL\_MACHINE, "SOFTWAREMicrosoftASP.NET2.0.50727.0", "Path", 64)
WScript.Echo sPath

' Reads a REG\_SZ value from the local computer's registry using WMI.
' Parameters:
'   RootKey - The registry hive (see http://msdn.microsoft.com/en-us/library/aa390788(VS.85).aspx for a list of possible values).
'   Key - The key that contains the desired value.
'   Value - The value that you want to get.
'   RegType - The registry bitness: 32 or 64.
'
Function ReadRegStr (RootKey, Key, Value, RegType)
    Dim oCtx, oLocator, oReg, oInParams, oOutParams

    Set oCtx = CreateObject("WbemScripting.SWbemNamedValueSet")
    oCtx.Add "\_\_ProviderArchitecture", RegType

    Set oLocator = CreateObject("Wbemscripting.SWbemLocator")
    Set oReg = oLocator.ConnectServer("", "rootdefault", "", "", , , , oCtx).Get("StdRegProv")

    Set oInParams = oReg.Methods\_("GetStringValue").InParameters
    oInParams.hDefKey = RootKey
    oInParams.sSubKeyName = Key
    oInParams.sValueName = Value

    Set oOutParams = oReg.ExecMethod\_("GetStringValue", oInParams, , oCtx)

    ReadRegStr = oOutParams.sValue
End Function


Tak Helen for din hjælp!

Andre referencer 1


I stedet for WshShell.RegRead skal du bruge WMI StdRegProv class — det giver dig mulighed for at angive, om du vil læse fra 32-bit eller 64-bit registreringsdatabasen. Tjek denne MSDN-artikel for mere info og eksempler: [4]


Anmodning om WMI-data på en 64-bit platform [5]