Detection

Detection Recipes fuer reale Paketierungsfaelle.

Diese Seite sammelt kurze, belastbare Detection-Muster fuer typische Anwendungsfaelle. Sie ist bewusst als Recipe-Sammlung aufgebaut: kopierbar, aber mit klarer Einordnung, wann welches Muster wirklich Sinn ergibt.

Wofuer Recipes gut sind

Sie geben dir ein klares Startmuster fuer haeufige Detection-Faelle, ohne dass du jedes Mal bei null anfangen musst.

Worauf du trotzdem achten musst

Jedes Recipe ist nur so gut wie das dahinterliegende Artefakt. Wenn Pfad, Version oder Registry-Wert instabil sind, wird auch die Detection instabil.

Recipe 1

Datei vorhanden und Mindestversion erreicht

Ein gutes Muster fuer EXE-basierte Anwendungen ohne saubere MSI-Identitaet.

PowerShell
$file = 'C:\Program Files\Vendor\App\app.exe'
$minimumVersion = [version]'5.2.0'

if (Test-Path -LiteralPath $file) {
    $currentVersion = [version](Get-Item -LiteralPath $file).VersionInfo.ProductVersion
    if ($currentVersion -ge $minimumVersion) {
        exit 0
    }
}

exit 1

Recipe 2

Registry-Wert in HKLM pruefen

Geeignet fuer per-machine Installationen mit stabiler Hersteller-Registry.

PowerShell
$path = 'HKLM:\SOFTWARE\Vendor\App'
$name = 'Version'
$minimumVersion = [version]'10.4.1'

if (Test-Path $path) {
    $value = (Get-ItemProperty -Path $path -Name $name -ErrorAction SilentlyContinue).$name
    if ($value -and ([version]$value -ge $minimumVersion)) {
        exit 0
    }
}

exit 1

Recipe 3

Uninstall-Registry pruefen

Praktisch, wenn DisplayVersion sauber gepflegt ist und direkt zur Anwendung gehoert.

PowerShell
$roots = @(
    'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*',
    'HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*'
)

$app = Get-ItemProperty -Path $roots -ErrorAction SilentlyContinue |
    Where-Object { $_.DisplayName -like 'Vendor App*' } |
    Select-Object -First 1

if ($app -and ([version]$app.DisplayVersion -ge [version]'3.8.0')) {
    exit 0
}

exit 1

Recipe 4

Per-user Detection unter HKCU oder Benutzerprofil

Wichtig fuer Tools, die nicht maschinenweit, sondern benutzerbezogen installieren.

PowerShell
$path = 'HKCU:\Software\Vendor\App'
$name = 'InstalledVersion'

if (Test-Path $path) {
    $value = (Get-ItemProperty -Path $path -Name $name -ErrorAction SilentlyContinue).$name
    if ($value -and ([version]$value -ge [version]'2.1.0')) {
        exit 0
    }
}

exit 1

Recipe 5

MSI ProductCode bewusst einsetzen

Nur sinnvoll, wenn du wirklich ein MSI und dessen Produktlogik sauber verstanden hast.

PowerShell
$productCode = '{11111111-2222-3333-4444-555555555555}'
$paths = @(
    "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$productCode",
    "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\$productCode"
)

if ($paths | Where-Object { Test-Path $_ }) {
    exit 0
}

exit 1

Recipe 6

Kombinierte Detection fuer schwierige Faelle

Wenn ein einzelnes Artefakt nicht stabil genug ist, kann eine Kombination aus Datei und Registry sinnvoll sein.

PowerShell
$file = 'C:\Program Files\Vendor\App\app.exe'
$regPath = 'HKLM:\SOFTWARE\Vendor\App'

$fileOk = $false
$regOk = $false

if (Test-Path -LiteralPath $file) {
    $fileVersion = [version](Get-Item -LiteralPath $file).VersionInfo.ProductVersion
    $fileOk = $fileVersion -ge [version]'4.0.0'
}

if (Test-Path $regPath) {
    $channel = (Get-ItemProperty -Path $regPath -Name 'Channel' -ErrorAction SilentlyContinue).Channel
    $regOk = $channel -eq 'Enterprise'
}

if ($fileOk -and $regOk) {
    exit 0
}

exit 1

Wann Datei gut ist

Wenn die Datei stabil ist, die Version sauber gepflegt wird und der Installationspfad nicht bei jedem Benutzer oder Sprachpaket wechselt.

Wann Registry besser ist

Wenn Herstellerwerte verlaesslicher sind als Dateiversionen oder wenn per-user Installationen ausgewertet werden muessen.

Wann MSI reicht

Wenn es wirklich ein MSI ist und ProductCode oder UpgradeCode bewusst genutzt werden. Nicht jede Update-Logik macht denselben Code dauerhaft brauchbar.

Wann kombinieren

Wenn ein einzelnes Artefakt zu fragil ist. Kombinationen sind legitim, aber nur dann, wenn beide Bedingungen fachlich begruendet sind.

Detection erst im Zielkontext pruefen

Das gleiche Skript kann unter Admin, SYSTEM und Benutzerkontext unterschiedliche Ergebnisse liefern. Diese Pruefung ist nicht optional.

Detection nicht auf Zufall bauen

Eine beliebige DLL oder ein fluechtiger Cache-Dateiname ist keine robuste Detection, auch wenn er in einem Testlauf vorhanden war.

Vertiefung: Detection mit PowerShell

Wenn du hinter den Recipes noch die Denklogik und typische Fehler verstehen willst, passt der bestehende Detection-Artikel direkt dazu.

Artikel lesen

Vertiefung: MEM / SCCM

Detection muss am Ende auch zum Deployment-System passen. Deshalb gehoert der Blick auf MEM und Known Good immer dazu.

Zu MEM / SCCM