Hosts-Datei mittels Intune anpassen

Um den Kinderschutz mittels hosts-Datei reibungslos umkehrbar (deinstallierbar) zu machen, ist der beste Weg über Intune die Erstellung einer Win32-App (.intunewin Datei) statt einer reinen Skript-Lösung. Eine Win32-App hat nämlich im Gegensatz zu einfachen Skripten zwingend Deinstallations-Befehle und lässt sich leicht durch die Zuweisung ("Deinstallieren") aktivieren.

Folgende Skripte werden benötigt:

  1. install.ps1: Dieses Skript prüft zuerst, ob es bereits ein Backup unter hosts.backup gibt. Falls nein, legt es das Backup der aktuell aktiven Datei an und kopiert dann die Kinderschutz-Datei hinein.
  2. uninstall.ps1: Wenn du einem PC in Intune künftig den Status "Deinstallieren" zuweist, wird dieses Skript ausgeführt. Es spielt die hosts.backup wieder zurück. (Falls aus irgendeinem Grund kein Backup greifbar ist oder eine Kinderschutz-Datei gesichert worden ist, schreibt es aus Sicherheitsgründen die Standard-Windows-hosts-Datei zurück).
  3. detect.ps1: Intune braucht für Win32-Apps eine Möglichkeit regelmäßig zu prüfen, ob die Installation erfolgreich war und das Feature "wirklich da" ist.

1. Vorbereitung des Ordners

Kopiere deine angepasste hosts-Datei (ohne Dateiendung) in einen neuen Ordner HostsApp, in dem sich die folgenden ps1-Dateien befinden:

install.ps1

$hostsPath = "$env:SystemRoot\System32\drivers\etc\hosts"
$backupPath = "$env:SystemRoot\System32\drivers\etc\hosts.backup"  

# 1. Erstelle ein Backup der originalen hosts-Datei, falls noch keines existiert
if (-not (Test-Path $backupPath)) {
    Copy-Item -Path $hostsPath -Destination $backupPath -Force
}

# 2. Kopiere die angepasste hosts-Datei aus dem Paketverzeichnis ins System
Copy-Item -Path .\hosts -Destination $hostsPath -Force

uninstall.ps1

$hostsPath = "$env:SystemRoot\System32\drivers\etc\hosts"
$backupPath = "$env:SystemRoot\System32\drivers\etc\hosts.backup"
$useFallback = $true

if (Test-Path $backupPath) {
    $backupContent = Get-Content -Path $backupPath -Raw
    if ($backupContent -notmatch "# Jugendgefährdente Inhalte") {
        # 1. Stelle das Backup wieder her
        Copy-Item -Path $backupPath -Destination $hostsPath -Force
        # Optional: Backup-Datei entfernen
        Remove-Item -Path $backupPath -Force
        $useFallback = $false
    }
}

if ($useFallback) {
    # 2. Fallback, falls kein Backup existiert oder es gesperrte Inhalte enthält: Standard Windows hosts-Datei wiederherstellen

    $defaultHosts = @"
# Copyright (c) 1993-2009 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to host names. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding host name.
# The IP address and the host name should be separated by at least one
# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a '#' symbol.
#
# For example:
#
#      102.54.94.97     rhino.acme.com          # source server
#       38.25.63.10     x.acme.com              # x client host

# localhost name resolution is handled within DNS itself.
#   127.0.0.1       localhost
#   ::1             localhost
"@
    Set-Content -Path $hostsPath -Value $defaultHosts -Force
}

detect.ps1

$hostsPath = "$env:SystemRoot\System32\drivers\etc\hosts"
if (Test-Path $hostsPath) {
    # Wir suchen nach einem spezifischen String, der NUR in der neuen hosts vorkommt.
    # Du solltest in deiner neuen hosts-Datei einfach ganz oben einen Kommentar wie "# MDM_SCHUELER_HOSTS_V1" hinzufügen.
    $content = Get-Content $hostsPath -Raw

    if ($content -match "# MDM_SCHUELER_HOSTS_V1") {
        # Wenn der String gefunden wird, ist die App "installiert"
        Write-Output "Installed"
        exit 0
    }
}

# Wenn die Datei nicht existiert oder der String nicht gefunden wurde: nicht installiert
exit 1

hosts-Datei

Lade die benötigten Inhalte von GitHub - Sinfonietta/hostfiles: A collection of category-specific host files herunter und speichere sie im gleichen Ordner wie die Skript-Dateien als hosts-Datei ohne Dateiendung.

Tip

Füge in deiner modifizierten hosts-Datei in der allerersten Zeile den Kommentar # MDM_SCHUELER_HOSTS_V1 ein. Genau nach dieser Zeile sucht nämlich das detect.ps1 Skript, um zu erkennen, dass "deine" hosts-Datei aktiv im System ist.

2. Als intunewin verpacken

Lade das Microsoft Win32 Content Prep Tool herunter (falls noch nicht geschehen) und führe es als Administrator aus:

3. Hochladen ins Intune Portal

Lade die generierte .intunewin Datei unter Apps > Windows > Hinzufügen (Typ: Windows-App (Win32)) hoch.

Trage hierbei folgende Befehle ein:

Installationsbefehl:

%systemroot%\sysnative\windowspowershell\v1.0\powershell.exe -ExecutionPolicy Bypass -WindowStyle Hidden -File install.ps1

Deinstallationsbefehl:

%systemroot%\sysnative\windowspowershell\v1.0\powershell.exe -ExecutionPolicy Bypass -WindowStyle Hidden -File uninstall.ps1

(Hinweis: Der Aufruf über sysnative ist wichtig, da Intune als 32-Bit-Agent agiert und sonst in SysWOW64 landet, wo die hosts Datei nicht liegt. sysnative zwingt das Skript in den 64-Bit-Kontext).

4. Erkennungsregeln (Detection Rules) anlegen

Unter dem Reiter "Erkennungsregeln" im Setup für die App wählst du:

5. Deployment / Zuweisung

Jetzt weist du die App in Intune unter Erforderlich (Required) einfach der Gruppe mdm_schuelergeraete (Name anpassen) zu.

Sollte diese Schutzmaßnahme jemals wieder rückgängig gemacht werden müssen, nimmst du diese Gruppe bei Erforderlich heraus und legst die Gruppe (oder auch ein Problem-Gerät einzeln) unter Deinstallieren (Uninstall) hinein. Intune führt dann verlässlich sofort die uninstall.ps1 aus und aktiviert das Backup!

Siehe auch: Kindersicheren DNS-Server auf Intune einrichten