如何通过vbs脚本检测已安装的软件和版本

发布时间:2021-11-01 18:10:06 作者:小新
来源:亿速云 阅读:342

这篇文章给大家分享的是有关如何通过vbs脚本检测已安装的软件和版本的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

' ////////////////////////////////////////////////////////////////////  
' FileName: SoftwareMeteringCLS.vbs  
' ////////////////////////////////////////////////////////////////////  
If (WScript.ScriptName = "SoftwareMeteringCLS.vbs") Then Call demo_SoftwareMeteringCLS()

' ====================================================================  
Function getSoftwareList(sHost)  
' Callable by *.wsf; will return list (safe array) of installed  
' software on the sHost system (sHost is ComputerName or IP address).  
'   
' The assumption is that sHost is available and has WMI installed.

 Set oSoftMeter = new SoftwareMeteringCLS  
 sProgsAry = oSoftMeter.getList(sHost)  
 Set oSpftMeter = Nothing  
 getSoftwareList = sProgsAry  
End Function  
' ====================== CLASS =======================================  
Class SoftwareMeteringCLS  
' Author:  Branimir Petrovic  
' Date:  6 Sept 2002  
' Version: 1.0.3  
'  
' Revision History:  
'  30 March 2002    V 1.0.0  
'  
'  08 April 2002    V 1.0.1  
'    Added error handling - if the target system is not present,  
'    or does not have WMI, getList(sHost) will return empty list.  
'  
'    Added global function getSoftwareList(sHost) to be used  
'    from *.wsf scripts when caller script is JScript (since  
'    JScript can not instantiate VBS classes directly).  
'  
'  21 April 2002    V 1.0.2  
'    Replacing "[" with "(" and "]" with ")" in "DisplayName"  
'    Some strings like: [See Q311401 for more information]  
'    can cause troubles, therefore replacement.  
'  
'  6 Sept 2002     V 1.0.3  
'    Win2K's SP3 for Windows 2000 introduced slight (but silent)  
'    'improvement' in a way registry provder's EnumValues method  
'    deals with empty keys. EnumValues method called against  
'    keys without any values (except the Default, empty value)  
'    will now return Null value (previously array of size 0 was  
'    returned). Added (previously unneeded) type checking...  
'  
'   
' Dependancies:  
'  WSH 5.6  
'  
' Methods:  
'  - getClassName()  
'  - getVersion()  
'  - getList(sHost) sHost parameter can be computer name or IP address  
'   Enumerates all subkeys in:  
'    "Software\Microsoft\Windows\CurrentVersion\Uninstall"  
'   Returns array of strings, each string item containing:  
'    "DisplayNameKeyValue[ --Version: DisplayVersionKeyValue]"  
'  
'   If sHost parameter is empty string or non-string value,  
'   function returns list of installed software on this host.  
'   Otherwise it will connect to host pointed to by sHost string  
'   (provided sufficient level of permissions)  
'  
'  - getHostString() Returns name of the system or IP address


 ' --- Private data members  
 Private HKLM   ' Points to HKEY_LOCAL_MACHINE hive  
 Private UNINSTALL_ROOT  ' Software\Microsoft\Windows\CurrentVersion\Uninstall  
 Private SUPRESS_HOTFIX_ENTRIES ' By default is TRUE (set in Class_Initialize)  
     ' (supressess listing of installed hotfixes)  
 Private CLASS_NAME  
 Private VERSION  
 Private REG_SZ  
 Private oReg  
 Private sComputerName


 ' --- Public  
 Public Function getClassName()  
  getClassName = CLASS_NAME  
 End Function

 Public Function getVersion()  
  getVersion = VERSION  
 End Function

 Public Function getList(sHost)  
  If TypeName(sHost)="String" AND sHost<>"" Then  
   sComputerName = sHost  
  Else  
   sComputerName = WScript.CreateObject("WScript.Network").ComputerName  
  End If

  On Error Resume Next  
  Set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}//" &_  
  sComputerName & "/root/default:StdRegProv")  
  If Err.Number<>0 Then  
   ' Computer is not accessable or does not have WMI, return empty array  
   getList = Array()  
  Else  
   ' Computer is on the network and does have working WMI,  
   ' return the list (safe array) of installed software  
   getList = listInstalledProgs(oReg)  
  End If  
  On Error GoTo 0  
 End Function

 Public Function getHostString()  
  getHostString = sComputerName  
 End Function


 ' --- Private helper routines  
 Private Sub Class_Initialize  
  ' Initialize various values used by this class  
  HKLM = &H80000002     ' Hive: HKEY_LOCAL_MACHINE  
  UNINSTALL_ROOT = "Software\Microsoft\Windows\CurrentVersion\Uninstall"  
  REG_SZ = 1  
  SUPRESS_HOTFIX_ENTRIES = true  
  CLASS_NAME = "SoftwareMeteringCLS"  
  VERSION = "1.0.3"  
 End Sub

 Private Function listInstalledProgs(oReg)  
  ' returns array of strings DisplayName & " " & DisplayVersion  
  Dim oRegX, nCnt, sSubKeysAry, sProgName  
  Dim sProgsAry(): ReDim sProgsAry(1)  
  sSubKeysAry = getKeys(oReg, HKLM, UNINSTALL_ROOT)

  If SUPRESS_HOTFIX_ENTRIES Then  
   ' Supress looking into all hot fix related sub keys (like Q252795, etc...)  
   Set oRegX = new RegExp  
   oRegX.Pattern = "^Q\d+$" ' will detect patterns like: Q252795  
   oRegX.IgnoreCase = true

   For nCnt = 0 To UBound(sSubKeysAry)  
    If NOT oRegX.Test(sSubKeysAry(nCnt)) Then  
     sProgName = getProgNameAndVersion(oReg, HKLM, _  
     UNINSTALL_ROOT & "\" & sSubKeysAry(nCnt))

     If NOT (IsEmpty(sProgName) OR sProgName="") Then  
      If NOT IsEmpty(sProgsAry(UBound(sProgsAry) - 1)) Then  
       ReDim Preserve sProgsAry(UBound(sProgsAry)+1)  
      End If  
      sProgsAry(UBound(sProgsAry)-1) = sProgName  
     End If  
    End If  
   Next  
  Else  
   ' List all sub keys including hotfix related ones (like Q252795, etc...)  
   For nCnt = 0 To UBound(sSubKeysAry)  
    sProgName = getProgNameAndVersion(oReg, HKLM, _  
    UNINSTALL_ROOT & "\" & sSubKeysAry(nCnt))

    If NOT (IsEmpty(sProgName) OR sProgName="") Then  
     If NOT IsEmpty(sProgsAry(UBound(sProgsAry) - 1)) Then  
      ReDim Preserve sProgsAry(UBound(sProgsAry)+1)  
     End If  
     sProgsAry(UBound(sProgsAry)-1) = sProgName  
    End If  
   Next  
  End If

  listInstalledProgs = sProgsAry  
 End Function

 Private Function getKeys(oReg, HIVE, sKeyRoot)  
  ' Returns array of strings of subkey names  
  Dim vKeysAry  
  Call oReg.EnumKey(HIVE, sKeyRoot, vKeysAry)  
  getKeys = vKeysAry     ' >>>  
 End Function

 Private Function getProgNameAndVersion(oReg, HIVE, sKeyRoot)  
  ' If both values "DisplayName" and "DisplayVersion" exist in sKeyRoot, return:  
  '  "DisplayNameKeyValue --Version: DisplayVersionKeyValue"  
  '  
  ' If only "DisplayName" exists, return:  
  '  "DisplayNameKeyValue"  
  '  
  ' Otherwise EMPTY is returned

  Dim sKeyValuesAry, iKeyTypesAry, nCnt, sValue, sDisplayName, sDisplayVersion  
  oReg.EnumValues HIVE, sKeyRoot, sKeyValuesAry, iKeyTypesAry 'fill the arrays

  ' 6 Sept 2002  
  ' SP3 for Win2K altered behavior of registry provider's EnumValues method!  
  ' EnumValues method after SP3 does not return empty array any more for all  
  ' those registry keys that have only empty Default value.  
  ' Therefore sKeyValuesAry must be tested to see if it is an array or not.  
  If NOT IsArray(sKeyValuesAry) Then  
   Exit Function  '                           '   >>>  
  End If

  For nCnt = 0 To UBound(sKeyValuesAry)  
   If InStr(1, sKeyValuesAry(nCnt), "DisplayName", vbTextCompare) Then  
    If iKeyTypesAry(nCnt) = REG_SZ Then  
     oReg.GetStringValue HIVE, sKeyRoot, sKeyValuesAry(nCnt), sValue  
     If sValue<>"" Then  
      sDisplayName = sValue  
      sDisplayName = Replace(sDisplayName, "[", "(")  
      sDisplayName = Replace(sDisplayName, "]", ")")  
     End If  
    End If  
   ElseIf InStr(1, sKeyValuesAry(nCnt), "DisplayVersion", vbTextCompare) Then  
    If iKeyTypesAry(nCnt) = REG_SZ Then  
     oReg.GetStringValue HIVE, sKeyRoot, sKeyValuesAry(nCnt), sValue  
     If sValue<>"" Then sDisplayVersion = sValue  
    End If  
   End If

   If (sDisplayName<>"") AND (sDisplayVersion<>"") Then  
    getProgNameAndVersion = sDisplayName & " --Version: " & sDisplayVersion  
    Exit Function    ' >>>  
   End If  
  Next

  If sDisplayName<>"" Then  
   getProgNameAndVersion = sDisplayName  
   Exit Function     ' >>>  
  End If  
 End Function

End Class  
' ====================== END OF CLASS ================================

Function demo_SoftwareMeteringCLS()  
 Dim oSoftMeter, sProgsAry, sComputer

 'sComputer = "W-BRANIMIR-666"  
 'sComputer = "W-Branimir-079"  
 sComputer = "" ' query local host

 sProgsAry = getSoftwareList(sComputer)  
 Call WScript.Echo(Join(sProgsAry, vbCrLf))  
End Function

把上面的代码存为vbs文件执行即可  

感谢各位的阅读!关于“如何通过vbs脚本检测已安装的软件和版本”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

推荐阅读:
  1. 通过vbs脚本不显示cmd 窗口执行bat 脚本
  2. linux怎么通过调用脚本来打开软件

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

vbs

上一篇:VBS如何批量重命名文件并且操作前备份原有文件

下一篇:VBS如何打开当前脚本所在文件夹

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》