chkdsk
Goto Top

Installierte Software auslesen

Hallo Zusammen,

ich habe hier ein Skript, welches mir fast alle installierten Programme ausgibt die auf dem PC installiert ist, aber eben nur fast. Einige fehlen. Um welchen Befel muss ich das Skript denn erweitern, damit er mir alle ausgibt? Hat da jemand eine Idee?

Viele grüße

$ComputerName = Read-Host "Gebe Geräte-ID ein"  
Write-Host
Write-Host "Bitte warten ... Liste wird erstellt"  
Write-Host
if((Test-Path "C:\PC_Software_Inventur") -eq $false){  
    New-Item -Path "C:\PC_Software_Inventur" -ItemType Directory -Force}  

get-wmiobject -class „Win32_Product“ -namespace „root\CIMV2“ -computername „$ComputerName“ | select-object Vendor, Name, Version, InstallDate, HelpLink | Export-Csv -path C:\PC_Software_Inventur\Software_$ComputerName.csv -UseCulture
Write-Host
Write-Host "Liste befindet sich unter C:\PC_Software_Inventur"  
Write-Host
Read-Host "Enter zum Beenden"  

Content-Key: 469714

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

Printed on: April 19, 2024 at 00:04 o'clock

Member: colinardo
colinardo Jul 05, 2019 updated at 07:55:29 (UTC)
Goto Top
Laaaangweilig ...
Mit Powershell in der Reg. auslesen um den UninstallString zu bekommen

Grüße vom Strand an die Stubenhocker face-wink
@colinardo
Member: chkdsk
chkdsk Jul 05, 2019 at 07:56:21 (UTC)
Goto Top
Prinzipiell nicht schlecht, das kann ich zumindest schwer in mein bestehendes Skript einbauen.
Member: colinardo
colinardo Jul 05, 2019 updated at 08:01:50 (UTC)
Goto Top
Zitat von @chkdsk:

Prinzipiell nicht schlecht, das kann ich zumindest schwer in mein bestehendes Skript einbauen.
Der war gut face-big-smile, du machst dem Freitag alle Ehre. Das Ergebnis der Funktion kannst du direkt an Export-CSV pipen, wo ist also das Problem, liefert dir alles was du brauchst ???
Member: Penny.Cilin
Penny.Cilin Jul 05, 2019 at 08:09:52 (UTC)
Goto Top
Zitat von @colinardo:

Zitat von @chkdsk:

Prinzipiell nicht schlecht, das kann ich zumindest schwer in mein bestehendes Skript einbauen.
Der war gut face-big-smile, du machst dem Freitag alle Ehre. Das Ergebnis der Funktion kannst du direkt an Export-CSV pipen, wo ist also das Problem, liefert dir alles was du brauchst ???
Boah ey!, manche Antworten, wie die von @chkdsk machen den Freitachsthread alle negative Ehre.

Freitachsgruss Penny.
Member: chkdsk
chkdsk Jul 05, 2019 at 08:10:21 (UTC)
Goto Top
Das mit dem Pipen ist nicht das Problem face-smile die Schwierigkeit ist eher deine Lösung so mit meiner zu verknüpfen das er mir die Software des Remote-PC ausgibt. Das macht mein Script ja, liefert mir aber eben nicht alle Ergebnisse.
Member: colinardo
colinardo Jul 05, 2019 updated at 08:15:31 (UTC)
Goto Top
Zitat von @chkdsk:

Das mit dem Pipen ist nicht das Problem face-smile die Schwierigkeit ist eher deine Lösung so mit meiner zu verknüpfen das er mir die Software des Remote-PC ausgibt. Das macht mein Script ja, liefert mir aber eben nicht alle Ergebnisse.
Du machst echt Witze ... Schau dir die Funktion doch mal an, da gibt es einen -Computer Parameter, kommt jetzt , "oh hab ich ja total übersehen , sorry ...."?
Dein Skript kann auch nicht alles liefern weil nicht jede Software den Windows Installer nutzt und Win32_Product liefert deswegen nunmal nicht alle Installierten Produkte und eine Anpassung deines Skriptes ist da nunmal so gut wie kalter Kaffee, also Müll, deswegen liest man die aus der Registry aus, ist das so schwer zu verstehen?
Member: chkdsk
chkdsk Jul 05, 2019 at 08:15:31 (UTC)
Goto Top
Ich habe das Skript (inkl. Computer Parameter) bereits über meine Read-Host Eingabe angepasst. Es wird mir jedoch die lokale Software angezeigt, nicht die des Remote PCs.
Member: colinardo
colinardo Jul 05, 2019 updated at 08:26:05 (UTC)
Goto Top
Zitat von @chkdsk:

Ich habe das Skript (inkl. Computer Parameter) bereits über meine Read-Host Eingabe angepasst. Es wird mir jedoch die lokale Software angezeigt, nicht die des Remote PCs.
Ja wenn du das so alles so übernimmst wie es dort steht mit "$env:Computername" als Parameter kein Wunder, das gehört natürlich angepasst:
Get-InstalledSoftware -Computer BlaBlub
Geht hier einwandfrei, also veräppel micht nicht, die tut schon seit eh und jeh ihren Dienst.

*Koppschüttel*

Viel Spaß noch.
Ich geh ne runde Schwimmen.
Member: SlainteMhath
SlainteMhath Jul 05, 2019 at 08:18:22 (UTC)
Goto Top
Moin,

Ich habe das Skript (inkl. Computer Parameter) bereits über meine Read-Host Eingabe angepasst.
Poste doch mal deinen Code...

lg,
Slainte
Member: chkdsk
chkdsk Jul 05, 2019 at 08:37:34 (UTC)
Goto Top
Hallo Slainte,
das wäre mein bisher Code.

$ComputerName = Read-Host "Gebe Geräte-ID ein"  
Write-Host
Write-Host "Bitte warten ... Liste wird erstellt"  
Write-Host

# Function to get installed Software (Method Remote-WMI)
function Get-InstalledSoftware {
    param(
        [parameter(mandatory=$true)][ValidateNotNullOrEmpty()][string]$ComputerName
    )
    $all = @();$hklm = 2147483650; $hkcu = 2147483649
    # Subkeydefinition for Uninstallinformation
    $key = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"  
    $key64 = "SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall"  
    try{
        # connect to StdRegProv via Remote-WMI
        $reg = gwmi -List "StdRegProv" -ComputerName $ComputerName -Namespace root\Default  
        # scriptblock function to get desired Information
        $getnodedata = {
            param($section,$k)
            $reg.EnumKey($section,$k).sNames | %{
                [pscustomobject] @{
                    Name=$reg.GetStringValue($section,"$k\$_","DisplayName").sValue  
                    Version=$reg.GetStringValue($section,"$k\$_","DisplayVersion").sValue  
                    InstallLocation=$reg.GetStringValue($section,"$k\$_","InstallLocation").sValue  
                    InstallSource=$reg.GetStringValue($section,"$k\$_","InstallSource").sValue  
                    UninstallString=$reg.GetStringValue($section,"$k\$_","UninstallString").sValue  
                    InstallDate=$reg.GetStringValue($section,"$k\$_","InstallDate").sValue  
                }
            }
        }
        # call scriptblock function 
        $all += .$getnodedata $hklm $key
        $all += .$getnodedata $hkcu $key
        # call scriptblock function for 64bit section if available
        if ((gwmi Win32_OperatingSystem -ComputerName $ComputerName).OSArchitecture -eq '64-Bit'){  
            $all += .$getnodedata $hklm $key64
            $all += .$getnodedata $hkcu $key64
        }     
            }catch{
        throw $_.Exception.Message
    }
    # return sorted and unique object data
    return ($all | ?{$_.Name -ne $null} | sort Name | select Name,Version,InstallLocation,InstallSource,UninstallString,InstallDate -Unique)
}
$result = Get-InstalledSoftware $env:ComputerName
$result | select Name,UninstallString | Export-Csv -path C:\PC_Software_Inventur\Software_$ComputerName.csv -UseCulture
Write-Host
Write-Host "Liste befindet sich unter C:\PC_Software_Inventur"  
Write-Host
Read-Host "Enter zum Beenden"  
Member: colinardo
Solution colinardo Jul 05, 2019 updated at 08:44:00 (UTC)
Goto Top
Wie vermutet, lese meinen letzten Post dort steht warum das so ist, und genau das hast du nicht angepasst:
$ComputerName = Read-Host "Gebe Geräte-ID ein"  
Write-Host "`nBitte warten ... Liste wird erstellt`n"  

# Function to get installed Software (Method Remote-WMI)
function Get-InstalledSoftware {
    param(
        [parameter(mandatory=$true)][ValidateNotNullOrEmpty()][string]$ComputerName
    )
    $all = @();$hklm = 2147483650; $hkcu = 2147483649
    # Subkeydefinition for Uninstallinformation
    $key = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"  
    $key64 = "SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall"  
    try{
        # connect to StdRegProv via Remote-WMI
        $reg = gwmi -List "StdRegProv" -ComputerName $ComputerName -Namespace root\Default  
        # scriptblock function to get desired Information
        $getnodedata = {
            param($section,$k)
            $reg.EnumKey($section,$k).sNames | %{
                [pscustomobject] @{
                    Name=$reg.GetStringValue($section,"$k\$_","DisplayName").sValue  
                    Version=$reg.GetStringValue($section,"$k\$_","DisplayVersion").sValue  
                    InstallLocation=$reg.GetStringValue($section,"$k\$_","InstallLocation").sValue  
                    InstallSource=$reg.GetStringValue($section,"$k\$_","InstallSource").sValue  
                    UninstallString=$reg.GetStringValue($section,"$k\$_","UninstallString").sValue  
                    InstallDate=$reg.GetStringValue($section,"$k\$_","InstallDate").sValue  
                }
            }
        }
        # call scriptblock function 
        $all += .$getnodedata $hklm $key
        $all += .$getnodedata $hkcu $key
        # call scriptblock function for 64bit section if available
        if ((gwmi Win32_OperatingSystem -ComputerName $ComputerName).OSArchitecture -eq '64-Bit'){  
            $all += .$getnodedata $hklm $key64
            $all += .$getnodedata $hkcu $key64
        }     
            }catch{
        throw $_.Exception.Message
    }
    # return sorted and unique object data
    return ($all | ?{$_.Name -ne $null} | sort Name | select Name,Version,InstallLocation,InstallSource,UninstallString,InstallDate -Unique)
}
Get-InstalledSoftware -Computername $computername | Export-Csv -path "C:\PC_Software_Inventur\Software_$ComputerName.csv" -UseCulture -Encoding UTF8 -NoType  
Write-Host "`nListe befindet sich unter C:\PC_Software_Inventur`n"  
Read-Host "Enter zum Beenden"  
Hier muss man offensichtlich alles mundgerecht servieren ohne das man mal minimal mitdenkt und sich das Skript zumindest mal durchliest anstatt nur zu Copy n' Pasten face-sad.
Member: SlainteMhath
SlainteMhath Jul 05, 2019 at 08:46:55 (UTC)
Goto Top
Hier muss man offensichtlich alles mundgerecht servieren ohne das man mal minimal mitdenkt und sich das Skript zumindest mal durchliest
Genau deswegen poste ich keine fertigen Skripte/Funktionen.

Naja, ist erledigt.
Schönen Freitag noch face-smile
Member: Penny.Cilin
Penny.Cilin Jul 05, 2019 at 09:08:10 (UTC)
Goto Top
Zitat von @colinardo:

Wie vermutet, lese meinen letzten Post dort steht warum das so ist, und genau das hast du nicht angepasst:

Hier muss man offensichtlich alles mundgerecht servieren ohne das man mal minimal mitdenkt und sich das Skript zumindest mal durchliest anstatt nur zu Copy n' Pasten face-sad.
Schick ihm 'ne Rechnung. Wie war Dein Stundensatz? - 395,- € netto
Member: colinardo
colinardo Jul 05, 2019 updated at 09:23:01 (UTC)
Goto Top
Zitat von @Penny.Cilin:
Schick ihm 'ne Rechnung.
Immer wieder lächeln am Freitag face-smile
Member: Penny.Cilin
Penny.Cilin Jul 05, 2019 at 09:23:31 (UTC)
Goto Top
Zitat von @colinardo:

Zitat von @Penny.Cilin:
Schick ihm 'ne Rechnung.
Immer wieder lächeln am Freitag face-smile
Nää des gefällt mir nicht, zu wenig Nivo.
Member: colinardo
colinardo Jul 05, 2019 updated at 09:26:06 (UTC)
Goto Top
Zitat von @Penny.Cilin:
Nää des gefällt mir nicht, zu wenig Nivo.
Dann brauchst du aber ein "Nivo"meter face-wink.
Member: Penny.Cilin
Penny.Cilin Jul 05, 2019 at 09:28:47 (UTC)
Goto Top
Zitat von @colinardo:

Zitat von @Penny.Cilin:
Nää des gefällt mir nicht, zu wenig Nivo.
Dann brauchst du aber ein "Nivo"meter face-wink.
Du weißt doch man schreibt jetzt wie man spricht. face-wink
Member: colinardo
colinardo Jul 05, 2019 updated at 09:41:16 (UTC)
Goto Top
Aha du wohnst offensichtlich in Brüssel, EU Parlament, Zimmer 52 face-smile?
Member: Penny.Cilin
Penny.Cilin Jul 05, 2019 updated at 09:50:07 (UTC)
Goto Top
Und auch in Schulen in der BRD. Nicht in allen Bundesländern und soweit ich weiß in den ersten beiden (?) Schuljahren.
Member: Henere
Henere Jul 06, 2019 at 01:35:21 (UTC)
Goto Top
Des Geschmarri wurde zum Glück wieder abgeschafft
Member: atk691
atk691 Aug 23, 2019 at 10:31:16 (UTC)
Goto Top
Auch wenns schon eine paar Tage her ist:

Ich nutze auch colinardos script für derlei Aufgaben (er ist einfach der Beste face-wink )
Auch bei mir gabe es erst das Problem - trotz korrektem Code - das der localhost ausgelesen wurde.

Die Lösung liegt nicht im Script, sondern in der Firewall. Die passenden Einstellungen für wmi/rpc müssen schon richtig gesetzt sein. face-smile

Mit einem einfachen <Write-Host "$Computer"> an diversen Stellen im script sieht man das dann auch schön.
Kommt das script nicht an den Client ran, steht da wieder der locale Host.

Gruss
atk691
Member: colinardo
colinardo Aug 23, 2019 updated at 10:40:25 (UTC)
Goto Top
Zitat von @atk691:

Auch wenns schon eine paar Tage her ist:

Ich nutze auch colinardos script für derlei Aufgaben (er ist einfach der Beste face-wink )
Auch bei mir gabe es erst das Problem - trotz korrektem Code - das der localhost ausgelesen wurde.

Die Lösung liegt nicht im Script, sondern in der Firewall. Die passenden Einstellungen für wmi/rpc müssen schon richtig gesetzt sein. face-smile
Servus.
Nein, im verlinkten Skript steht in der vorletzen Zeile das hier
$result = Get-InstalledSoftware $env:COMPUTERNAME
und $env:COMPUTERNAME ist nun mal die Umgebungsvariabe des lokalen Computernamens der als Variable $computer in der Funktion genutzt wird face-smile.

Das WMI Remote-Verwaltung am Remote-Computer offen sein muss ist natürlich Grundvorraussetzung.

Grüße Uwe