Wofuer Recipes gut sind
Sie geben dir ein klares Startmuster fuer haeufige Detection-Faelle, ohne dass du jedes Mal bei null anfangen musst.
Detection
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.
Sie geben dir ein klares Startmuster fuer haeufige Detection-Faelle, ohne dass du jedes Mal bei null anfangen 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
Ein gutes Muster fuer EXE-basierte Anwendungen ohne saubere MSI-Identitaet.
$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
Geeignet fuer per-machine Installationen mit stabiler Hersteller-Registry.
$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
Praktisch, wenn DisplayVersion sauber gepflegt ist und direkt zur Anwendung gehoert.
$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
Wichtig fuer Tools, die nicht maschinenweit, sondern benutzerbezogen installieren.
$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
Nur sinnvoll, wenn du wirklich ein MSI und dessen Produktlogik sauber verstanden hast.
$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
Wenn ein einzelnes Artefakt nicht stabil genug ist, kann eine Kombination aus Datei und Registry sinnvoll sein.
$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
Wenn die Datei stabil ist, die Version sauber gepflegt wird und der Installationspfad nicht bei jedem Benutzer oder Sprachpaket wechselt.
Wenn Herstellerwerte verlaesslicher sind als Dateiversionen oder wenn per-user Installationen ausgewertet werden muessen.
Wenn es wirklich ein MSI ist und ProductCode oder UpgradeCode bewusst genutzt werden. Nicht jede Update-Logik macht denselben Code dauerhaft brauchbar.
Wenn ein einzelnes Artefakt zu fragil ist. Kombinationen sind legitim, aber nur dann, wenn beide Bedingungen fachlich begruendet sind.
Das gleiche Skript kann unter Admin, SYSTEM und Benutzerkontext unterschiedliche Ergebnisse liefern. Diese Pruefung ist nicht optional.
Eine beliebige DLL oder ein fluechtiger Cache-Dateiname ist keine robuste Detection, auch wenn er in einem Testlauf vorhanden war.
Wenn du hinter den Recipes noch die Denklogik und typische Fehler verstehen willst, passt der bestehende Detection-Artikel direkt dazu.
Artikel lesenDetection muss am Ende auch zum Deployment-System passen. Deshalb gehoert der Blick auf MEM und Known Good immer dazu.
Zu MEM / SCCM