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-ID: 77313

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

Ausgedruckt am: 23.11.2024 um 02:11 Uhr

rubberduck
rubberduck 15.01.2008 um 15:53:43 Uhr
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.
maikarl
maikarl 15.01.2008 um 21:10:15 Uhr
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
rubberduck
rubberduck 16.01.2008 um 09:51:15 Uhr
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
maikarl
maikarl 16.01.2008 um 21:55:10 Uhr
Goto Top
Danke für Hilfe. Werde ich mal ausprobieren und melde mich wieder.

Gruß
Thomas
Torti1
Torti1 18.11.2008 um 20:10:21 Uhr
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.
67177
67177 16.02.2009 um 14:22:58 Uhr
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
tomgr-hb
tomgr-hb 31.03.2009 um 08:25:23 Uhr
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.
oks131
oks131 04.06.2009 um 10:26:39 Uhr
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
67177
67177 04.06.2009 um 11:08:36 Uhr
Goto Top
Leider hat Thomas nie mehr reagiert :-S
oks131
oks131 04.06.2009 um 11:14:20 Uhr
Goto Top
Schade, danke für die Info.
vossbaer
vossbaer 04.06.2009 um 21:12:27 Uhr
Goto Top
Ich habe mal die Datenbank erstellt. Waren nur drei Tabellen. Konnte das Problem mit der Aktualisierung noch nicht lösen.
oks131
oks131 05.06.2009 um 08:11:57 Uhr
Goto Top
Kannst Sie ja mal bitte schicken..._!
67177
67177 05.06.2009 um 09:49:28 Uhr
Goto Top
Mir auch bitte face-smile *blush*.........................
Speedy2101
Speedy2101 09.06.2009 um 10:05:06 Uhr
Goto Top
mir bitte auch die Datenbank!

Danke schon mal!
hgross
hgross 11.03.2010 um 16:10:05 Uhr
Goto Top
ist gut gemacht aber die DB fehlt dazu
ich benötige die DB auch

Danke im voraus
eddi971
eddi971 02.11.2010 um 09:20:07 Uhr
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
richtri
richtri 02.11.2010 um 12:58:11 Uhr
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