2009-08-04 11 views
5

Muszę odczytać lokalizację folderu Temporary ASP.NET Files z VBScript w ramach zadania poinstalacyjnego w instalatorze utworzonym przy użyciu projektu wdrażania programu Visual Studio 2008.Jak odczytać 64-bitowe wartości rejestru z VBScript działającego jako zadanie poinstalacyjne msi?

pomyślałem, żeby zrobić coś takiego:

Set oShell = CreateObject("Wscript.Shell") 
strPath = oShell.RegRead("HKLM\SOFTWARE\Microsoft\ASP.NET\2.0.50727.0\Path") 

a następnie złączyć strPath z "\ Temporary ASP.NET Files" i być z nim zrobić.

W systemie x64 otrzymuję wartość z węzła WOW6432Node (HKLM \ SOFTWARE \ Wow6432Node \ Microsoft \ ASP.NET \ 2.0.50727.0), co daje mi 32-bitową ścieżkę do struktury (C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727), ale w systemie x64 faktycznie potrzebuję ścieżki 64-bitowej, tj. C: \ Windows \ Microsoft.NET \ Framework64 \ v2.0.50727.

Rozumiem, że tak się dzieje, ponieważ plik .vbs jest uruchamiany przy użyciu 32-bitowego hosta skryptów, ponieważ proces macierzysty (instalator) jest 32-bitowy.

Jak mogę uruchomić skrypt za pomocą 64-bitowego hosta skryptu - lub - jak mogę odczytać wartości 64-bitowe, nawet jeśli skrypt jest uruchamiany przy użyciu 32-bitowego hosta skryptu?

Odpowiedz

6

Nie wiesz o uruchomienie 64-bitowej wersji hosta skryptów, ale powinieneś być w stanie uzyskać dostęp do rejestru 64-bitowego z hosta skryptów 32-bitowej przy użyciu klasy WMI StdRegProv coś takiego:

Const HKEY_LOCAL_MACHINE = &H80000002 
sPath = ReadRegStr (HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\ASP.NET\2.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("", "root\default", "", "", , , , 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 

UWAGA: Obecnie mam 32-bitowy system operacyjny, więc nie mogę zweryfikować, czy ten przykład działa. Uważaj na błędy :-)

Zobacz także artykuł MSDN Requesting WMI Data on a 64-bit Platform, aby uzyskać więcej informacji na ten temat.

+0

Jak to zrobić, ale tylko w celu sprawdzenia klucza, a nie wartość ?? (Przykład: zobacz, czy "SOFTWARE \ Microsoft \ ASP.NET \ 2.0.50727.0" istnieje, ale nie wartość "Ścieżka" –

+1

@ DaniellePaquette-Harvey: Musisz wywołać ['EnumKey'] (http://msdn.microsoft. com/en-us/library/aa390387.aspx) zamiast 'GetStringValue' (z odpowiednimi parametrami) i sprawdź czy' oOutParams.ReturnValue' to 0. Zobacz także odpowiedzi w tym pytaniu: [Sprawdź, czy istnieje klucz rejestru] (http : //stackoverflow.com/q/9604276/113116). – Helen

0

Myślę, że coś takiego, ale nie wyjaśniłem, jak przetworzyć wartości wyjściowe.

strComputer = "." 
Const HKLM = &h80000002 
Set objCtx = CreateObject("WbemScripting.SWbemNamedValueSet") 
objCtx.Add "__ProviderArchitecture", 64 
objCtx.Add "__RequiredArchitecture", TRUE 
Set objLocator = CreateObject("Wbemscripting.SWbemLocator") 
Set objServices = objLocator.ConnectServer("","root\default","","",,,,objCtx) 
Set objStdRegProv = objServices.Get("StdRegProv") 

' Use ExecMethod to call the GetStringValue method 
Set Inparams = objStdRegProv.Methods_("EnumValues").Inparameters 
Inparams.Hdefkey = HKLM 
Inparams.Ssubkeyname = "SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL\" 
'Inparams.Svaluename = "Logging" 
set Outparams = objStdRegProv.ExecMethod_("EnumValues", Inparams,,objCtx) 

'Show output parameters object and the registry value HKLM\SOFTWARE\ 
WScript.Echo Outparams.GetObjectText_ 
WScript.Echo "WMI Logging is set to " & Outparams.SValue 
Powiązane problemy