Wie Sie nicht mehr benötigte Ivanti DSM-Patch-Pakete mit PowerShell löschen

Wie Sie nicht mehr benötigte Ivanti DSM-Patch-Pakete mit PowerShell löschen
Bildrechte: Marco Griep (CC BY-NC-ND) - Geschrieben von: Marco Griep

Patch-Pakete, sei es APM oder PatchLink, werden in der DSM-Umgebung heruntergeladen, wenn ein Client Sicherheitslücken aufweist und diese nicht gepatcht werden. Infolgedessen sammeln sich im Laufe der Zeit einige Gigabyte an, insbesondere wenn viele Produkte von Drittanbietern verwendet werden. Das Löschen von nicht mehr verwendeten Ivanti DSM-Patch-Paketen kann zeitaufwändig sein. In Version 2016.2 R2 gibt es keine Option zum automatischen Löschen von Patch-Paketen basierend auf festgelegten Kriterien. Die Powershell-Erweiterungen können für dieses Szenario hilfreich sein. In diesem Beispiel werden alle Patch-Pakete gelöscht, die nicht mehr verwendet werden oder für die keine offene (ausstehende) Richtlinieninstanz vorhanden ist. Sie können das Ivanti DSM PowerShell Script anschließend natürlich anpassen oder erweitern.


Kurze Einführung: DSM Powershell Extensions

Ich arbeite viel mit den Powershell Extensions der Firma “NWC-Services” und habe bereits verschiedene grafische Oberflächen und Tools programmiert, um das Leben mit dem DSM einfacher oder effektiver zu gestalten. Ich veröffentliche hier regelmäßig verschiedene Artikel in meinem Blog. Wenn Sie ein Fan von Powershell sind, schauen Sie sich die PSX an.

Das Ivanti DSM PowerShell Script vorgestellt

Das Powershell-Skript durchläuft fünf Phasen:

  • Ordnen Sie die Authentifizierung BLS und PS Drive zu
  • Identifizieren Sie alle Patch-Pakete
  • Überprüfen Sie die Richtlinieninstanzen für jedes Paket
  • Wenn es “offene” Instanzen gibt -> fahren Sie mit dem nächsten Paket fort
  • Wenn keine offenen Instanzen vorhanden sind -> markieren Sie das Paket zum Löschen
  • Bestätigen Sie, dass Sie die zum Löschen markierten Pakete wirklich löschen möchten
  • Pakete löschen

Gefällt dir mein Skript? Dann schreibe mir eine Nachricht in den Kommentaren, wie diese Seite in den sozialen Medien, oder denke über eine Spende über Github-Sponsoring oder Patreon nach. Ihre Unterstützung hilft mir, meine Hosting-Kosten zu bezahlen. Vielen Dank!

Delete the Powershell Script Ivanti DSM - Patch packages

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

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

Write-Host "Please insert privileged Username (mydomain\MyUser):"
$Username   = "domain\user"

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

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

$deletablePackages = New-Object System.Collections.ArrayList

foreach ($package in $packages)
{
if ($package.IsSuperseded)
{
    Write-Host $package.Name " is Superseded"
    $patchPolicies = $package.GetPolicies() 

    $foundPolicyInstances = $false;
    foreach ($patchPolicy in $patchPolicies)
    {
        if ($patchPolicy.GetPolicyInstanceCount() -gt 0) 
        {
            $foundPolicyInstances = $true;
            break;
        }
    }

    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);
        }
    }
}
}

Write-Host "Found " $deletablePackages.Count". Do you want to delete them all? (y/n)"
$answer = Read-Host

if ($answer -eq "y") 
{

foreach ($deletePackage in $deletablePackages)
{
    $patchPolicies = $deletePackage.GetPolicies() 

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

}
}

Read-Host