Тема: VBS: быстрое чтение информации об установленных программах
Задача: получить данные из реестра об установленной программе с учетом архитектуры операционной системы (x64/x86)
Варианты решения:
а) можно получить данные через wmi через win32_product, но скорость выполнения запроса оставляет желать лучшего...
б) получить напрямую из HKLM\software\Microsoft\CurrentVersion\Uninstall, но если делать это напрямую хоть через WMI, хоть через WshShell.RegRead возникает зависимость от разрядности запускающего процесса. То есть если родительский процесс 64-битный то обращение идет к 64-битной ветке реестра, и напротив, от 32-битного родительского потока обращение пойдет к 32-битной ветке.
Решение:
Function GetSoftware(display_name,get_string_param)
On Error Resume Next
ret=""
uninstall_string="SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\"
HKLM=&H80000002
Set objWMI = GetObject("winmgmts:\\.\root\CIMV2")
Set objCtx = CreateObject("WbemScripting.SWbemNamedValueSet")
If GetOsArchitecture="64" Then
objCtx.Add "__ProviderArchitecture", 64
Else
objCtx.Add "__ProviderArchitecture", 32
End If
Set objLocator = CreateObject("Wbemscripting.SWbemLocator")
Set objServices = objLocator.ConnectServer("","root\default","","",,,,objCtx)
Set objStdRegProv = objServices.Get("StdRegProv")
Set InParams = objStdRegProv.Methods_("EnumKey").InParameters
Inparams.Hdefkey = HKLM
Inparams.Ssubkeyname = uninstall_string
Set Outparams = objStdRegProv.ExecMethod_("EnumKey", Inparams,,objCtx)
For Each strSubKey In Outparams.sNames
Set InParam = objStdRegProv.Methods_("GetStringValue").InParameters
Inparam.sSubKeyName=uninstall_string &"\"& strSubKey
Inparam.Hdefkey = HKLM
Inparam.sValueName="DisplayName"
Set OutParam = objStdRegProv.ExecMethod_("GetStringValue", Inparam,,objCtx)
If (StrComp(OutParam.sValue,display_name,1)=0) Then
Set InValue = objStdRegProv.Methods_("GetStringValue").InParameters
InValue.sSubKeyName=uninstall_string &"\"& strSubKey
InValue.Hdefkey = HKLM
InValue.sValueName=get_string_param
Set oValue = objStdRegProv.ExecMethod_("GetStringValue", InValue,,objCtx)
ret=oValue.sValue
Set InValue=Nothing
End If
Set InParam=Nothing
Next
If ret="" Then
GetSoftware="отсутствует"
Else
GetSoftware=ret
End if
Set InParams=Nothing
Set objStdRegProv = Nothing
Set objServices = Nothing
Set objLocator = Nothing
Set objCtx = Nothing
Set objWMI = Nothing
On Error Goto 0
End Function
Function GetOsArchitecture
On Error Resume next
GetOsArchitecture="32"
Const wbemFlagReturnImmediately = &h10
Const wbemFlagForwardOnly = &h20
Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2")
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_OperatingSystem")
For Each objItem In colItems
GetOsArchitecture=Left(objItem.OSArchitecture,2)
Next
Set objWMIService = Nothing
Set colItems = Nothing
On Error GoTo 0
End Function
MsgBox GetSoftware("Microsoft .NET Framework 4 Extended","DisplayVersion")
