MolotovCooker 10 Geschrieben 31. Oktober 2013 Melden Teilen Geschrieben 31. Oktober 2013 Hallo zusammen, ich bin gerade dabei mich mit der Powershell auseinander zu setzen und muss ein Script schreiben was folgendes machen soll: (Bin anfänger 1. Lehrjahr :) ) Es soll die Aktuell Installierte Software ausgelesen werden (ich habe die HKLM genommen) und in eine DB Gespeichert werden. Das klappt auch wunderbar!!! nun zum eigentlichen Problem. Das Script soll ab und zu ausgeführt werden und auf änderungen Prüfen. Sprich es soll den aktuellen stand mit dem der in der DB gespeichert ist vergleichen. Wenn sich nichts an einem Programm geändert hat soll nur das überprüfungsdatum aktualessiert werden und wenn eine Änderung da ist diese Speichern / Hinzufügen. Hier mal der Code wie ich die Daten auslese... $Keys = Get-ChildItem HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall $Items = $keys |foreach-object {Get-ItemProperty $_.PsPath} $varWorkstation = Get-Content env:computername #Auslesen des Computernamens foreach ($item in $items) { $varDisplayname = $item.Displayname $varDisplayVersion = $item.DisplayVersion $varPublisher = $item.Publisher $varInstallDate = $item.InstallDate $varUninstallString = $item.UninstallPath $varIdentifyingNumber = $item.ModifyPath $varLanguage = $item.Language $query = INSERT ........ $user = 'root' $pass = '' $database = 'powershell' $MySQLHost = 'localhost' $conn = ConnectMySQL $user $pass $MySQLHost $database $Rows = WriteMySQLQuery $conn $query } Ich hab zwar ne abfrage gebastelt aber naja die ist mehr schlecht als recht und möchte die keinem zumuten ;) Habe schon versucht alles in einem Array zu speichern und das ganze zu vergleichen aber ich bekomme kein mehrfaches Array hin (hab nix anständiges bei onkel Googel gefunden) und irgendwie speichert der mir nur die letzen einträge im Array :( Evtl. hat ja jemand eine idee? Wenn noch infos benötigt werden... melden :) Danke und Cheers Chris Zitieren Link zu diesem Kommentar
mamamia 13 Geschrieben 31. Oktober 2013 Melden Teilen Geschrieben 31. Oktober 2013 Du schreibst die aktuellen Daten in ein Array, holst dir die Daten aus der DB (sofern vorhanden) und vergleichst diese. Ergebnis ist ein Array, mit allen Änderungen und das schreibst du dann zurück. Compare-Object Sollte dir dabei helfen. Zitieren Link zu diesem Kommentar
MolotovCooker 10 Geschrieben 31. Oktober 2013 Autor Melden Teilen Geschrieben 31. Oktober 2013 Ja das hab ich heute auch versucht nur gab es nicht das ergebnis was ich mir erwünscht hatte :( da ich dann auch nicht weiß wie ich den Beitrag der "fehlt" hinzufügen kann...Ich hatte das So gemacht das ich die Daten aus der dB hole und dann die foreach schleife starte dann mir zwei schlüsselobjekte raus gesucht hatte (den $varidentifyernumber bring und den displaynamen) habe das dann mit dem Company Befehl gemacht -includet dahinter aber dann verließen die mich...Ich stell gleich mal beide Skripte online das bei Bedarf sich der gesamte Quellcode angeschaut werden kann... So hier mal der Quellcode wo ich zuletzt dran gearbeitet habe... und ja ich weiss is ein wenig chaotisch ;) # Auslesen der im Unternehmen eingesetzten Software auf den Einzelnen Arbeitsstationen $ErrorActionPreference = "SilentlyContinue" # Fehler Unterdrückung ####################### # Datenbankverbindung # ####################### $user = 'root' $pass = '' $database = 'powershell' $MySQLHost = 'localhost' $conn = ConnectMySQL $user $pass $MySQLHost $database function ConnectMySQL([string]$user,[string]$pass,[string]$MySQLHost,[string]$database) { # Load MySQL .NET Connector Objects [void][system.reflection.Assembly]::LoadWithPartialName("MySql.Data") # Open Connection $connStr = "server=" + $MySQLHost + ";port=3306;uid=" + $user + ";pwd=" + $pass + ";database="+$database+";Pooling=FALSE" #Pooling speichert die SQL Verbindung $conn = New-Object MySql.Data.MySqlClient.MySqlConnection($connStr) $conn.Open() $cmd = New-Object MySql.Data.MySqlClient.MySqlCommand("USE $database", $conn) return $conn } function WriteMySQLQuery($conn, [string]$query) { $command = $conn.CreateCommand() $command.CommandText = $query $RowsInserted = $command.ExecuteNonQuery() $command.Dispose() if ($RowsInserted) { return $RowInserted } else { return $false } } $Keys = Get-ChildItem HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall $Items = $keys |foreach-object {Get-ItemProperty $_.PsPath} $varWorkstation = Get-Content env:computername #Auslesen des Computernamens ##################### # auslesen der HKLM # ##################### $command = $conn.CreateCommand() $command.CommandText = "SELECT * FROM software" $reader = $command.ExecuteReader() while($reader.Read()) { $row1 = $reader.GetString(0) #ID $row2 = $reader.GetString(1) #Displayname $row3 = $reader.GetString(2) #DisplayVersion $row4 = $reader.GetString(3) #Publisher $row5 = $reader.GetString(4) #InstallDate $row6 = $reader.GetString(5) #UninstallString $row7 = $reader.GetString(6) #IdentifyingNumber (Hash) $row8 = $reader.GetString(7) #Language $row9 = $reader.GetString(8) #Workstation $row10 = $reader.GetString(9) #checktime foreach ($item in $items) { $varDisplayname = $item.Displayname $varDisplayVersion = $item.DisplayVersion $varPublisher = $item.Publisher $varInstallDate = $item.InstallDate $varUninstallString = $item.UninstallPath $varIdentifyingNumber = $item.ModifyPath $varLanguage = $item.Language ######################################## # Auslesen der Daten aus der Datenbank # ######################################## compare-object -referenceobject $varIdentifyingNumber -differenceobject $row7 -includeequal if ($varIdentifyingNumber -eq $row7) { $query = "UPDATE software SET checktime=now() WHERE Workstation='$row9'" $user = 'root' $pass = '' $database = 'powershell' $MySQLHost = 'localhost' $conn = ConnectMySQL $user $pass $MySQLHost $database $Rows = WriteMySQLQuery $conn $query } else { Write-Host $row7 } } } <# if ($vareins -ne $varzwei) { #Write-Host Datensatz Schreiben $query = " INSERT INTO software (Displayname, DisplayVersion, Publisher, InstallDate, UninstallString, IdentifyingNumber, Language, Workstation, checktime) VALUES ('$varDisplayname', '$varDisplayVersion', '$varPublisher', '$varInstallDate', '$varUninstallString', '$varIdentifyingNumber', '$varLanguage', '$varWorkstation', now())" }#> Zitieren Link zu diesem Kommentar
mamamia 13 Geschrieben 1. November 2013 Melden Teilen Geschrieben 1. November 2013 Also liegts jetzt daran, die Daten zu vergleichen? Wenn du vergleichen willst, dann brauchst du 2 identische Arrays o. Objekte, damit du die Daten auch vergleichen kannst. Zitieren Link zu diesem Kommentar
MolotovCooker 10 Geschrieben 1. November 2013 Autor Melden Teilen Geschrieben 1. November 2013 Also liegts jetzt daran, die Daten zu vergleichen? richtig Wenn du vergleichen willst, dann brauchst du 2 identische Arrays o. Objekte, damit du die Daten auch vergleichen kannst. Die frage ist nur wie und an welcher stelle oder in welcher schleife muss ich die Array machen und wo mache ich den vergleich?! Das ist die Schwierigkeit die ich habe :( Zitieren Link zu diesem Kommentar
mamamia 13 Geschrieben 4. November 2013 Melden Teilen Geschrieben 4. November 2013 Du erstellst das erste Array / Objekt beim auslesen eines Computers. Anhand dessen, fragst du deine DB ab und erstellst dein 2tes. Diese beiden vergleichst du dann und schreibst abhängig vom Vergleich deine Daten in die DB. Dann gehts weiter mit dem nächsten. Oder haben wir uns falsch verstanden? Zitieren Link zu diesem Kommentar
MolotovCooker 10 Geschrieben 7. November 2013 Autor Melden Teilen Geschrieben 7. November 2013 ist richtig verstanden nur das ich halt die änderungen speichern will. die Daten die gleich sind sollen nur vom abfrage zeitpunkt aktualesiert werden ich bin grad am überlegen ob ich nun die eigentliche anwendung mit ein paar zusatzfunktionen in C# oder VB schreiben soll... bin mir grad noch ein paar gedanken am machen was ich noch alles damit machen will zusätzlich Zitieren Link zu diesem Kommentar
mamamia 13 Geschrieben 7. November 2013 Melden Teilen Geschrieben 7. November 2013 Änderungen bekommst du ja raus, indem du die beiden Arrays vergleichst. Das Delta kannst du dann zurück schreiben. Zitieren Link zu diesem Kommentar
Jannik.Wack 0 Geschrieben 9. Januar 2014 Melden Teilen Geschrieben 9. Januar 2014 (bearbeitet) Hallo MolotovCooker, mach es dir doch nicht so schwer alles über die Reg auszulesen. Es gibt hierfür ein WMI Object. Um alles auszugeben: gwmi Win32_Product -> Das wäre für dein Rechner gwmi Win32_Product -ComputerName "ABCDEF" -> Das wäre für ein Remoterechner Es wird dir alles aufgelistet was auf diesem Rechner installiert ist. Ich habe dazu noch eine grafische TreeView gebastelt, welche die Beziehung von Hersteller und Software zeigt. Problem ist, das du mehrfach Einträge vom selben Hersteller hast, hierfür gibt es die Get-Unique Funktion. Die Funktioniert so, das du ein sortiertes Array diese Get-Unique Funktion mitgibst, und die siehst zum Beispiel jeden Hersteller nur einmal. Danach kannst du alle Programme abfragen welchen "Vendor / Hersteller" sie haben, und diese dann dem zuweisen. Hier ein kleines Codebeispiel: $Alles = gwmi Win32_Product //Alle Informationen werden in die Variable $Alles geschrieben $Hersteller = @() // Ein leeres Array welches noch gefüllt wird for($i=0;$i -le $Alles.Count-1,$i++) { $Hilf = $Alles[$i].Vendor //Von jedem Eintrag wird der Hersteller gefiltert und in $Hilf geschrieben $Hersteller += $Hilf //Das Array $Hersteller wird gefüllt } $Hersteller = $Hersteller | Sort-Object | Get-Unique // Hier wird das Array Sortiert und alle doppelten Einträge entfernt //////Jetzt haben wir also ein Array mit allen Herstellern, jetzt überprüfen wir welche Programme zu welchem Hersteller gehören =) for($i=0;$i -le $Hersteller.Count-1;$i++) { for($j=0;$j -le $Alles.Count-1;$j++) { if($Hersteller -eq $Alles[$j].Vendor) {Write-Host $Programme[$j].Name gehört zu $Hersteller[$i]} } } So ungefähr könnte das aussehen, du kannst die Programmnamen natürlich auch für jeden Hersteller in eine TXT Datei pipen oder was weiß ich. Sei kreativ. Gruß Jannik bearbeitet 9. Januar 2014 von Jannik.Wack Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.