In meiner täglichen Arbeit mit Microsoft Intune versuche ich, so viel wie möglich mit den integrierten Funktionen zu lösen. Weniger Komplexität bedeutet oft weniger Probleme. Trotzdem stosse ich regelmässig auf Situationen, in denen die Standardfunktionen nicht ausreichen. Dann kommen Custom Compliance Policies in Intune ins Spiel.

Gerade wenn Du Drittanbieter-Tools wie Antivirus oder Schwachstellen-Scanner verwendest, brauchst Du manchmal mehr Flexibilität. Intune bietet dafür eine starke, wenn auch etwas versteckte Lösung.

Table of Contents

Warum Du Custom Compliance Policies (möglicherweise) brauchst

Die Standardrichtlinien in Intune prüfen Dinge wie Betriebssystem-Version, Verschlüsselung oder Passwortvorgaben. Aber was ist, wenn Du folgendes brauchst:

  • Prüfen, ob ein Antivirus-Service läuft
  • Sicherstellen, dass ein bestimmter Registry-Eintrag existiert
  • Nachschauen, ob eine Datei auf dem Gerät vorhanden ist

In diesen Fällen bringen Dich Custom Compliance Policies weiter. Du kannst eigene Prüfungen mit PowerShell definieren und mit einer JSON-Datei auswerten.

Hinweis: Du brauchst Intune Plan 2 oder eine Enterprise-Lizenz. Die Funktion basiert auf der Remediation-Engine von Intune.

So funktioniert Custom Compliance in Intune

Eine benutzerdefinierte Compliance-Policy besteht immer aus zwei Teilen:

  • Einem PowerShell-Skript zur Prüfung.
  • Einer JSON-Datei, die definiert, wie die Ergebnisse bewertet und dargestellt werden.

In der JSON-Datei legst Du folgende Parameter fest:

  • SettingName: Name der Einstellung (muss mit dem PowerShell-Ausgabe-Key übereinstimmen)
  • DataType: Typ des Werts
    • Boolean
    • Int64
    • Double
    • String
    • DateTime
    • Version
  • Operator: Vergleichsmethode
    • IsEquals
    • NotEquals
    • GreaterThan
    • GreaterEquals
    • LessThan
    • LessEquals
  • Operand: Vergleichswert
  • MoreInfoUrl: Link für Benutzer mit nicht-konformen Geräten
  • RemediationStrings: Anleitungen für Benutzer (Sprache, Titel, Beschreibung)

Und das ganze sieht dann für den Endbenutzer so aus:

So fügst Du eine Custom Compliance Policy hinzu

  1. Erstelle ein PowerShell-Skript, das Deine Prüfung durchführt.
  2. Geh im Intune-Portal zu Geräte > Compliance-Richtlinien > Richtlinien.
  3. Klicke auf + Richtlinie erstellen und wähle die Plattform (z. B. Windows 10 und neuer).
  4. Unter Compliance-Einstellungen wählst Du Benutzerdefinierte Compliance.
  5. Lade das PowerShell-Skript hoch und definiere die Bewertungsregeln (z. B. True = konform, False = nicht konform).
  6. Weise die Richtlinie einer Benutzer- oder Gerätegruppe zu.

Deploy and Test

  • Assign the policy to a small test group first to ensure it works as expected.
  • Monitor compliance results in Intune under Devices > Monitor > Device compliance.

PowerShell & JSON: Ein generisches Beispiel

Bevor wir uns die eigentlichen Beispiele für Custom Compliance Policies anschauen, zeige ich hier den Aufbau anhand eines generischen Beispiels. Es werden zwei Optionen betrachtet, die über JSON validiert werden.

PowerShell Skript

Das Skript unten zeigt, wie Du mehrere Checks gleichzeitig durchführen kannst:

# Example script with multiple outputs
$PSlogicOutput1 = $true  # Replace with logic for Check1
$PSlogicOutput2 = 3     # Replace with logic for Check2

$output = @{
    Check1 = $PSlogicOutput1
    Check2 = $PSlogicOutput2
}

return $output | ConvertTo-Json -Compress

Validation JSON

Und hier das passende JSON dazu:

{
   "Rules": [
       {
          "SettingName": "Check1",
          "Operator": "IsEquals",
          "DataType": "Boolean",
          "Operand": "true",
          "MoreInfoUrl": "https://scloud.work/custom-compliance-windows-intune",
          "RemediationStrings": [
             {
                "Language": "en_US",
                "Title": "Check1 is not compliant, instead it is {ActualValue}.",
                "Description": "Make sure you enable XYZ or contact your support organisation."
             }
          ]
       },
        {
           "SettingName": "Check2",
           "Operator": "IsEquals",
           "DataType": "Int64",
           "Operand": "1",
           "MoreInfoUrl": "https://scloud.work/custom-compliance-windows-intune",
           "RemediationStrings": [
              {
                 "Language": "en_US",
                 "Title": "Check2 is not compliant, instead it is {ActualValue}.",
                 "Description": "Make sure you enable XYZ or contact your support organisation."
               }
           ]
        }
    ]
}

Mit diesem Ansatz kannst du einfach eine oder mehre logiken prüfen.

Drei praktische Use Cases

Die folgenden Beispiele zeigen praxisnahe Anwendungen von Custom Compliance Policies mit PowerShell-Skripten und JSON-Validierungen. So kannst Du spezifische Compliance-Anforderungen in Deiner Umgebung abbilden.

Prüfen, ob ein Dienst/Serivice läuft

Mit dieser Prüfung kannst Du sicherstellen, dass ein bestimmter Windows-Dienst (z. B. Windows Update, ein Antivirus-Agent oder ein EDR-Service) aktiv ist. Dies ist besonders nützlich für Drittanbieterlösungen wie CrowdStrike, SentinelOne oder Rapid7.

PowerShell Script

The script below checks if the Windows Update service (wuauserv) is running and outputs True (compliant) or False (non-compliant):

# Check if the Windows Update service is running
$ServiceName = "wuauserv"
$Service = Get-Service -Name $ServiceName -ErrorAction SilentlyContinue

$output = @{
    WindowsUpdateService = if($Service.Status -eq "Running"){ $true }else{ $false }
}

return $output | ConvertTo-Json -Compress

Validation JSON

{
   "Rules": [
       {
          "SettingName": "WindowsUpdateService",
          "Operator": "IsEquals",
          "DataType": "Boolean",
          "Operand": "true",
          "MoreInfoUrl": "https://scloud.work/service-check",
          "RemediationStrings": [
             {
                "Language": "en_US",
                "Title": "The WindowsUpdateService is not running",
                "Description": "Restart your computer and if the error persists, contact your support organisation."
             }
          ]
       }
   ]
}

Checking for a Registry Key

In manchen Fällen hinterlässt ein Schwachstellenscanner oder ein anderes Sicherheitstool einen bestimmten Registry-Eintrag als Beleg dafür, dass der Scan abgeschlossen wurde oder eine bestimmte Version installiert ist. Diese Methode eignet sich gut zur Validierung solcher Zustände.

PowerShell Script

# Check a registry key
$RegistryPath = "HKLM:\SOFTWARE\CustomSecurity"
$propertyName = "Version"

$output = @{
    RegistryCheck = (Get-ItemProperty -Path $RegistryPath -Name $propertyName).$propertyName
}

return $output | ConvertTo-Json -Compress

Validation JSON

{
   "Rules": [
       {
          "SettingName": "RegistryCheck",
          "Operator":"IsEquals",
          "DataType":"Int64",
          "Operand":1,
          "MoreInfoUrl": "https://scloud.work/registry-check",
          "RemediationStrings": [
             {
                "Language": "en_US",
                "Title": "RegistryCheck is not compliant, instead of 1 it is {ActualValue}.",
                "Description": "Contact your support organisation."
             }
          ]
       }
   ]
}

Checking for a Specific File

Manchmal ist die Existenz einer Datei auf dem Gerät ein Nachweis dafür, dass eine Konfiguration korrekt durchgeführt wurde. Mit diesem Check kannst Du beispielsweise sicherstellen, dass eine Konfigurationsdatei für eine Drittanbieter-App vorhanden ist.

PowerShell Skript

# Check if a specific file exists
$FilePath = "C:\ProgramData\CustomApp\config.xml"

$output = @{
    FileCheck = if (Test-Path $FilePath) { $true } else { $false }
}

return $output | ConvertTo-Json -Compress

Validation JSON

{
   "Rules": [
       {
          "SettingName": "FileCheck",
          "Operator": "IsEquals",
          "DataType": "Boolean",
          "Operand": "true",
          "MoreInfoUrl": "https://scloud.work/file-check",
          "RemediationStrings": [
             {
                "Language": "en_US",
                "Title": "FileCheck is not compliant, instead it is {ActualValue}.",
                "Description": "Ensure the required file is present or contact your support organisation."
             }
          ]
       }
   ]
}

Prüfintervall optimieren

Intune führt Custom Compliance Scripts standardmässig alle 8 Stunden aus. Manchmal brauchst Du aber schnellere Reaktionen. Du kannst mit diesem Script einen manuellen Sync auslösen:

# Trigger a custom compliance sync
Start-Process -FilePath "C:\Program Files (x86)\Microsoft Intune Management Extension\Microsoft.Management.Services.IntuneWindowsAgent.exe" `
    -ArgumentList "intunemanagementextension://synccompliance"

Hinweis: Dieses Skript synchronisiert ausschliesslich Custom Compliance Policies und deren Status. Es entspricht nicht dem Klick auf "Zugriff überprüfen" in der Company Portal App.

Automatisieren mit einer geplanten Aufgabe

Damit das automatisch läuft, kannst Du eine geplante Aufgabe erstellen, die z. B. alle 60 Minuten synchronisiert:

# Schedule the compliance sync task
$repeat = (New-TimeSpan -Minutes 60)
$trigger = New-JobTrigger -Once -At (Get-Date).Date -RepeatIndefinitely -RepetitionInterval $repeat

$User = "SYSTEM"
$Action = New-ScheduledTaskAction -Execute "powershell.exe" `
    -Argument "-ex bypass -encodedcommand UwB0AGEAcgB0AC0AUAByAG8AYwBlAHMAcwAgAC0ARgBpAGwAZQBQAGEAdABoACAAIgBDADoAXABQAHIAbwBnAHIAYQBtACAARgBpAGwAZQBzACAAKAB4ADgANgApAFwATQBpAGMAcgBvAHMAbwBmAHQAIABJAG4AdAB1AG4AZQAgAE0AYQBuAGEAZwBlAG0AZQBuAHQAIABFAHgAdABlAG4AcwBpAG8AbgBcAE0AaQBjAHIAbwBzAG8AZgB0AC4ATQBhAG4AYQBnAGUAbQBlAG4AdAAuAFMAZQByAHYAaQBjAGUAcwAuAEkAbgB0AHUAbgBlAFcAaQBuAGQAbwB3AHMAQQBnAGUAbgB0AC4AZQB4AGUAIgAgAC0AQQByAGcAdQBtAGUAbgB0AEwAaQBzAHQAIAAiAGkAbgB0AHUAbgBlAG0AYQBuAGEAZwBlAG0AZQBuAHQAZQB4AHQAZQBuAHMAaQBvAG4AOgAvAC8AcwB5AG4AYwBjAG8AbQBwAGwAaQBhAG4AYwBlACIACgAKAAoACgA="

Register-ScheduledTask -TaskName "Custom Compliance Sync" -Trigger $Trigger -User $User -Action $Action -Force
Set-ScheduledTask -TaskName "Custom Compliance Sync" -Settings $(New-ScheduledTaskSettingsSet -StartWhenAvailable -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries)

So stellst Du sicher, dass die Prüfung öfter läuft und bei Bedarf schneller auf "nicht konform" wechselt.

Conditional Access sinnvoll einsetzen

Ein grosser Vorteil von Custom Compliance Policies: Sie funktionieren perfekt mit Conditional Access. Wenn Dein Gerät einen Check nicht besteht, wird es als nicht konform markiert. Dadurch blockierst Du den Zugriff auf Unternehmensressourcen – bis das Problem gelöst ist.

So schützt Du Daten zusätzlich, ohne den Benutzer zu überfordern.

Fazit

Custom Compliance Policies in Intune sind keine Standardlösung für alles – aber sie sind extrem hilfreich, wenn Du spezifische Anforderungen hast. Nutze sie dann, wenn die Bordmittel nicht reichen.

Erstelle eigene Regeln, teste sie gründlich und sorge für klare Kommunikation mit Deinen Benutzern. So erreichst Du nicht nur bessere Sicherheit, sondern auch mehr Transparenz.

Alle Scripts aus diesem Beitrag findest Du auf meinem GitHub: