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
- So funktioniert Custom Compliance in Intune
- PowerShell & JSON: Ein generisches Beispiel
- Drei praktische Use Cases
- Prüfintervall optimieren
- Conditional Access sinnvoll einsetzen
- Fazit
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)
Language
: Defibniere die Sprache (e.g.,de-DE
).
(Alle Sprache Codes findest du hier: https://learn.microsoft.com/en-us/windows-hardware/manufacture/desktop/available-language-packs-for-windows?view=windows-11)Title
: Eine Kurzbeschriebung des Grund der Complaince prüfung ({ActualValue}
).Description
: Erweiterte Beschriebugn für den Benutzer.
Und das ganze sieht dann für den Endbenutzer so aus:
So fügst Du eine Custom Compliance Policy hinzu
- Erstelle ein PowerShell-Skript, das Deine Prüfung durchführt.
- Geh im Intune-Portal zu Geräte > Compliance-Richtlinien > Richtlinien.
- Klicke auf + Richtlinie erstellen und wähle die Plattform (z. B. Windows 10 und neuer).
- Unter Compliance-Einstellungen wählst Du Benutzerdefinierte Compliance.
- Lade das PowerShell-Skript hoch und definiere die Bewertungsregeln (z. B. True = konform, False = nicht konform).
- 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.
Credits: Danke an Rudy Ooms für die Methode zum erzwingen der Compliance-Synchronisation: https://call4cloud.nl/custom-compliance-policy-intune/#6_Scheduling_the_Custom_Compliance_Check
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: