2009-08-04 2 views
5

Ich muss den Speicherort des Ordners ASP.NET-Dateien aus VBScript als Teil einer Aufgabe nach der Installation in einem Installationsprogramm lesen, das mit einem Visual Studio 2008-Bereitstellungsprojekt erstellt wurde.Wie lese ich 64-Bit-Registrierungswerte aus VBScript, die als MSI-Nachinstallationsaufgabe ausgeführt werden?

Ich dachte, ich so etwas tun würde:

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

und dann verketten strPath mit "\ Temporary ASP.NET Files" und mit ihr geschehen.

Auf einem x64-System erhalte ich jedoch den Wert aus dem WOW6432Node (HKLM \ SOFTWARE \ Wow6432Node \ Microsoft \ ASP.NET \ 2.0.50727.0), der mir den 32-Bit-Framework-Pfad gibt (C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727), aber auf einem x64-System möchte ich den 64-Bit-Pfad, dh C: \ Windows \ Microsoft.NET \ Framework64 \ v2.0.50727.

Ich verstehe, dass dies passiert, weil die .vbs-Datei mit dem 32-Bit-Skript-Host aufgrund des übergeordneten Prozesses (das Installationsprogramm) selbst 32-Bit ausgeführt wird.

Wie kann ich das Skript mit dem 64-Bit-Skript-Host ausführen - oder - Wie kann ich die 64-Bit-Werte lesen, selbst wenn das Skript mit dem 32-Bit-Skript-Host ausgeführt wird?

Antwort

6

Nicht sicher startet die 64-Bit-Script Host-Version, aber Sie sollen die 64-Bit-Register aus der 32-Bit-Skript-Host unter Verwendung der WMI StdRegProv Klasse, wie diese zugreifen können:

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 

Hinweis: Ich bin gerade unter einem 32-Bit-Betriebssystem, daher kann ich nicht bestätigen, dass dieses Beispiel funktioniert. Vorsicht vor Bugs :-)

Siehe auch den MSDN-Artikel Requesting WMI Data on a 64-bit Platform für weitere Informationen zu diesem Thema.

+0

Wie tun Sie das, aber nur einen Schlüssel, um zu überprüfen, keinen Wert ?? (Bsp .: sehen Sie, ob "SOFTWARE \ Microsoft \ ASP.NET \ 2.0.50727.0" existiert, aber nicht den "Path" -Wert –

+1

@ DaniellePaquette-Harvey: Sie müssen ['EnumKey'] (http://msdn.microsoft.com) aufrufen. com/de-us/library/aa390387.aspx) anstelle von 'GetStringValue' (mit entsprechenden Parametern) und prüfen, ob 'oOutParams.ReturnValue' 0 ist. Siehe auch Antworten in dieser Frage: [Überprüfen, ob der Registrierungsschlüssel existiert] (http : //stackoverflow.com/q/9604276/113116) – Helen

0

Ich denke so etwas, aber ich habe nicht sortiert, wie die Ausgabewerte verarbeitet werden.

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 
Verwandte Themen