Shadow IT er den naturlige fienden til et rent programvareinventar. I mitt miljø har brukere med historiske lokaladministrator-rettigheter installert det de selv ønsket—uautoriserte nettlesere, utdaterte bilderedigeringsprogrammer og “kjekke” verktøy. Disse appene ble raskt en hodepine, spesielt når Microsoft Defender for Endpoint flagget dem som End-of-Life (EOL) eller End-of-Support (EOS).

I stedet for å bruke tid på å manuelt bla gjennom apper i portalen, har jeg utviklet en arbeidsflyt som starter med en dyp jakt i Defender og ender med automatisert fjerning via Intune.

Problemet: Shadow IT og Defender-alarmer

Jeg har sett det gang på gang: Defenders sårbarhetshåndtering viser 50 enheter med en utdatert versjon av GIMP eller en tilfeldig nettleser som Yandex. Dette er ikke apper vi har rullet ut; de er “zombie-programvare”—apper som ikke burde være der, som ikke får sikkerhetsoppdateringer, og som skaper unødvendig støy i sikkerhetsrapportene våre.

Steg 1: Jakt i stor skala med KQL

Jeg kaster ikke bort tid på å bla gjennom programvareoversikten i portalen app for app. I stedet bruker jeg KQL (Kusto Query Language) i Advanced Hunting for å få umiddelbar oversikt over hele flåten.

Jeg har utviklet dette skriptet for å kategorisere apper etter risiko (Høy/Medium/Lav), koble dem mot kjente sårbarheter (CVE-er) og beregne en Exposure Score. Dette er metoden jeg bruker for å bestemme hva som må fjernes umiddelbart og hva som kan vente.

Du finner mine komplette KQL-skript her: unwanted-apps.kql og eos-and-unwanted-summary.kql.

// MIN UNWANTED APP HUNTER - Eksempel på liste
let HighRiskApps = dynamic(["utorrent", "anydesk", "app_eksempel_1"]);
let MediumRiskApps = dynamic(["steam", "bluestacks", "app_eksempel_2"]);
let LowRiskApps = dynamic(["ccleaner", "app_eksempel_3"]);
let UnwantedRegex = strcat(@"(?i)(", strcat_array(HighRiskApps, "|"), "|", strcat_array(MediumRiskApps, "|"), "|", strcat_array(LowRiskApps, "|"), ")");

// Inventar & CVE Korrelering
DeviceTvmSoftwareInventory
| where isnotempty(SoftwareName)
| extend MatchTarget = tolower(strcat(coalesce(SoftwareVendor, ""), " ", SoftwareName))
| where MatchTarget matches regex UnwantedRegex
| join kind=leftouter (
    DeviceTvmSoftwareVulnerabilities
    | summarize CveCount = dcount(CveId), MaxCvss = max(todouble(CvssScore)) by DeviceId, SoftwareName
) on DeviceId, SoftwareName
| extend ExposureScore = case(MatchTarget matches regex @"(?i)(utorrent|bittorrent|anydesk)", 80.0, 40.0) // Min logikk for vekting
| project DeviceName, SoftwareName, SoftwareVersion, CveCount, MaxCvss, ExposureScore
| order by ExposureScore desc

Dette KQL-skriptet gir meg “hitlisten”. Når jeg har identifisert målene via spørringen, går jeg videre til automatisering.

Steg 2: Automatisere fjerningen med Intune

Når KQL-jakten har identifisert målene, bruker jeg en “Master Script”-tilnærming i Intune Proactive Remediations. Jeg lager ikke egne pakker for hver enkelt app; jeg bruker en sentralisert liste basert på funnene fra KQL.

Strategien

Systemet bruker to skript: et Detection-skript som identifiserer om programvareen fra KQL-jakten finnes på enheten, og et Remediation-skript som fjerner den.

Jeg målretter disse “zombiene” ved hjelp av tre metoder:

  1. Register-GUID-er: Finne den spesifikke MSI- eller installasjons-GUID-en.
  2. Wildcard i registeret: Finne nøkler som HKLM:\... \Uninstall\Opera*.
  3. Filstier: Sjekke etter spesifikke kjørbare filer.

Viktigst av alt er at skriptene mine håndterer per-bruker-installasjoner ved å skanne HKEY_USERS (HKU). Dette sikrer at apper som skjuler seg i brukerens lokale profil ikke slipper unna.

Implementering: Master-skriptene

Jeg har lagt ut de fullstendige skriptene i mitt GitHub-repositorium.

1. Deteksjonsskriptet (Detection)

Skriptet går gjennom en $zombieTargets-matrise. Hvis et mål identifisert i KQL-jakten blir funnet på en enhet, avsluttes det med Exit 1, noe som trigger remedieringen.

2. Remedieringsskriptet (Remediation)

Når det trigges, prøver skriptet en lydløs avinstallering via registeret. Hvis det feiler (noe som ofte skjer med “hjemmesnekrede” installasjoner), stopper det tvangsmessig alle kjørende prosesser og sletter programmappen fullstendig.

Verifisering: Slutte sirkelen

Etter at remedieringen er rullet ut, sjekker jeg resultatene slik:

  1. Intune-konsollen: Overvåker “Issue fixed”-status i Proactive Remediations.
  2. Lokale logger: Sjekker C:\ProgramData\Eriteach\Logs\ hvis jeg trenger å se hvorfor en spesifikk avinstallering feilet.
  3. Defender for Endpoint: Kjører KQL-spørringen på nytt etter noen dager for å se eksponeringsscoren falle etter hvert som zombie-appene forsvinner.

Oppsummering

Jeg lar ikke uautorisert og utdatert programvare blåse opp sårbarhetsrapportene mine. Ved å starte med en KQL-jakt for å identifisere risikoen, og følge opp med Intune-automatisering, holder jeg miljøet rent uten manuelt arbeid.