Ivanti DSM - Patch Pakete löschen welche nicht mehr benötigt werden

Ivanti DSM - Patch Pakete löschen welche nicht mehr benötigt werden

Patch Pakete, sei es APM oder PatchLink, werden in der DSM Umgebung immer dann heruntergeladen, wenn ein Client Sicherheitslücken aufweist und diese nicht gepatcht sind. Über die Zeit sammeln sich dadurch einige Gigabyte an, insbesondere wenn viele Third-Party Produkte im Einsatz sind. Ivanti DSM - Patch Pakete löschen welche nicht mehr verwendet werden, kann ein zeitraubender Prozess sein. In der Version 2016.2 R2 gibt es keine Möglichkeit Patch Pakete automatisch, anhand festgelegter Kriterien zu löschen. Genau für dieses Szenario können die Powershell Extensions hilfreich sein. In diesem Beispiel werden wir alle Patch Pakete löschen, welche nicht mehr in Verwendung sind, bzw. keine offene (pending) Policy-Instanz mehr existiert. Das Script können Sie natürlich im Nachhinein anpassen oder erweitern.

Kurzvorstellung: DSM Powershell Extensions

Ich arbeite sehr viel mit den Powershell Extensions der Firma “NWC-Services” und habe auch bereits diverse Grafische Oberfläche und Tools programmiert um das leben mit der DSM leichter oder effektiver zu machen. Regelmäßig veröffentliche ich hier auf meinem Blog diverse Beiträge. Falls Sie affin in Powershell sind, werfen Sie doch mal einen Blick auf die PSX.

Das Powershell Script vorgestellt

Das Powershell Script durchläuft fünf Phasen:

  1. Authentifizierung am BLS und PS Drive mappen
  2. Alle Patch Pakete ermitteln
  3. Für jedes Paket die Policy-Instanzen prüfen
    1. Existieren „offene“ Instanzen -> weiter mit nächstem Paket
    2. Existieren keine offenen Instanzen -> Paket zum löschen vormerken
  4. Bestätigen das Sie die zum löschen markierten Pakete auch wirklich löschen möchten
  5. Pakete löschen

Gefällt Ihnen mein Script? Dann lassen Sie mir doch ein Newsletter Abo da, gerne Informiere ich Sie wenn es neue interessante Blog-Beiträge in zu Ivanti DSM gibt.

Das Powershell Script Ivanti DSM - Patch Pakete löschen

# =====================================================
#	Author: Griep Marco
#	Last Change: 2018-02-16
#
# 	Release Notes: Initial Commit
# 	Contributors: -
# =====================================================

# PSX Add-ins Importieren und EMDB Connecten
import-module psx7 -DisableNameChecking

Write-Host "Please insert Servername and Port (mybls.intranet.int:8090):"
#BLS Hardcoded - Kommt variabel ins EA
$HostAddr 	= "yourbls:8090"	
$Server 	= "\\" + $HostAddr

#Promt Benutzername und Passwort einzugeben. Benutzername ist vorausgefüllt
Write-Host "Please insert privileged Username (mydomain\MyUser):"
$Username 	= "domain\user"

#DSM Powershell Drive verbinden
$global:path = "emdb:\rootdse\Managed Users & Computers\2\. Computers\"
new-psdrive -name emdb -root $Server -scope script -psprovider blsemdb -Credential $Username
cd $global:path;

# Alle Pakete auslesen
$packages	= Get-EmdbSoftwarePackage "emdb:\rootDSE\Global Software Library\Patch Library\*" -Recurse

$deletablePackages = New-Object System.Collections.ArrayList

foreach ($package in $packages)
{
	if ($package.IsSuperseded) #Prüfen Patch paket durch anderes Paket ersetzt wird
	{
		Write-Host $package.Name " is Superseded"
		$patchPolicies = $package.GetPolicies() #Alle Policies abrufen

		$foundPolicyInstances = $false;
		foreach ($patchPolicy in $patchPolicies)
		{
			#Gibt es noch Policy Instanzen (Sprich ist das Paket in verwendung)
			if ($patchPolicy.GetPolicyInstanceCount() -gt 0) 
			{
				$foundPolicyInstances = $true;
				break;
			}
		}

		#Markiere das Paket zum löschen wenn keine einzige Instanz gefunden.
		if ($foundPolicyInstances -eq $false)
		{
			Write-Host "Found possible deletable Package: "$package.Name
			if ($package.CreationDate.Year -lt 2017)
			{
				Write-Host "Package is older than allowed: "$package.Name ". Package will be marked to delete"
				$deletablePackages.Add($package);
			}
		}
	}
}

#Benutzerabrage: Wirklich löschen?
Write-Host "Found " $deletablePackages.Count". Do you want to delete them all? (y/n)"
$answer = Read-Host

if ($answer -eq "y") #Jop
{
	#Löscht alle Markierten Pakete
	foreach ($deletePackage in $deletablePackages)
	{
		$patchPolicies = $deletePackage.GetPolicies() #Alle Policies abrufen

		foreach ($patchPolicy in $patchPolicies)
		{
			Write-Host $patchPolicy.AssignedObjectID
			$patchPolicy.Delete($True);
		}
		$deletePackage.Delete($True);

	}
}

Read-Host

Hilfe benötigt?

Brauchen Sie Hilfe oder Unterstützung beim erstellen von individuellen Powershell Scripts? Gerne helfe ich Ihnen bei Ihrem Projekt. Schreiben Sie mir einfach eine Nachricht über mein Kontaktformular.