用VBS脚本收集远程计算机或本地计算机安装的软件

目标

用VBS脚本收集域中远程计算机或本地计算机安装的软件,Windows版本。并将收集的结果保存到计算机名为文件名的文本文件中。文本文件可以保存到网络路径中或当前VBS文件所在目录。同时支持32位和64位系统。
并过滤到一些补丁包、Office组件、NVIDIA、Intel®的驱动等。

制作VBS脚本

保存下面的VBS程序代码到vbs文件中

On Error Resume Next       

Const HKCU         = &h80000001
Const HKLM         = &H80000002
Const strKeyPath   = "Software\Microsoft\Windows\CurrentVersion\Uninstall\"
Const str64KeyPath = "SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\"
Const ForReading   = 1
Const ForWriting   = 2
Const ForAppending = 8

'FilePath     = "\\Server-File\PCSoftList\"
FilePath     = CreateObject("Scripting.FileSystemObject").GetFolder(".").Path & "\"
Set Wshell         = CreateObject("Wscript.Shell")
Set objFSO         = CreateObject("Scripting.FileSystemobject")

'Set collected computers Name
set argus=wscript.arguments
if argus.count=0 then
   strComputerName = Wshell.RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Hostname")
else
   strComputerName = argus(0)
end if

Set textWriteFile  = objFSO.OpenTextFile(FilePath & ucase(strComputerName) &".txt",ForWriting,True,True)

Set objReg  = GetObject("winmgmts://" & strComputerName & "/root/default:StdRegProv")

'Get OS Version
intRet = objReg.GetStringValue(HKLM, "SOFTWARE\Microsoft\Windows NT\CurrentVersion","ProductName",strOSVersion)
If intRet = 0 Then
   intRet = objReg.GetStringValue(HKLM, "SOFTWARE\Microsoft\Windows NT\CurrentVersion","CSDVersion",strOSServicePack)
   intRet = objReg.GetStringValue(HKLM, "SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion","ProductName",str64BitOSVersion)
   if intRet = 0 then
      strOSVersion = strOSVersion & " 64bit"
   end if
   intRet = objReg.GetStringValue(HKLM, "SYSTEM\CurrentControlSet\Control\Nls\Language","InstallLanguage",OSLanguageCode)
   if intRet = 0 then
      select case OSLanguageCode
      case "0804" '中文
         strOSVersion = strOSVersion & " Chinese Version"
      case "0411" '日文
         strOSVersion = strOSVersion & " Japanese Version"
      case "0409" '英文
         strOSVersion = strOSVersion & " English Version"
      case else   '未知语言
         strOSVersion = strOSVersion & " UnknownLanguage Version"
      end select
   end if
Else
   strOSVersion = "OS Get Failed"
   strOSServicePack = "NoFind"
End If
if InStr(LCase(strOSVersion),"windows")>0 then
   textWriteFile.WriteLine("""" & ucase(strComputerName) & """" & vbTab & """" & strOSVersion & """" & vbTab & """" & strOSServicePack & """")
end if

'Display User Software.
objReg.EnumKey HKCU, strKeyPath,arrSubKeys
For Each strSubKey In arrSubKeys
    intGet = objReg.GetDWORDValue(HKCU, strKeyPath & strSubKey,"SystemComponent",intSystemComponent)
    If IsNull(intSystemComponent) then
       intSystemComponent = 0
    End If
    intRet = objReg.GetStringValue(HKCU, strKeyPath & strSubKey,"ParentDisplayName",strName)
    If intSystemComponent = 0 and intRet > 0 then
       intRet = objReg.GetStringValue(HKCU, strKeyPath & strSubKey,"DisplayName",strName)
       If strName <> "" And intRet = 0 And ignorePgm(strName) Then
          strName = replace(replace(strName,vbCrLf,""),vbTab,"")
          intRet = objReg.GetStringValue(HKCU, strKeyPath & strSubKey,"DisplayVersion",strVersion)
          textWriteFile.WriteLine("""" & ucase(strComputerName) & """" & vbTab & """" & strName & """" & vbTab & """" & strVersion & """")
       End If
    End If
Next

'Display Machine 32bit Software.
objReg.EnumKey HKLM, strKeyPath,arrSubKeys
For Each strSubKey In arrSubKeys
    intGet = objReg.GetDWORDValue(HKLM, strKeyPath & strSubKey,"SystemComponent",intSystemComponent)
    If IsNull(intSystemComponent) then
       intSystemComponent = 0
    End If
    intRet = objReg.GetStringValue(HKLM, strKeyPath & strSubKey,"ParentDisplayName",strName)
    If intSystemComponent = 0 and intRet > 0 then
       intRet = objReg.GetStringValue(HKLM, strKeyPath & strSubKey,"DisplayName",strName)
       If strName <> "" And intRet = 0 And ignorePgm(strName) Then '
           strName = replace(replace(strName,vbCrLf,""),vbTab,"")
           intRet = objReg.GetStringValue(HKLM, strKeyPath & strSubKey,"DisplayVersion",strVersion)
           textWriteFile.WriteLine("""" & ucase(strComputerName) & """" & vbTab & """" & strName & """" & vbTab & """" & strVersion & """")
       End If
    End If
Next

'Display Machine 64bit Software.
objReg.EnumKey HKLM, str64KeyPath,arrSubKeys
For Each strSubKey In arrSubKeys
    intGet = objReg.GetDWORDValue(HKLM, str64KeyPath & strSubKey,"SystemComponent",intSystemComponent)
    If IsNull(intSystemComponent) then
       intSystemComponent = 0
    End If
    intRet = objReg.GetStringValue(HKLM, str64KeyPath & strSubKey,"ParentDisplayName",strName)
    If intSystemComponent = 0 and intRet > 0 then
       intRet = objReg.GetStringValue(HKLM, str64KeyPath & strSubKey,"DisplayName",strName)
       If strName <> "" And intRet = 0 And ignorePgm(strName) Then
          strName = replace(replace(strName,vbCrLf,""),vbTab,"")
          intRet = objReg.GetStringValue(HKLM, str64KeyPath & strSubKey,"DisplayVersion",strVersion)
          textWriteFile.WriteLine("""" & ucase(strComputerName) & """" & vbTab & """" & strName & """" & vbTab & """" & strVersion & """")
       End If
    End If
Next

textWriteFile.Close

function ignorePgm(strPgm)
    If inStr(1,strPgm,"Microsoft Office ",1)<=0 then
       '不输出Security Update、.NET Framework、Microsoft Visual C++、NVIDIA、Intel(R)的程序
       ignorePgm = inStr(1,strPgm,"Security Update",1)<=0 _
            And inStr(1,strPgm,".NET Framework",1)<=0 _
            And inStr(1,strPgm,"Microsoft Visual C++",1)<=0 _
            And inStr(1,strPgm,"NVIDIA",1)<=0 _
            And inStr(1,strPgm,"Intel(R)",1)<=0
    Else
       '让个版本的Office能正常输出
       ignorePgm = inStr(1,strPgm,"Microsoft Office ",1)>0 _
                 And (inStr(1,strPgm," 2000 ",1)>0  _
                      Or inStr(1,strPgm," 2003 ",1)>0  _
                      Or (inStr(1,strPgm,"Microsoft Office Access ",1)=1 And inStr(1,strPgm," MUI",1)<=0) _
                      Or strPgm="Microsoft Office Professional Plus 2007" _
                      Or strPgm="Microsoft Office Professional Plus 2010" _
                      Or strPgm="Microsoft Office Professional Plus 2016" _
                      Or strPgm="Microsoft Office Standard 2007" _
                      Or strPgm="Microsoft Office Standard 2010" _
                      Or strPgm="Microsoft Office Standard 2016" _
                      Or strPgm="Microsoft Office Standard 2019")

    End If
end function

假设保存的文件名为InstalledSoftList.vbs。保存在D:\

修改结果文件保存路径。

请修改下列代码

'FilePath     = "\\Server-File\PCSoftList\"
FilePath     = CreateObject("Scripting.FileSystemObject").GetFolder(".").Path & "\"

当前默认是保存到InstalledSoftList.vbs文件所在目录。可以不修改。

修改过滤条件(设置不想显示的程序名)

请修改下列代码

       '不输出Security Update、.NET Framework、Microsoft Visual C++、NVIDIA、Intel(R)的程序
       ignorePgm = inStr(1,strPgm,"Security Update",1)<=0 _
            And inStr(1,strPgm,".NET Framework",1)<=0 _
            And inStr(1,strPgm,"Microsoft Visual C++",1)<=0 _
            And inStr(1,strPgm,"NVIDIA",1)<=0 _
            And inStr(1,strPgm,"Intel(R)",1)<=0

默认不显示Security Update、.NET Framework、Microsoft Visual C++、NVIDIA、Intel®的程序
测试前可以不修改

测试

测试方法1

收集当前计算机安装的软件

直接双击InstalledSoftList.vbs

假设计算机名为PC-Name01,会在D:\或指定目录下生成一个名为PC-Name01.txt的文件。

测试方法2

收集远程计算机上安装的软件。
在CMD窗口中运行下列命令。(假设计算机名为PC-Name02)

cscript d:\InstalledSoftList.vbs PC-Name02

会在D:\或指定目录下生成一个名为PC-Name02.txt的文件。

测试方法2的注意事项

如果运行后得到的PC-Name02.txt文件为空文件。请确认下列两项内容。

  • 远程计算机必须于运行脚本的计算机是同一个域的成员计算机
  • 远程计算机的防火墙为关闭状态,或设置了【入站规则】【Windows Management Instrumentation(WMI)】允许
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值