maikarl
Goto Top

Hard- und Software Infos pro Rechner per WSH-Script auslesen und in eine Datenbank schreiben

Hallo,

ich habe angefangen mir ein kleines Script zu schreiben welches bestimmte Informationen eines Rechner´s über WMI oder Registry ausliesst und diese Info´s in eine Access DB oder MS-SQL DB wegschreiben bzw. aktualisieren soll. Klappt soweit auch ganz gut bis auf die Aktualisierung der Software pro Rechner. Er sollte mit den jeweiligen Datensatz aus der Datenbank zurückgeben der nicht mit der installierten Software des Rechners übereinstimmt. Vielleicht kann mir jemand von euch weiterhelfen. Hier der bisherige Code:

' Software Inventur DB.vbs
' Beispiel VBScript zum inventarisieren von installierter Software und Hardware eines Rechners und schreiben in Access-DB
' Author Thomas Splett
' Version 1.0 - Dezember 2007
' ------------------------------------------------------'
Const HKLM = &H80000002 'HKEY_LOCAL_MACHINE
Const adOpenStatic = 3
Const adLockOptimistic = 3
Const adUseClient = 3
Dim DBDriver
Dim IP
Dim varNeueGuuid
Set WshShell = WScript.CreateObject("WScript.Shell")
Set objCN = CreateObject("ADODB.Connection")
Set objRecordSet = CreateObject("ADODB.Recordset")
Set objADSysInfo = CreateObject("ADSystemInfo")
DBDriver = "Driver={Microsoft Access Driver (*.mdb)};Dbq=C:\db1.mdb;Uid=Admin;Pwd=;"
'strComputerPfad = objADSysInfo.ComputerName
'Set objComputer = GetObject("LDAP:" & strComputerPfad)
'strComputerName = objComputer.cn
'strComputerDomainGuid = objComputer.objectGUID
'WScript.echo strComputerPfad1
'strPCGUID = OctetToHex(strComputerDomainGuid)
Set wmi = GetObject("winmgmts:
.")
guidliste = GetGUIDUUID(wmi)
Timestamp = Date & " " & Time

On Error Resume Next

'Computername ermitteln
strComputerName = WshShell.RegRead("HKLM\System\CurrentControlSet\Control\ComputerName\ComputerName\ComputerName")
'WScript.Echo strComputerName

'Betriebssystem ermitteln
OS = WshShell.RegRead("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductName")
If InStr(OS, "Microsoft Windows 2000") > 0 Then
OS = "Windows 2000"
End If
If InStr(OS, "Microsoft Windows XP") > 0 Then
OS = "Windows XP"
End If
'WScript.Echo OS
'WScript.Echo varNeueGuid

'IP-Adresse und MAC-Adresse auslesen
wql = "select * from win32_NetworkAdapterConfiguration where IPEnabled = true"

Set colAdapters = wmi.ExecQuery(wql)

For Each objAdapter In colAdapters
If Not IsNull(objAdapter.DefaultIPGateway) Then

list = list & objAdapter.MACAddress
macliste = Split(list, vbCr)
list = ""

If objAdapter.DHCPEnabled = True Then
list = "DHCP " & Join(objAdapter.IPAddress, "/")
Else
list = list & Join(objAdapter.IPAddress, "/")
End If
ipliste = Split(list, vbCr)
list = ""
IP = Join(ipliste, "/")

varNeueGuuid = "{00000000-0000-0000-0000-" & Join(macliste, "/") & "}"
varNeueGuuid = Replace(varNeueGuuid,":", "")
guidliste = varNeueGuuid
End If
Next
WScript.Echo IP

'Funktionen
Function OctetToHex(bArray)
OctetToHex = ""
For k = 1 To LenB(bArray)
OctetToHex = OctetToHex _
& Right("0" & Hex(AscB(MidB(bArray, k, 1))), 2)
Next
End Function

Function GetGUIDUUID(wmiobj)
On Error Resume Next
wql = "select UUID from Win32_ComputerSystemProduct"
Set ergebnis = wmiobj.ExecQuery(wql)

For Each guid In ergebnis
list = list & guid.UUID
Next

If Len(list)>0 Then
list = Left(list, Len(list)-1)
End If

If InStr(list, "00000000-0000-0000-0000-000000000000") Or InStr(list, "FFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF") Then
varNeueGuuid = "00000000-0000-0000-0000-" & Join(macliste, "/")
varNeueGuuid = Replace(varNeueGuuid,":", "")
Else
varNeueGuuid = list
End If
On Error Goto 0
End Function
WScript.Echo varNeueGuuid

'PC Daten auslesen und in DB schreiben
Set objWMIService = GetObject("winmgmts:\\" & strComputerName & "\root\cimv2")
Set colInfos = objWMIService.ExecQuery("SELECT * from Win32_ComputerSystemProduct",,48)
Set colRAM = objWMIService.ExecQuery("SELECT TotalVisibleMemorySize FROM Win32_OperatingSystem")
Set colCPU = objWMIService.ExecQuery("SELECT * FROM Win32_Processor")
Set colHDD = objWMIService.ExecQuery("SELECT * FROM Win32_DiskDrive")
For Each objInfos In colInfos
modell=objInfos.Vendor
If modell <> "" Then
modell = objInfos.Vendor & " " & objInfos.Version & " " & objInfos.Name
Else
modell="Unbekannt"
End If
serial=objInfos.IdentifyingNumber
If serial <> "" Then
serial = objInfos.IdentifyingNumber
Else
serial="0"
End If
Next
'Modell-Eintrag fomatieren
If InStr(modell, "") Then
modell = Replace(modell," ", " ")
Else
modell = modell
End If

If InStr(modell, "") Then
modell = Replace(modell," ", " ")
Else
modell = modell
End If
WScript.Echo modell

For Each Raminfo In colRAM
RAM=Raminfo.TotalVisibleMemorySize
RAM = Round(RAM / 1024 + 1 ) & " MB"
'RAM = "2046 MB"
Next


For Each CPUinfo In colCPU
CPU = CPUinfo.Name & " " & CPUinfo.MaxClockSpeed & " MHz"
Next

'CPU-Eintrag formatieren
If InStr(CPU, "") Then
CPU = Replace(CPU," ", "")
Else
CPU = CPU
End If

For Each HDDinfo In colHDD
HDD=HDDinfo.Size
HDD=Round(HDD / 1073741824, 1) & " GB"
list=list & HDD & vbCr
HDD = list
Next

'Rechner löschen und somit auch die installierte Software zum neueintragen
'objCN.Open DBDriver
'objRecordSet.Open("SELECT * FROM Hauptdaten"), objCN, adOpenStatic, adLockOptimistic
'strSearchCriteria = "Computername = '" & strComputerName & "'"
'objRecordSet.Find strSearchCriteria
'If objRecordSet.EOF Then

'Else
'objRecordSet.Delete
'objRecordSet.Close
'End If
'objCN.Close

'Hauptdaten erstellen/ändern
objCN.Open DBDriver
objRecordSet.Open("SELECT * FROM Hauptdaten"), objCN, adOpenStatic, adLockOptimistic
strSearchCriteria = "Computername = '" & strComputerName & "'"
objRecordSet.Find strSearchCriteria
If objRecordSet.EOF Then
objRecordSet.AddNew
objRecordSet("Computername") = strComputerName
objRecordSet("IP") = IP
objRecordSet("SN") = serial
objRecordSet("Modell") = modell
objRecordSet("CPU") = CPU
objRecordSet("HDD") = HDD
objRecordSet("RAM") = RAM
objRecordSet("OS") = OS
'objRecordSet("Domain-SID") = strPCGUID
objRecordSet("RIS-GUID") = varNeueGuuid
objRecordSet("Createt") = Date & " " & Time
objRecordSet.Update
objRecordSet.Close
objCN.Close
Else
objCN.Open DBDriver
objRecordSet.Open("SELECT Hauptdaten.IP, Hauptdaten.CPU, Hauptaten.HDD, Hauptdaten.RAM, Hauptdaten.OS, Hauptdaten.RISGUID, Hauptdaten.Modified FROM Hauptdaten WHERE Hauptdaten.Computername='"&strComputerName&"'"), objCN, adOpenStatic, adLockOptimistic
'objRecordSet.Open("SELECT * FROM Hauptdaten WHERE Hauptdaten.Computername='"&strComputerName&"'"), objCN, adOpenStatic, adLockOptimistic
WScript.Echo "Rechner in Datenbank gefunden Update!"
objRecordSet("IP") = IP
objRecordSet("CPU") = CPU
objRecordSet("HDD") = HDD
objRecordSet("RAM") = RAM
objRecordSet("OS") = OS
objRecordSet("RIS-GUID") = varNeueGuuid
objRecordSet("Modified") = Date & " " & Time
objRecordSet.Update
objRecordSet.Close
objCN.Close
End If
objCN.Close

'installierte Software auslesen/eintragen/ändern
strKey = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\"
strEntry1a = "DisplayName"
strEntry1b = "QuietDisplayName"
strEntry2 = "InstallDate"
strEntry3 = "VersionMajor"
strEntry4 = "VersionMinor"
strEntry5 = "EstimatedSize"

Set objReg = GetObject("winmgmts://" & strComputerName & "/root/default:StdRegProv")
objReg.EnumKey HKLM, strKey, arrSubkeys
' Jeden Subkey einmal anspringen (sofern vorhanden)
For Each strSubkey In arrSubkeys

If InStr(strSubKey, "KB") Or InStr(strSubKey, "Framework")Then 'zu ausschliessen der Windows Updates aus der DB
strSubkey = "0"
End If

intRet1 = objReg.GetStringValue(HKLM, strKey & strSubkey, strEntry1a, strValue1)

If intRet1 <> 0 Then
objReg.GetStringValue HKLM, strKey & strSubkey, strEntry1b, strValue1
End If

'Hautpsoftware eintragen
If strValue1 <> "" Then
Display_Name = strValue1
End If

objReg.GetStringValue HKLM, strKey & strSubkey, strEntry2, strValue2

If strValue2 <> "" Then
Install_Date = strValue2
End If

objReg.GetDWORDValue HKLM, strKey & strSubkey, strEntry3, intValue3

objReg.GetDWORDValue HKLM, strKey & strSubkey, strEntry4, intValue4

If intValue3 <> "" Then
Version = intValue3 & "." & intValue4
End If

objReg.GetDWORDValue HKLM, strKey & strSubkey, strEntry5, intValue5

If intValue5 <> "" Then
Estimated_Size = Round(intValue5 / 1024, 2)
End If


objCN.Open DBDriver
objRecordSet.Open("SELECT * FROM Software"), objCN, adOpenStatic, adLockOptimistic
strSearchCriteria1 = "Software = '" & Display_Name & "'"
objRecordSet.Find strSearchCriteria1
If objRecordSet.EOF Then
objRecordSet.AddNew
objRecordSet("Software") = Display_Name
objRecordSet("Version") = Version
objRecordSet("Createt") = Date & " " & Time
objRecordSet.Update
objRecordSet.Close
Else
'WScript.Echo "Software in Hauptsoftware gefunden!"
'objRecordSet("Software") = Display_Name
'objRecordSet("Version") = Version
'objRecordSet("Createt") = Date & " " & Time
'objRecordSet.Update
'objRecordSet.Close
End If
objCN.Close

'Software je Rechner eintragen
objCN.Open DBDriver
objRecordSet.Open("SELECT * FROM PC_SW_Temp"), objCN, adOpenStatic, adLockOptimistic
strSearchCriteria2 = "Software = '" & Display_Name & "'"
objRecordSet.Find strSearchCriteria2
If objRecordSet.EOF Then
objRecordSet.AddNew
objRecordSet("Computername") = strComputerName
objRecordSet("Software") = Display_Name
objRecordSet("Install_Date") = Install_Date
objRecordSet("Size") = Estimated_Size
objRecordSet("Createt_Modified") = Date & " " & Time
objRecordSet.Update
objRecordSet.Close
End If
objCN.Close

'Software je Rechner aktuallisieren
objCN.Open DBDriver
objRecordSet.Open("SELECT * FROM PC_SW_Temp WHERE PC_SW_Temp.Computername='" & strComputerName & "'"), objCN, adOpenStatic, adLockOptimistic
strSearchCriteria2 = "Software <> '" & Display_Name & "'"
objRecordSet.Find strSearchCriteria2
If objRecordSet.BOF Then
WScript.Echo objRecordSet("Software") & " und " & Display_Name
End If
objCN.Close
Next


WScript.Echo "ich habe fertig!"

Falls jemand die Datenbank braucht werde ich sie im natürlich zukommen lassen. Danke
Gruß
Thomas

Content-Key: 77313

Url: https://administrator.de/contentid/77313

Printed on: April 19, 2024 at 01:04 o'clock

Member: rubberduck
rubberduck Jan 15, 2008 at 14:53:43 (UTC)
Goto Top
Falls Du das Problem nicht schon gelöst hast, kannst Du mir das unten geschriebene etwas ausdeutschen?

....Klappt soweit auch ganz gut bis auf die Aktualisierung der Software pro Rechner. Er sollte mit den jeweiligen Datensatz aus der Datenbank zurückgeben der nicht mit der installierten Software des Rechners übereinstimmt.
Member: maikarl
maikarl Jan 15, 2008 at 20:10:15 (UTC)
Goto Top
Hallo,

nein habe leider das Problemnoch nicht lösen können, da ich im moment nicht so richtig Zeit dafür finde. Mir geht es einfach darum die schonmal eingetragene Software mit dem derzeitigem Stand des Rechners abzugleichen und die nicht mehr installierte Software über ein sepperates Feld zu kennzeichnen(um eine Art Historie zu führen), oder die nicht mehr vorhandene Software (Datensatz) zu löschen. Mein nächster Ansatz wäre die Datenbank auszulesen(installierte Software anhand von Computernamen) und die derzeit installierte Software des Rechners und beides in 2 Arrays zu schreiben. Diese gegeneinander abgleichen und Unterschiede zu kennzeichnen oder zu löschen.

Gruß
Thomas
Member: rubberduck
rubberduck Jan 16, 2008 at 08:51:15 (UTC)
Goto Top
Habe bei uns in etwa dasselbe ausgelesen und musste sogar, wie Du, die alte SW aus der DB werfen.
Mein Ansatz war der, dass ich eine Abfrage gemacht habe die mir die überflüssige SW ausgibt und diese mit "DELETE FROM" lösche.

Musst es natürlich auf Dein DB-Modell anpassen face-wink

sql = "DELETE FROM dbo.SOFTWARE WHERE VER_ID IN ("  
sql = sql & "SELECT SOFTWARE.VER_ID "  
sql = sql & "FROM dbo.INS_VER_LNK "  
sql = sql & "RIGHT JOIN dbo.SOFTWARE ON dbo.INS_VER_LNK.VER_ID = dbo.SOFTWARE.VER_ID "  
sql = sql & "LEFT JOIN dbo.INSTALLATION ON dbo.INS_VER_LNK.INS_ID = dbo.INSTALLATION.INS_ID "  
sql = sql & "WHERE INSTALLATION.INS_ID Is Null )"  

db.Execute sql
Member: maikarl
maikarl Jan 16, 2008 at 20:55:10 (UTC)
Goto Top
Danke für Hilfe. Werde ich mal ausprobieren und melde mich wieder.

Gruß
Thomas
Member: Torti1
Torti1 Nov 18, 2008 at 19:10:21 (UTC)
Goto Top
finden Deinen Beitrag sehr interessant, und wäre Dir dankbar, wenn Du wie in Deinem Beitrag angeboten mit Deine Access-DB zukommen lassen würdest. Ich habe hier eine neue Infrastruktur übergeben bekommen ohne irgendwelche Informationen über Hard- und Software und es würde mir die Arbeit unheimlich erleichtern, wenn ich die Hard- und Software Informationen erstmal in einer Access-DB einbringen könnte.
Difinden Deinen Beitrag sehr interessant, und wäre Dir dankbar, wenn Du wie in Deinem Beitrag angeboten mit Deine Access-DB zukommen lassen würdest. Ich habe hier eine neue Infrastruktur übergeben bekommen ohne irgendwelche Informationen über Hard- und Software und es würde mir die Arbeit unheimlich erleichtern, wenn ich die Hard- und Software Informationen erstmal in einer Access-DB einbringen könnte.
Diesbezüglich habe ich Dir eine Email zukommen lassen.
Mitglied: 67177
67177 Feb 16, 2009 at 13:22:58 (UTC)
Goto Top
Hallo,

und hat es geklappt? D. H. immer wenn sich irgendetwas an der installierten SW auf einem Client ändert, wird das automatisch in deiner DB eingepflegt?
d. h. du lässt dieses Script dann alle paar Tage auf jedem Client PC laufen?

Cool.... die hätte ich auch geren *blush* ich habe es nicht so mit wsh face-smile

LG
Eleni
Member: tomgr-hb
tomgr-hb Mar 31, 2009 at 06:25:23 (UTC)
Goto Top
Hallo Thomas.
Ich würde Dein Script bei uns gerne mal ausprobieren, könnte es gut gebrauchen.
Kannst Du mir die DB zukommen lassen?

Gruss, Tom.
Member: oks131
oks131 Jun 04, 2009 at 08:26:39 (UTC)
Goto Top
Hallo Thomas,

würde die Datenbank gerne mal ausprobieren. Kannst Du sie bitte mal zur Verfügung stellen.
Ansonsten würde ich Dameware empfehlen. Dort gibt es eine Exporterfunktion.

Gruß Olli
Mitglied: 67177
67177 Jun 04, 2009 at 09:08:36 (UTC)
Goto Top
Leider hat Thomas nie mehr reagiert :-S
Member: oks131
oks131 Jun 04, 2009 at 09:14:20 (UTC)
Goto Top
Schade, danke für die Info.
Member: vossbaer
vossbaer Jun 04, 2009 at 19:12:27 (UTC)
Goto Top
Ich habe mal die Datenbank erstellt. Waren nur drei Tabellen. Konnte das Problem mit der Aktualisierung noch nicht lösen.
Member: oks131
oks131 Jun 05, 2009 at 06:11:57 (UTC)
Goto Top
Kannst Sie ja mal bitte schicken..._!
Mitglied: 67177
67177 Jun 05, 2009 at 07:49:28 (UTC)
Goto Top
Mir auch bitte face-smile *blush*.........................
Member: Speedy2101
Speedy2101 Jun 09, 2009 at 08:05:06 (UTC)
Goto Top
mir bitte auch die Datenbank!

Danke schon mal!
Member: hgross
hgross Mar 11, 2010 at 15:10:05 (UTC)
Goto Top
ist gut gemacht aber die DB fehlt dazu
ich benötige die DB auch

Danke im voraus
Member: eddi971
eddi971 Nov 02, 2010 at 08:20:07 (UTC)
Goto Top
Hallo,

dieses Script mit der dazugehörigen DB würde mir eine Menge Arbeit ersparen.
Kannst du mir bitte die DB zukommen lassen.
Danke
Gruß Eddi
Member: richtri
richtri Nov 02, 2010 at 11:58:11 (UTC)
Goto Top
Hallo zusammen,

Access-DB anlegen C:\db1.mdb
3 Tabellen einfügen:

Tabelle: Hauptdaten
mit den Spalten:
Computername
IP
SN
Modell
CPU
HDD
RAM
OS
Domain-SID
RIS-GUID
Createt

Tabelle: Software
mit den Spalten:
Software
Version
Createt

und Tabelle: PC_SW_Temp
mit den Spalten:
Computername
Software
Install_Date
Size
Createt_Modified

Grüsse,
richtri