8
votes

Comment lire des valeurs de registre 64 bits à partir de VBScript exécutant une tâche post-installation MSI?

J'ai besoin de lire l'emplacement du dossier temporaire des fichiers ASP.NET de VBScript dans le cadre d'une tâche post-installation dans un programme d'installation créé à l'aide d'un projet de déploiement Visual Studio 2008.

Je pensais faire quelque chose comme ça : xxx

puis concaténate STRPATH avec "fichiers asp.net temporaires" et être fait avec elle.

sur un système x64, cependant, je Obtenir la valeur de Wow6432Node (HKLM \ Software \ WOW6432Node \ Microsoft \ ASP.NET \ 2.0.50727.0), qui me donne le chemin-cadre 32 bits (C: \ Windows \ Microsoft.net \ Framework \ V2.0.50727) , mais sur un système X64, je souhaite réellement le chemin 64 bits, c'est-à-dire C: \ Windows \ microsoft.net \ Framework64 \ v2.0.50727.

Je comprends que cela se produit parce que le fichier .vbs est Exécuter à l'aide de l'hôte de script 32 bits en raison du processus parent (l'installateur) étant 32 bits elle-même.

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


0 commentaires

4 Réponses :


10
votes

Vous ne savez pas de lancer la version de l'hôte de script 64 bits, mais vous devriez pouvoir accéder au registre 64 bits de l'hôte de script 32 bits à l'aide du WMI stdrecrov code> classe, 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


3 commentaires

Comment faites-vous cela, mais pour vérifier qu'une clé, pas une valeur ?? (Ex: voir si "logiciel \ microsoft \ asp.net \ 2.0.50727.0" existe mais pas la valeur "chemin"


@ DaniellePaquette-Harvey: Vous devez appeler Enumkey < / a> au lieu de getstringvalue (avec les paramètres appropriés) et vérifiez si ooutparams.returnvalue est 0. Aussi, voir les réponses dans cette question: Check Si la clé de registre existe .


@ Danielaquequette-Harvey Vous pouvez également interroger la valeur standard oreg.getstringvalue, "logiciel \ microsoft \ asp.net \ 2.0.50727.0" , stdv , puis vérifier isnull (STDV) . Technique inspirée de les gars de script



0
votes

Je pense que quelque chose comme ça, mais je n'ai pas réglé sur la manière de traiter les 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


0 commentaires

-3
votes

S'il vous plaît vérifier ceci:

Set Oshell = CreateObject ("wscript.shell") Strpath = oshell.regread ("HKLM64 \ logiciel \ Microsoft \ ASP.NET \ 2.0.50727.0 \ PATH")

https://www.autoitscript.com/autoit3/docs/functions/ Regread.htm


1 commentaires

Le script AutoIt n'est pas VBScript, les fonctions ne sont pas les mêmes



2
votes

Utilisation de l'approche documentée de Microsoft, la réponse de Helen est absolument correcte.

Toutefois, selon mes propres tests, il s'avère qu'il suffit de spécifier le drapeau contextuel code> uniquement au moment de la connexion. Le fournisseur STDREGPROV est établi.
Cela rend les choses beaucoup plus simples, car seulement la mise en place du fournisseur doit être encapsulée dans une fonction distincte, sinon on peut utiliser l'API régulière. P>

set reg64 = MakeRegLocator(64)
reg64.GetStringValue , "SOFTWARE\Microsoft\ASP.NET\2.0.50727.0", "Path", path

WScript.Echo path

' Establish a connection to the local 32 or 64 bit registry hive as requested.
' Parameters:
'   RegType - The registry bitness: 32 or 64.
function MakeRegLocator(bitness)
    set ctx = CreateObject("WbemScripting.SWbemNamedValueSet")
    ctx.Add "__ProviderArchitecture", bitness

    set locator = CreateObject("Wbemscripting.SWbemLocator")
    set services = locator.ConnectServer("", "root\default", "", "", , , , ctx)
    set reg = services.Get("StdRegProv")

    set MakeRegLocator = reg
end function


0 commentaires