I need to read the location of the Temporary ASP.NET Files folder from VBScript as part of a post-installation task in an installer created using a Visual Studio 2008 deploy
Please Check this:
Set oShell = CreateObject("Wscript.Shell") strPath = oShell.RegRead("HKLM64\SOFTWARE\Microsoft\ASP.NET\2.0.50727.0\Path")
https://www.autoitscript.com/autoit3/docs/functions/RegRead.htm
Not sure about launching the 64-bit script host version, but you should be able to access the 64-bit registry from the 32-bit script host using the WMI StdRegProv class, like this:
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: I'm under a 32-bit OS right now, so can't verify that this example works. Beware of bugs :-)
See also the Requesting WMI Data on a 64-bit Platform MSDN article for more info on the subject.
I think something like this, but I haven't sorted out how to process the output values.
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
Using Microsoft's documented approach, Helen's answer is absolutely correct.
However according to my own tests it turns out that it is enough to specify the __ProviderArchitecture
context flag only at the time the connection to the StdRegProv provider is established.
This makes things much simpler as only setting up the provider needs to be encapsulated in a separate function, otherwise one can use the regular API.
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