Вопрос: Как читать 64-битные значения реестра из VBScript, выполняемые как пост-установочная задача msi?


Мне нужно прочитать местоположение папки временных файлов ASP.NET из VBScript как часть задачи после установки в установщике, созданном с использованием проекта развертывания Visual Studio 2008.

Я думал, что сделаю что-то вроде этого:

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

а затем соедините strPath с «\ Temporary ASP.NET Files» и сделайте с ним.

Однако в системе x64 я получаю значение от WOW6432Node (HKLM \ SOFTWARE \ Wow6432Node \ Microsoft \ ASP.NET \ 2.0.50727.0), что дает мне 32-битный путь к каркасу (C: \ Windows \ Microsoft. NET \ Framework \ v2.0.50727), но в системе x64 мне действительно нужен 64-битный путь, то есть C: \ Windows \ Microsoft.NET \ Framework64 \ v2.0.50727.

Я понимаю, что это происходит из-за того, что файл .vbs запускается с использованием 32-разрядного хоста скриптов из-за того, что родительский процесс (установщик) является 32-битным.

Как запустить сценарий с использованием 64-битного скриптового хоста - или - как я могу прочитать 64-битные значения, даже если скрипт запускается с использованием 32-битного хоста скриптов?


5


источник


Ответы:


Не уверен в запуске 64-разрядной версии хоста сценария, но вы должны иметь доступ к 64-разрядному реестру с 32-разрядного хоста сценария с использованием WMI StdRegProv класс, например:

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: сейчас я под 32-разрядной ОС, поэтому не могу проверить, работает ли этот пример. Остерегайтесь ошибок :-)  

См. Также Запрос данных WMI на 64-битной платформе  Статью MSDN для получения дополнительной информации по этому вопросу.


8



Я думаю, что-то вроде этого, но я не разобрался, как обрабатывать выходные значения.

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



Используя документированный подход Microsoft, ответ Хелен абсолютно прав.

Однако, согласно моим собственным тестам, оказывается, что достаточно указать __ProviderArchitecture флаг контекста только в момент установления соединения с провайдером StdRegProv.
Это значительно упрощает работу, так как только настройка провайдера должна быть инкапсулирована в отдельную функцию, иначе можно использовать обычный 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

0



Пожалуйста, проверьте следующее:

Установить 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


-1