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-ID: 428521

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

Ausgedruckt am: 21.11.2024 um 19:11 Uhr

emeriks
emeriks 14.03.2019 um 15:47:18 Uhr
Goto Top
C
o
d
e

T
a
g
s

b
e
n
u
t
z
e
n

!
erikro
erikro 14.03.2019 um 15:52:14 Uhr
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
chkdsk
chkdsk 14.03.2019 um 15:55:22 Uhr
Goto Top
fertig face-smile sorrryyyyy
chkdsk
chkdsk 15.03.2019 um 08:41:47 Uhr
Goto Top
Hat keiner eine Idee? face-sad
Demonix
Demonix 15.03.2019 um 09:48:07 Uhr
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
erikro
erikro 15.03.2019 um 10:30:06 Uhr
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
chkdsk
chkdsk 15.03.2019 aktualisiert um 11:17:09 Uhr
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.
erikro
erikro 15.03.2019 um 11:28:24 Uhr
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
chkdsk
chkdsk 15.03.2019 um 11:38:07 Uhr
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
erikro
erikro 15.03.2019 um 11:58:51 Uhr
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 ...
Demonix
Demonix 15.03.2019 um 12:16:39 Uhr
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?!