1

Тема: 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")

2

Re: VBS: быстрое чтение информации об установленных программах

И кстати, win32_product на некоторых системах не дает всю информацию.

Я поступил чуток по-другому. Не так красиво.

function ExportAddRemoveProgramsDataToFile(FilePath)
{
    FilePath = FilePath || "%TMP%\\Progs.txt";
    var Command = 'REG EXPORT "HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall" "'+FilePath+'" \/y';
    WshShell.Run(Command,0,1);
    
    //var Result = GetAbsolutePath(FilePath); return Result;
}

3 (изменено: Alexey, 2011-06-08 14:21:36)

Re: VBS: быстрое чтение информации об установленных программах

JSman пишет:

И кстати, win32_product на некоторых системах не дает всю информацию.

Я поступил чуток по-другому. Не так красиво.

function ExportAddRemoveProgramsDataToFile(FilePath)
{
    FilePath = FilePath || "%TMP%\\Progs.txt";
    var Command = 'REG EXPORT "HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall" "'+FilePath+'" \/y';
    WshShell.Run(Command,0,1);
    
    //var Result = GetAbsolutePath(FilePath); return Result;
}

Здорово! Я вообще за простоту. Если не  надо читать REG_EXPAND_SZ то самое оно.