Jump to content

Software mit Powershell auslesen


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

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

Link zu diesem Kommentar

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())"
        }#>
Link zu diesem Kommentar

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 :(

Link zu diesem Kommentar

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

Link zu diesem Kommentar
  • 2 Monate später...

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 von Jannik.Wack
Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...