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.
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
}
}
}
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 428521
Url: https://administrator.de/contentid/428521
Ausgedruckt am: 21.11.2024 um 19:11 Uhr
11 Kommentare
Neuester Kommentar
.negas hcua hci etllow saD
Moin,
Warum? Die Angaben sind doch schon parameterisiert. Der TO braucht das Skript doch nur mit
aufzurufen.
Liebe Grüße
Erik
Zitat von @Demonix:
du kannst bspw. die ersten 6 zeilen ersetzen durch:
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
Moin,
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:
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:
Oder, wenn Du es interaktiv haben willst, dann machst Du das, was @Demonix vorgeschlagen hat.
Das wäre das, was Du aus dem Batch kennst.
hth
Erik
Zitat von @chkdsk:
@erik
Vielen Dank. Sollen die Zeilen in das Skript oder via Powershell mit übergeben werden?
In Batch kann man ja ähnlich
eine Abfrage direkt einbauen. Das geht ja in Powershell auch, finde aber keine Lösung.
@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
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.
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 ...
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.
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?!