Hallo an alle begeisterten AutoIt-Freunde,
ich befasse mich mit der Inventarisierung aller Rechner in unserem Unternehmen und habe dafür mal ein Skript geschrieben.
Dieses Skript öffnet ein Konsole-Fenster und gibt dort die einzelnen Schritte aus.
Als Quelle Dient derzeit noch eine *.txt-Datei in der alle Rechner eingetragen werden.
Habe das Skript in zwei Hauptfunktionen unterteilt, eine Funktion fragt alle Rechner ab und sucht nach den installierten Betriebssystemen.
Die zweite Funktion fragt alle Rechner ab und sucht nach der gesamten installierten Software.
Im Anschluss an jede Funktion werden die Daten zusammengefasst und per HTTP-POST Methode an einen Webservice gesendet.
Als Frontend dient eine Webansicht in der man übersichtlich den jeweiligen Rechner auswählen kann und die Installierte Software sehen kann.
Ich würde mich freuen, wenn die Profis unter euch mal einen Blick auf den Code werfen könnten und Verbesserungsvorschläge liefern.
Die Laufzeit der Funktion zur Abfrage der installierten Betriebssysteme ist zufriedenstellend.
Leider ist die Laufzeit der Funktion zur Abfrage der installierten Software noch sehr hoch.
Schaut euch den Code mal an.
Ich freue mich auf eure Kommentare.
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=ico\21699-200.ico
#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_Change2CUI=y
#AutoIt3Wrapper_Res_Comment=ComputerInfoViewer Inventory
#AutoIt3Wrapper_Res_Description=ComputerInfoViewer Inventory
#AutoIt3Wrapper_Res_Fileversion=0.9.0.5
#AutoIt3Wrapper_Res_Fileversion_AutoIncrement=p
#AutoIt3Wrapper_Res_LegalCopyright=Lashandan
#AutoIt3Wrapper_Res_Language=1031
#AutoIt3Wrapper_Res_requestedExecutionLevel=requireAdministrator
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#Region ;**** Includes & RequireAdmin ****
#include <Array.au3>
#include <AutoITConstants.au3>
;#include <Timers.au3>
#include <WinHttp.au3>
#include <MsgBoxConstants.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#RequireAdmin
#EndRegion ;**** Includes & RequireAdmin ****
#Region ;**** Variablen ****
Local $oWMI, $ComputerList = @ScriptDir & "\computer.txt", $aSystem, $sPC = FileReadToArray($ComputerList)
Local $oHTTP, $sData, $aRechner, $hFile, $sData2
Local $input
$oHTTP = ObjCreate("WinHttp.WinHttpRequest.5.1")
$oHTTP.Open("POST", "http://xxxxx:xx/request.php", False)
$oHTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
$oHTTP.Send($sData)
#EndRegion ;**** Variablen ****
#Region ;**** Quellprüfung
If Not FileExists($ComputerList) Then
MsgBox(48, "Error", "Fehlende Datei 'computer.txt' : " & @CRLF & $ComputerList & @CRLF & @CRLF & "Bitte stellen Sie sicher, dass die Quelldatei existiert.")
Exit
EndIf
#EndRegion ;**** Quellprüfung
#Region ;**** Start der Konsole
ConsoleWrite("________________________" & @CRLF)
ConsoleWrite("Eingabeaufforderung:" & @CRLF)
ConsoleWrite("________________________" & @CRLF)
ConsoleWrite("--> Bitte eine 1 eingeben fuer das Erstellen der OS-Liste." & @CRLF)
ConsoleWrite("--> Bitte eine 2 eingeben fuer das Erstellen der Software-Liste." & @CRLF)
While 1
$input &= ConsoleRead()
if StringInStr($input,@CRLF) <> 0 then ExitLoop
Wend
if $input = "1" & @CRLF Then
ConsoleWrite("Erstellen der OS-Liste startet" & @CRLF)
$sOSList = OSList()
ElseIf $input = "2" & @CRLF Then
ConsoleWrite("Erstellen der Software-Liste startet" & @CRLF)
$sSoftwarelist = Softwarelist()
Else
ConsoleWrite("Falsche Eingabe! Erwartet wird 1 oder 2! Sie haben " & $input & " eingegeben!" & @CRLF )
Sleep(1000)
ConsoleWrite("Skript schliesst in 3" & @CRLF)
Sleep(1000)
ConsoleWrite("Skript schliesst in 2" & @CRLF)
Sleep(1000)
ConsoleWrite("Skript schliesst in 1" & @CRLF)
Sleep(1000)
EndIf
#EndRegion ;**** Start der Konsole
#Region ;**** Funktionen ****
func OSList()
$LogFileOS = @ScriptDir & "\" & @MON & "" & @MDAY & "" & @YEAR & "_" & @HOUR & "_" & @MIN & "_LogFileOS.txt"
FileWriteLine($LogFileOS, @WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & "Start der Betriebssystemverarbeitung")
ConsoleWrite(@WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & "Start der Betriebssystemverarbeitung" & @CRLF)
For $i = 0 To UBound($sPC) - 1
Local $iPing = Ping($sPC[$i], 250)
Switch @error
Case 1
;MsgBox(64, @error, "Host is offline")
FileWriteLine($LogFileOS, @WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & $sPC[$i] & " Error 1: " & "Host ist Offline" & @CRLF)
ConsoleWrite(@WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & " " & @TAB & $sPC[$i] & " Error 1: " & "Host ist Offline" & @CRLF)
Case 2
;MsgBox(64, @error, "Host is unreachable")
FileWriteLine($LogFileOS, @WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & $sPC[$i] & " Error 2: " & "Host nicht erreichbar" & @CRLF)
ConsoleWrite(@WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & $sPC[$i] & " Error 2: " & "Host nicht erreichbar" & @CRLF)
Case 3
;MsgBox(64, @error, "Bad destination")
FileWriteLine($LogFileOS, @WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & $sPC[$i] & " Error 3: " & "Bad destination" & @CRLF)
ConsoleWrite(@WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & $sPC[$i] & " Error 3: " & "Bad destination" & @CRLF)
Case 4
;MsgBox(64, @error, "Other errors")
FileWriteLine($LogFileOS, @WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & $sPC[$i] & " Error 4: " & "Kein Zugriff" & @CRLF)
ConsoleWrite(@WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & $sPC[$i] & " Error 4: " & "Kein Zugriff" & @CRLF)
Case Else
FileWriteLine($LogFileOS, @WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & $sPC[$i] & " Status : " & "Rechner online" & @CRLF)
ConsoleWrite(@WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & $sPC[$i] & " Status : " & "Rechner online" & @CRLF)
;MsgBox(64, @error, "Host is online")
$oWMI = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & $sPC[$i] & "\root\cimv2")
If IsObj($oWMI) Then
$aSystem = $oWMI.ExecQuery("Select * from Win32_OperatingSystem")
For $oApp In $aSystem
$installdate = StringMid($oApp.InstallDate,1,4) & "-" & StringMid($oApp.InstallDate,5,2) & "-" & StringMid($oApp.InstallDate,7,2)
;FileWriteLine($LogFile, $sPC[$i] & "," & $oApp.Name & "," & $oApp.Version & "," & $oApp.Vendor & "," & $oApp.InstallDate & @CRLF)
if $sData2 <> '' Then
$sData2 = $sData2 & '~'
EndIf
;('%1;%2;%3;%4;%5' %1 %2 %3 %4 %5)
$sData = StringFormat('%s;%s;%s;%s;%s', $sPC[$i] & ";" & $oApp.Caption & ";" & $oApp.Version & ";" & $oApp.Manufacturer & ";" & $installdate)
$sData2 = $sData2 & '~' & $sData
Next
Else
;FileWriteLine($LogFile, $sPC[$i] & "," & "Offline" & @CRLF)
EndIf
$oHTTP.Send("id=setSoftwareinventar&data=" & _URLEncode($sData2))
FileWriteLine($LogFileOS, @WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & $sPC[$i] & " Erfolg : " & "Eintraege wurden vorgenommen" & @CRLF)
ConsoleWrite(@WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & $sPC[$i] & " Erfolg : " & "Eintraege wurden vorgenommen" & @CRLF)
;ConsoleWrite($sData2)
EndSwitch
Next
FileWriteLine($LogFileOS, @WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & "Ende der Betriebssystemverarbeitung")
ConsoleWrite(@WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & "Ende der Betriebssystemverarbeitung" & @CRLF)
FileClose($LogFileOS)
EndFunc ;OSList()
func Softwarelist()
$LogFileSoftware = @ScriptDir & "\" & @MON & "" & @MDAY & "" & @YEAR & "_" & @HOUR & "_" & @MIN & "_LogFileSoftware.txt"
FileWriteLine($LogFileSoftware, @WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & "Start der Softwareverarbeitung")
ConsoleWrite(@WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & "Start der Softwareverarbeitung" & @CRLF)
For $i = 0 To UBound($sPC) - 1
Local $iPing = Ping($sPC[$i], 250)
Switch @error
Case 1
;MsgBox(64, @error, "Host is offline")
FileWriteLine($LogFileSoftware, @WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & $sPC[$i] & " Error 1: " & "Host ist Offline" & @CRLF)
ConsoleWrite(@WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & $sPC[$i] & " Error 1: " & "Host ist Offline" & @CRLF)
Case 2
;MsgBox(64, @error, "Host is unreachable")
FileWriteLine($LogFileSoftware, @WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & $sPC[$i] & " Error 2: " & "Host nicht erreichbar" & @CRLF)
ConsoleWrite(@WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & $sPC[$i] & " Error 2: " & "Host nicht erreichbar" & @CRLF)
Case 3
;MsgBox(64, @error, "Bad destination")
FileWriteLine($LogFileSoftware, @WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & $sPC[$i] & " Error 3: " & "Bad destination" & @CRLF)
ConsoleWrite(@WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & $sPC[$i] & " Error 3: " & "Bad destination" & @CRLF)
Case 4
;MsgBox(64, @error, "Other errors")
FileWriteLine($LogFileSoftware, @WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & $sPC[$i] & " Error 4: " & "Kein Zugriff" & @CRLF)
ConsoleWrite(@WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & $sPC[$i] & " Error 4: " & "Kein Zugriff" & @CRLF)
Case Else
FileWriteLine($LogFileSoftware, @WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & $sPC[$i] & " Status : " & "Rechner online" & @CRLF)
ConsoleWrite(@WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & $sPC[$i] & " Status : " & "Rechner online" & @CRLF)
;MsgBox(64, @error, "Host is online")
$oWMI = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & $sPC[$i] & "\root\cimv2")
If IsObj($oWMI) Then
$aSystem = $oWMI.ExecQuery("Select * from Win32_Product")
For $oApp In $aSystem
;$installdate = StringMid($oApp.InstallDate,1,4) & "-" & StringMid($oApp.InstallDate,5,2) & "-" & StringMid($oApp.InstallDate,7,2)
;FileWriteLine($LogFile, $sPC[$i] & "," & $oApp.Name & "," & $oApp.Version & "," & $oApp.Vendor & "," & $oApp.InstallDate & @CRLF)
if $sData2 <> '' Then
$sData2 = $sData2 & '~'
EndIf
;('%1;%2;%3;%4;%5' %1 %2 %3 %4 %5)
$sData = StringFormat('%s;%s;%s;%s;%s', $sPC[$i] & ";" & $oApp.Name & ";" & $oApp.Version & ";" & $oApp.Vendor & ";" & $oApp.InstallDate)
$sData2 = $sData2 & '~' & $sData
Next
Else
;FileWriteLine($LogFile, $sPC[$i] & "," & "Offline" & @CRLF)
EndIf
$oHTTP.Send("id=setSoftwareinventar&data=" & _URLEncode($sData2))
FileWriteLine($LogFileSoftware, @WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & $sPC[$i] & " Erfolg : " & "Eintraege wurden vorgenommen" & @CRLF)
ConsoleWrite(@WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & $sPC[$i] & " Erfolg : " & "Eintraege wurden vorgenommen" & @CRLF)
;ConsoleWrite($sData2)
EndSwitch
Next
FileWriteLine($LogFileSoftware, @WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & "Ende der Softwareverarbeitung")
ConsoleWrite(@WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & "Ende der Softwareverarbeitung" & @CRLF)
FileClose($LogFileSoftware)
EndFunc ;Softwarelist()
Func _URLEncode($urlText)
Local $sText
For $i = 1 To StringLen($urlText)
$acode = Asc(StringMid($urlText, $i, 1))
Select
Case ($acode >= 48 And $acode <= 57) Or _
($acode >= 65 And $acode <= 90) Or _
($acode >= 97 And $acode <= 122)
$sText &= StringMid($urlText, $i, 1)
Case $acode = 32
$sText &= "%20"
Case Else
$sText &= "%" & Hex($acode, 2)
EndSelect
Next
Return $sText
EndFunc ;==>_URLEncode
#EndRegion ;**** Funktionen ****
Alles anzeigen