2009-08-04 8 views
5

Je dois lire l'emplacement du dossier Fichiers temporaires ASP.NET de VBScript dans le cadre d'une tâche de post-installation dans un programme d'installation créé à l'aide d'un projet de déploiement Visual Studio 2008.Comment lire les valeurs de registre 64 bits à partir de VBScript en tant que tâche de post-installation msi?

Je pensais que je ferais quelque chose comme ceci:

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

et concaténer puis strPath avec "\ Temporary ASP.NET Files" et être fait avec elle.

Sur un système x64, cependant, j'obtiens la valeur du WOW6432Node (HKLM \ SOFTWARE \ Wow6432Node \ Microsoft \ ASP.NET \ 2.0.50727.0), ce qui me donne le chemin d'accès 32 bits (C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727), mais sur un système x64, je veux en fait le chemin 64 bits, c.-à-d. C: \ Windows \ Microsoft.NET \ Framework64 \ v2.0.50727. Je comprends que cela se produit parce que le fichier .vbs est exécuté en utilisant l'hôte de script 32 bits en raison du processus parent (le programme d'installation) étant lui-même 32 bits.

Comment puis-je exécuter le script en utilisant l'hôte de script 64 bits - ou - comment puis-je lire les valeurs 64 bits même si le script est exécuté en utilisant l'hôte de script 32 bits?

Répondre

6

ne suis pas sûr de lancer la version hôte de script 64 bits, mais vous devriez être en mesure d'accéder au Registre 64 bits de l'hôte de script 32 bits en utilisant la classe WMI StdRegProv, comme ceci:

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 

NB: Je suis sous un système d'exploitation 32 bits en ce moment, donc je ne peux pas vérifier que cet exemple fonctionne. Méfiez-vous des bogues :-)

Voir aussi l'article MSDN Requesting WMI Data on a 64-bit Platform pour plus d'informations sur le sujet.

+0

Comment faites-vous, mais de vérifier que la clé, pas une valeur ?? (Ex: voir si "SOFTWARE \ Microsoft \ ASP.NET \ 2.0.50727.0" existe mais pas la valeur "Path" –

+1

@ DaniellePaquette-Harvey: Vous devez appeler ['EnumKey'] (http://msdn.microsoft. com/fr-fr/library/aa390387.aspx) au lieu de 'GetStringValue' (avec les paramètres appropriés) et vérifiez si' oOutParams.ReturnValue' est 0. Voir également les réponses à cette question: [Vérifier si la clé de registre existe] (http : //stackoverflow.com/q/9604276/113116) – Helen

0

Je pense quelque chose comme ça, mais je n'ai pas réglé la question du traitement des valeurs de sortie.

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 
Questions connexes