chkdsk
Goto Top

Softwareinventur auf einem anderen PC mit Abfrage

Hallo Zusammen,

ich habe folgendes Powershell Skript, welches sämtliche Software auflistet, auf dem es ausgeführt wird. Ich würde das Skript gerne dahingehend abändern, das ich gefragt werde, auf welchem PC es ausgeführt werden soll, ich dann den PC Namen eingebe und die Datei abgespeichert wird.
Hier mal mein bisheriges Skript, welches auch wunderbar funktioniert.

[cmdletbinding()]
param(
    [parameter(ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]
    [string[]]$ComputerName = $env:computername,
    [string]$OutputFile = "C:\Installierte_Software\Installierte_Software.csv"  
) 

function Get-InstalledApps
       {
        foreach ($App in $Applications)
        {           
            $AppRegistryKey = $UninstallRegKey + "\\" + $App  
            $AppDetails = $HKLM.OpenSubKey($AppRegistryKey)
            #$AppGUID = $App
			if (($($AppDetails.GetValue("DisplayName")) -notlike "Security Update*") -and ($($AppDetails.GetValue("DisplayName")) -notlike "Microsoft App Update for*") -and ($($AppDetails.GetValue("DisplayName")) -notlike "Update for Microsoft*") )  
			{
				$AppDisplayName = $($AppDetails.GetValue("DisplayName"))  
				$AppVersion = $($AppDetails.GetValue("DisplayVersion"))  
				#$AppPublisher = $($AppDetails.GetValue("Publisher")) 
				$AppInstalledDate = $($AppDetails.GetValue("InstallDate"))  
				#$AppUninstall = $($AppDetails.GetValue("UninstallString")) 
				if(!$AppDisplayName) { continue }
				$OutputObj = New-Object -TypeName PSobject
				#$OutputObj | Add-Member -MemberType NoteProperty -Name ComputerName -Value $Computer.ToUpper()
				$OutputObj | Add-Member -MemberType NoteProperty -Name AppName -Value $AppDisplayName
				$OutputObj | Add-Member -MemberType NoteProperty -Name AppVersion -Value $AppVersion
				#$OutputObj | Add-Member -MemberType NoteProperty -Name AppVendor -Value $AppPublisher
				$OutputObj | Add-Member -MemberType NoteProperty -Name InstalledDate -Value $AppInstalledDate
				#$OutputObj | Add-Member -MemberType NoteProperty -Name UninstallKey -Value $AppUninstall
				#$OutputObj | Add-Member -MemberType NoteProperty -Name AppGUID -Value $AppGUID
				if ($RegistryView -eq 'Registry32')  
				{
					$OutputObj | Add-Member -MemberType NoteProperty -Name Arch -Value '32'  
				} else {
					$OutputObj | Add-Member -MemberType NoteProperty -Name Arch -Value '64'  
				}
				$OutputObj
			            $OutputObj | export-csv -append -noTypeinformation -path $OutputFile
			}
        }
    }

    if((Test-Path "C:\Installierte_Software") -eq $false){  
    New-Item -Path "C:\Installierte_Software" -ItemType Directory -Force}  

    $UninstallRegKey="SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall"  
    Remove-Item $OutputFile -ErrorAction SilentlyContinue

    
    foreach($Computer in $ComputerName)
    {
        Write-Output "Computer: $Computer"   
        if(Test-Connection -ComputerName $Computer -Count 1 -ea 0)
        {
            # Get the architecture 32/64 bit
            if ((Get-WmiObject -Class Win32_OperatingSystem -ComputerName $Computer -ea 0).OSArchitecture -eq '64-bit')  
            {
                # If 64 bit check both 32 and 64 bit locations in the registry
                $RegistryViews = @('Registry32','Registry64')  
            } else {
                # Otherwise only 32 bit
                $RegistryViews = @('Registry32')  
            }

            foreach ( $RegistryView in $RegistryViews )
            {
                # Get the reg key(s) where add/remove program information is stored.
                $HKLM = [microsoft.win32.registrykey]::OpenRemoteBaseKey('LocalMachine',$computer,$RegistryView)  
                $UninstallRef = $HKLM.OpenSubKey($UninstallRegKey)
                $Applications = $UninstallRef.GetSubKeyNames()               
                Get-InstalledApps
            }
        }
    }

Content-Key: 428521

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

Printed on: April 20, 2024 at 06:04 o'clock

Member: emeriks
emeriks Mar 14, 2019 at 14:47:18 (UTC)
Goto Top
C
o
d
e

T
a
g
s

b
e
n
u
t
z
e
n

!
Member: erikro
erikro Mar 14, 2019 at 14:52:14 (UTC)
Goto Top
Zitat von @emeriks:

C
o
d
e

T
a
g
s

b
e
n
u
t
z
e
n

!

.negas hcua hci etllow saD
Member: chkdsk
chkdsk Mar 14, 2019 at 14:55:22 (UTC)
Goto Top
fertig face-smile sorrryyyyy
Member: chkdsk
chkdsk Mar 15, 2019 at 07:41:47 (UTC)
Goto Top
Hat keiner eine Idee? face-sad
Member: Demonix
Demonix Mar 15, 2019 at 08:48:07 (UTC)
Goto Top
Moin

du kannst bspw. die ersten 6 zeilen ersetzen durch:
$ComputerName = Read-Host "Welcher pc?"  
$OutputFile = "C:\Installierte_Software\$Computername.csv"  

das sollte so schick sein.

LG
Member: erikro
erikro Mar 15, 2019 at 09:30:06 (UTC)
Goto Top
Moin,

Zitat von @Demonix:
du kannst bspw. die ersten 6 zeilen ersetzen durch:
$ComputerName = Read-Host "Welcher pc?"  
> $OutputFile = "C:\Installierte_Software\$Computername.csv"  
> 

Warum? Die Angaben sind doch schon parameterisiert. Der TO braucht das Skript doch nur mit

script.ps1 -computername gewuenschter_computer -outputfile Pfad_Zur_Datei

aufzurufen.

Liebe Grüße

Erik
Member: chkdsk
chkdsk Mar 15, 2019 updated at 10:17:09 (UTC)
Goto Top
@erik
Vielen Dank. Sollen die Zeilen in das Skript oder via Powershell mit übergeben werden?

In Batch kann man ja ähnlich

@echo off
set /p target=Enter target hostname: 
echo %target%

eine Abfrage direkt einbauen. Das geht ja in Powershell auch, finde aber keine Lösung.
Member: erikro
erikro Mar 15, 2019 at 10:28:24 (UTC)
Goto Top
Moin,

Zitat von @chkdsk:

@erik
Vielen Dank. Sollen die Zeilen in das Skript oder via Powershell mit übergeben werden?

In Batch kann man ja ähnlich
> @echo off
> set /p target=Enter target hostname: 
> echo %target%
> 

eine Abfrage direkt einbauen. Das geht ja in Powershell auch, finde aber keine Lösung.

Grundsätzlich hast Du zwei Möglichkeiten. Die eine ist in Deinem Skript schon drin. Das nennt man Parameter. Die gibt man zu Beginn eines Skripts (oder einer Funktion) im PARAM-Block an. Da stehen in Deinem Skript zwei drin:

    [string[]]$ComputerName = $env:computername,
    [string]$OutputFile = "C:\Installierte_Software\Installierte_Software.csv"  

Diese beiden Parameter sind vorbelegt. Das heißt aber nicht, dass Du sie nicht ändern kannst. Die Parameter, die im PARAM-Block stehen, übergibst Du so, wie es auch bei den Befehlen der PS übelich ist:

srkiptname -variablenname_ohne_$

Oder, wenn Du es interaktiv haben willst, dann machst Du das, was @Demonix vorgeschlagen hat.

$variable = Read-Host "Gib was ein!"  

Das wäre das, was Du aus dem Batch kennst.

hth

Erik
Member: chkdsk
chkdsk Mar 15, 2019 at 10:38:07 (UTC)
Goto Top
Die Idee von Demonix läuft so leider nicht, da er das Skript nicht auf dem angegebenen PC ausführt.
Prinzipiell wäre mir die Lösung am liebsten.

VG
Member: erikro
erikro Mar 15, 2019 at 10:58:51 (UTC)
Goto Top
Zitat von @chkdsk:

Die Idee von Demonix läuft so leider nicht, da er das Skript nicht auf dem angegebenen PC ausführt.
Prinzipiell wäre mir die Lösung am liebsten.

Das ist ein ganz anderes Problem. Guck mal hier: https://www.computerweekly.com/de/tipp/PowerShell-fuer-die-Remoteverwalt ...
Member: Demonix
Demonix Mar 15, 2019 at 11:16:39 (UTC)
Goto Top
Zitat von @chkdsk:
das ich gefragt werde, auf welchem PC es ausgeführt werden soll, ich dann den PC Namen eingebe und die Datei abgespeichert wird.

Ein aufruf des Scrips mit Parametern war ja nicht das Ziel, sondern die Abfrage des Rechnernamens bei Ausführung ;)

Von konfiguriertem WinRM bin ich mal ausgegangen,. Oder warum sollte man den Rechnernamen abfragen, wenn sowieso nur lokal gearbeitet wird?!