Software Inventarisierung per VBS-Script

Wie kann ich remote per VBS Skript eine Software-Inventarisierung der PCs im einem Windows Netzwerk durchführen? Viele Administratoren sind auf der Suche nach einer schnellen und einfachen Lösung, die installierte Software von den Clients im Netzwerk aktuell per Remote auszulesen (Software-Inventarisierung) und in einer Datei zu speichern.

Dazu habe ich diverse Tools bereits getestet und ich habe auch vor einiger Zeit bereits eine Lösung für das Problem per WMIC hier auf Windows-FAQ.de veröffentlicht. Der Beitrag heißt „WMIC – Software-Inventarisierung ohne Zusatz-Software„.

Aber irgendwie bin ich damit nicht ganz froh geworden. Erstens lief es viel zu lange und zweitens waren nur die Programme enthalten, die über den Windows Installer installiert wurden. Deswegen habe ich nach einer anderen Lösung gesucht.

Dann habe ich den Dameware Exporter, PSINFO usw. getestet. Mit all diesen Programmen kann man die Daten aus den Systemen auslesen und in Dateien schreiben, aber so richtig funktionierte auch das nicht. Entweder zu wenig Informationen wie Hersteller, Versionsnummer usw. oder der Export lief ewig, mehrere Minuten pro PC. Das macht bei ca. 350 Clients keinen Sinn – ich brauchte eine schnellere Lösung.

Dann bin ich im Technet Script Center fündig geworden, es gab ein Script um die Software auszulesen. Allerdings funktionierte auch dieses nicht korrekt, schon gar nicht mit Deutschen Windows Versionen und 64-Bit Software wurde ebenfalls nicht erkannt. Somit hab ich das gesamte Script umgebaut.

Es funktioniert wie folgt: Zum einen gibt es das VBS-Script, welches Ihr lediglich ausführen müsst. Dieses Script öffnet eine Datei mit dem Namen „CLIENTS.TXT“, in der die Rechner-Namen bzw. die IP-Adressen der Client stehen. In jeder Zeile ein Client! Das Script holt sich einen Namen nach dem anderen aus dieser Datei und durchforstet per Remote die Registry nach installierter Software und gibt diese Informationen dann in einer eigenen TXT-Datei pro PC aus.

Zusätzlich stehen am Anfang der Datei noch der PC-Name, das Betriebssystem, das aktuelle Service-Pack, 32- oder 64-Bit Betriebssysteminformationen usw.

Erst danach erscheinen die Softwareprodukte. Wieder für jede Software eine Zeile, per Semikolon „;“ getrennt. Angegeben werden Hersteller, Programmname und Versionsnummer.

Hier nachfolgend ein Auszug der Datei:

Computer Name: WINDOWSFAQPC
Caption: Microsoft Windows 7 Ultimate
Version: 6.1.7601
Build Number: 7601
Build Type: Multiprocessor Free
OS Type: 18
OS Architecture: 64-Bit
Other Type Description:
Service Pack: 1.0
Number of Processors: 1

Applications:
Adobe Systems Incorporated;Adobe Flash Player 11 ActiveX 64-bit;11.1.102.55
Autodesk;Autodesk Inventor 2011 Deutsch;15.0.0000.23900
Autodesk;DWG TrueView 2011;18.1.49.0
;GPL Ghostscript 8.64;
Microsoft Corporation;Microsoft .NET Framework 4 Client Profile;4.0.30319
Microsoft Corporation;Microsoft .NET Framework 4 Client Profile DEU Language Pack;4.0.30319
Microsoft Corporation;Microsoft IntelliPoint 8.2;8.20.468.0
Microsoft Corporation;Microsoft .NET Framework 4 Extended DEU Language Pack;4.0.30319
Hewlett-Packard;64 Bit HP CIO Components Installer;4.2.1
usw.

Am Ende der Datei steht dann „EOF“ – für End of File!

Das Script gibt im Moment keinerlei Daten auf dem Display aus, auch am Ende nicht. Dies könnt Ihr natürlich z.B. durch Aufnahme folgender Zeile am Ende (Nach dem Befehl LOOP) korrigieren:

Inventarisierung abgeschlossen!

Das Script arbeitet sehr schnell und benötigt maximal 30 Sekunden zum Auslesen der Daten, auch wenn mehrere hundert Zeilen in der Ausgabedatei vorhanden sind.

Hier nachfolgend das Script. Ihr könnt es Euch aber auch am Ende des Beitrages komplett downloaden. Natürlich könnt Ihr es frei verwenden und nach Euren Vorstellungen noch verändern bzw. Anpassen.

Anregungen nehmen wir natürlich auch sehr gerne an.

Const HKEY_LOCAL_MACHINE = &H80000002
Const FOR_WRITING = 2
Const ForReading = 1

Set objFso = CreateObject(„Scripting.FileSystemObject“)
Set objShell = CreateObject(„WScript.Shell“)

Set oList = objFso.OpenTextFile(„clients.txt“,ForReading)
Do While Not oList.AtEndOfStream
strComputername = oList.ReadLine
If Left(strComputername,1) <> „;“ Then
If HostOnline(strComputername) = True Then
Inventory(strComputername)
End If
End If
Loop

‚==========================================================================

Function Inventory(strComputername)
On Error Resume Next

objOS.OSArchitecture = „“
Set oTextFile = objFso.OpenTextFile(strComputername & „.txt“, FOR_WRITING, TRUE)

‚oTextFile.WriteLine strComputername

Set objWMIService = GetObject(„winmgmts:“ _
& „{impersonationLevel=impersonate}!\\“ & strComputername & „\root\cimv2“)

Set colOSes = objWMIService.ExecQuery(„Select * from Win32_OperatingSystem“)
For Each objOS in colOSes
oTextFile.WriteLine „Computer Name: “ & objOS.CSName
oTextFile.WriteLine „Caption: “ & objOS.Caption
oTextFile.WriteLine „Version: “ & objOS.Version
oTextFile.WriteLine „Build Number: “ & objOS.BuildNumber
oTextFile.WriteLine „Build Type: “ & objOS.BuildType
oTextFile.WriteLine „OS Type: “ & objOS.OSType
oTextFile.WriteLine „OS Architecture: “ & objOS.OSArchitecture
oTextFile.WriteLine „Other Type Description: “ & objOS.OtherTypeDescription
oTextFile.WriteLine „Service Pack: “ & objOS.ServicePackMajorVersion & „.“ & objOS.ServicePackMinorVersion
Next

Set colProcs = objWMIService.ExecQuery(„Select * from Win32_ComputerSystem“)

For Each objItem in colProcs
oTextFile.WriteLine „Number of Processors: “ & objItem.NumberOfProcessors
Next

oTextFile.WriteLine vbCrLf & „Applications:“

Set objReg = GetObject(„winmgmts:{impersonationLevel=impersonate}!\\“ & strComputername & „\root\default:StdRegProv“)

strKeyPath = „SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall“
objReg.EnumKey HKEY_LOCAL_MACHINE, strKeyPath, arrSubKeys

For Each subkey In arrSubKeys
strSubKeyPath = strKeyPath & „\“ & subkey

strString = „DisplayName“
objReg.GetStringValue HKEY_LOCAL_MACHINE, strSubKeyPath, strString, strDisplayName

strString = „DisplayVersion“
objReg.GetStringValue HKEY_LOCAL_MACHINE, strSubKeyPath, strString, strDisplayVersion

strString = „Publisher“
objReg.GetStringValue HKEY_LOCAL_MACHINE, strSubKeyPath, strString, strDisplayPublisher

strDisplayName=Trim(strDisplayName)
strDisplayVersion=Trim(strDisplayVersion)
strDisplayPublisher=Trim(strDisplayPublisher)
If strDisplayName <> „“ Then
oTextFile.WriteLine strDisplayPublisher & „;“ & strDisplayName & „;“ & strDisplayVersion
End If
Next

strKeyPath = „SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall“
objReg.EnumKey HKEY_LOCAL_MACHINE, strKeyPath, arrSubKeys

For Each subkey In arrSubKeys
strSubKeyPath = strKeyPath & „\“ & subkey

strString = „DisplayName“
objReg.GetStringValue HKEY_LOCAL_MACHINE, strSubKeyPath, strString, strDisplayName

strString = „DisplayVersion“
objReg.GetStringValue HKEY_LOCAL_MACHINE, strSubKeyPath, strString, strDisplayVersion

strString = „Publisher“
objReg.GetStringValue HKEY_LOCAL_MACHINE, strSubKeyPath, strString, strDisplayPublisher

strDisplayName=Trim(strDisplayName)
strDisplayVersion=Trim(strDisplayVersion)
If strDisplayName <> „“ Then
oTextFile.WriteLine strDisplayPublisher & „;“ & strDisplayName & „;“ & strDisplayVersion
End If
Next

oTextFile.WriteLine „EOF“

objTextFile.close

End Function

‚==========================================================================

Function Output(sOutput)
WScript.echo Date() & “ “ & Time() & vbTab & sOutput
End Function

‚==========================================================================

Function HostOnline(strComputername)
Set sTempFolder = objFso.GetSpecialFolder(TEMPFOLDER)
sTempFile = objFso.GetTempName
sTempFile = sTempFolder & „\“ & sTempFile

objShell.Run „cmd /c ping -n 2 -l 8 “ & strComputername & „>“ & sTempFile,0,True

Set oFile = objFso.GetFile(sTempFile)
set oTS = oFile.OpenAsTextStream(ForReading)
do while oTS.AtEndOfStream <> True
sReturn = oTS.ReadLine
if instr(sReturn, „Antwort“)>0 then
HostOnline = True
Exit Do
End If
Loop

ots.Close
oFile.delete
End Function

‚==========================================================================

oList.Close
Set objReg = Nothing
Set objFso = Nothing

– Download Software-Inventarisierung VBS-Script