与幸福有约 發表於 2021-2-23 10:46:11

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

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">目标</a></li><li><a href="#_label1">制作VBS脚本</a></li><li><a href="#_label2">修改结果文件保存路径。</a></li><li><a href="#_label3">修改过滤条件(设置不想显示的程序名)</a></li><li><a href="#_label4">测试</a></li><ul class="second_class_ul"><li><a href="#_lab2_4_0">测试方法1</a></li><li><a href="#_lab2_4_1">测试方法2</a></li><ul class="third_class_ul"><li><a href="#_label3_4_1_0">测试方法2的注意事项</a></li></ul></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>目标</h2>
<p>用VBS脚本收集域中远程计算机或本地计算机安装的软件,Windows版本。并将收集的结果保存到计算机名为文件名的文本文件中。文本文件可以保存到网络路径中或当前VBS文件所在目录。同时支持32位和64位系统。<br />
并过滤到一些补丁包、Office组件、NVIDIA、Intel&reg;的驱动等。</p>
<p class="maodian"><a name="_label1"></a></p><h2>制作VBS脚本</h2>
<p>保存下面的VBS程序代码到vbs文件中</p>
<div class="jb51code">
<pre class="brush:plain;">
On Error Resume Next

Const HKCU   = &amp;h80000001
Const HKLM   = &amp;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 &amp; "\"
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 &amp; ucase(strComputerName) &amp;".txt",ForWriting,True,True)

Set objReg = GetObject("winmgmts://" &amp; strComputerName &amp; "/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 &amp; " 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 &amp; " Chinese Version"
case "0411" '日文
   strOSVersion = strOSVersion &amp; " Japanese Version"
case "0409" '英文
   strOSVersion = strOSVersion &amp; " English Version"
case else '未知语言
   strOSVersion = strOSVersion &amp; " UnknownLanguage Version"
end select
end if
Else
strOSVersion = "OS Get Failed"
strOSServicePack = "NoFind"
End If
if InStr(LCase(strOSVersion),"windows")&gt;0 then
textWriteFile.WriteLine("""" &amp; ucase(strComputerName) &amp; """" &amp; vbTab &amp; """" &amp; strOSVersion &amp; """" &amp; vbTab &amp; """" &amp; strOSServicePack &amp; """")
end if

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

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

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

textWriteFile.Close

function ignorePgm(strPgm)
If inStr(1,strPgm,"Microsoft Office ",1)&lt;=0 then
'不输出Security Update、.NET Framework、Microsoft Visual C++、NVIDIA、Intel(R)的程序
ignorePgm = inStr(1,strPgm,"Security Update",1)&lt;=0 _
   And inStr(1,strPgm,".NET Framework",1)&lt;=0 _
   And inStr(1,strPgm,"Microsoft Visual C++",1)&lt;=0 _
   And inStr(1,strPgm,"NVIDIA",1)&lt;=0 _
   And inStr(1,strPgm,"Intel(R)",1)&lt;=0
Else
'让个版本的Office能正常输出
ignorePgm = inStr(1,strPgm,"Microsoft Office ",1)&gt;0 _
   And (inStr(1,strPgm," 2000 ",1)&gt;0 _
      Or inStr(1,strPgm," 2003 ",1)&gt;0 _
      Or (inStr(1,strPgm,"Microsoft Office Access ",1)=1 And inStr(1,strPgm," MUI",1)&lt;=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</pre>
</div>
<p>假设保存的文件名为InstalledSoftList.vbs。保存在D:\</p>
<p class="maodian"><a name="_label2"></a></p><h2>修改结果文件保存路径。</h2>
<p>请修改下列代码</p>
<div class="jb51code">
<pre class="brush:plain;">
'FilePath= "\\Server-File\PCSoftList\"
FilePath= CreateObject("Scripting.FileSystemObject").GetFolder(".").Path &amp; "\"</pre>
</div>
<p>当前默认是保存到InstalledSoftList.vbs文件所在目录。可以不修改。</p>
<p class="maodian"><a name="_label3"></a></p><h2>修改过滤条件(设置不想显示的程序名)</h2>
<p>请修改下列代码</p>
<div class="jb51code">
<pre class="brush:plain;">
'不输出Security Update、.NET Framework、Microsoft Visual C++、NVIDIA、Intel(R)的程序
ignorePgm = inStr(1,strPgm,"Security Update",1)&lt;=0 _
   And inStr(1,strPgm,".NET Framework",1)&lt;=0 _
   And inStr(1,strPgm,"Microsoft Visual C++",1)&lt;=0 _
   And inStr(1,strPgm,"NVIDIA",1)&lt;=0 _
   And inStr(1,strPgm,"Intel(R)",1)&lt;=0</pre>
</div>
<p>默认不显示Security Update、.NET Framework、Microsoft Visual C++、NVIDIA、Intel&reg;的程序<br />
测试前可以不修改</p>
<p class="maodian"><a name="_label4"></a></p><h2>测试</h2>
<p class="maodian"><a name="_lab2_4_0"></a></p><h3>测试方法1</h3>
<p>收集当前计算机安装的软件</p>
<blockquote>
<p>直接双击InstalledSoftList.vbs</p>
</blockquote>
<p>假设计算机名为PC-Name01,会在D:\或指定目录下生成一个名为PC-Name01.txt的文件。</p>
<p class="maodian"><a name="_lab2_4_1"></a></p><h3>测试方法2</h3>
<p>收集远程计算机上安装的软件。<br />
在CMD窗口中运行下列命令。(假设计算机名为PC-Name02)</p>
<blockquote>
<p>cscript d:\InstalledSoftList.vbs PC-Name02</p>
</blockquote>
<p>会在D:\或指定目录下生成一个名为PC-Name02.txt的文件。</p>
<p class="maodian"><a name="_label3_4_1_0"></a></p><h4>测试方法2的注意事项</h4>
<p>如果运行后得到的PC-Name02.txt文件为空文件。请确认下列两项内容。</p>
<ul>
<li>远程计算机必须于运行脚本的计算机是同一个域的成员计算机</li>
<li>远程计算机的防火墙为关闭状态,或设置了【入站规则】【Windows Management Instrumentation(WMI)】允许</li>
</ul>
頁: [1]
查看完整版本: 如何用VBS脚本收集远程计算机或本地计算机安装的软件