Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

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

Frage Entwicklung VB for Applications

Mitglied: maikarl

maikarl (Level 1) - Jetzt verbinden

05.01.2008, aktualisiert 18.11.2008, 16396 Aufrufe, 17 Kommentare, 1 Danke

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
Mitglied: rubberduck
15.01.2008 um 15:53 Uhr
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.
Bitte warten ..
Mitglied: maikarl
15.01.2008 um 21:10 Uhr
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
Bitte warten ..
Mitglied: rubberduck
16.01.2008 um 09:51 Uhr
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

01.
sql = "DELETE FROM dbo.SOFTWARE WHERE VER_ID IN (" 
02.
sql = sql & "SELECT SOFTWARE.VER_ID " 
03.
sql = sql & "FROM dbo.INS_VER_LNK " 
04.
sql = sql & "RIGHT JOIN dbo.SOFTWARE ON dbo.INS_VER_LNK.VER_ID = dbo.SOFTWARE.VER_ID " 
05.
sql = sql & "LEFT JOIN dbo.INSTALLATION ON dbo.INS_VER_LNK.INS_ID = dbo.INSTALLATION.INS_ID " 
06.
sql = sql & "WHERE INSTALLATION.INS_ID Is Null )" 
07.
 
08.
db.Execute sql
Bitte warten ..
Mitglied: maikarl
16.01.2008 um 21:55 Uhr
Danke für Hilfe. Werde ich mal ausprobieren und melde mich wieder.

Gruß
Thomas
Bitte warten ..
Mitglied: Torti1
18.11.2008 um 20:10 Uhr
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.
Bitte warten ..
Mitglied: 67177
16.02.2009 um 14:22 Uhr
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

LG
Eleni
Bitte warten ..
Mitglied: tomgr-hb
31.03.2009 um 08:25 Uhr
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.
Bitte warten ..
Mitglied: oks131
04.06.2009 um 10:26 Uhr
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
Bitte warten ..
Mitglied: 67177
04.06.2009 um 11:08 Uhr
Leider hat Thomas nie mehr reagiert :-S
Bitte warten ..
Mitglied: oks131
04.06.2009 um 11:14 Uhr
Schade, danke für die Info.
Bitte warten ..
Mitglied: vossbaer
04.06.2009 um 21:12 Uhr
Ich habe mal die Datenbank erstellt. Waren nur drei Tabellen. Konnte das Problem mit der Aktualisierung noch nicht lösen.
Bitte warten ..
Mitglied: oks131
05.06.2009 um 08:11 Uhr
Kannst Sie ja mal bitte schicken..._!
Bitte warten ..
Mitglied: 67177
05.06.2009 um 09:49 Uhr
Mir auch bitte *blush*.........................
Bitte warten ..
Mitglied: Speedy2101
09.06.2009 um 10:05 Uhr
mir bitte auch die Datenbank!

Danke schon mal!
Bitte warten ..
Mitglied: hgross
11.03.2010 um 16:10 Uhr
ist gut gemacht aber die DB fehlt dazu
ich benötige die DB auch

Danke im voraus
Bitte warten ..
Mitglied: eddi971
02.11.2010 um 09:20 Uhr
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
Bitte warten ..
Mitglied: richtri
02.11.2010 um 12:58 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Windows Userverwaltung
gelöst PowerShell Script um spezielle Rechner herunterzufahren (20)

Frage von Stefan007 zum Thema Windows Userverwaltung ...

Windows Server
gelöst Rechner neu starten per Script via Aufgabenplanung klappt nicht (4)

Frage von MaxKlaus13 zum Thema Windows Server ...

Windows Server
gelöst Script für zentrales Runterfahren der Rechner zu einem gewissen Zeitpunkt (10)

Frage von Stefan007 zum Thema Windows Server ...

Windows Tools
gelöst Software, womit ich problemlos Rechner aus und anschalten kann (8)

Frage von Leo-le zum Thema Windows Tools ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (25)

Frage von M.Marz zum Thema Windows Server ...

SAN, NAS, DAS
gelöst HP-Proliant Microserver Betriebssystem (14)

Frage von Yannosch zum Thema SAN, NAS, DAS ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Erkennung und -Abwehr
Spam mit eigener Domain (12)

Frage von NoobOne zum Thema Erkennung und -Abwehr ...