top of page

Windows Autopilot Offline

  • Foto van schrijver: Pascal
    Pascal
  • 21 jan
  • 5 minuten om te lezen

Bijgewerkt op: 23 apr

Windows Autopilot Offline
Windows Autopilot Offline

Introductie

Windows Autopilot biedt organisaties een efficiënte manier om nieuwe apparaten direct vanuit de doos te configureren en gereed te maken voor gebruik. Hoewel de offline modus met een Autopilot JSON-bestand ideaal lijkt voor scenario's zonder internettoegang, brengt het ook enkele belangrijke aandachtspunten met zich mee. In deze blog duiken we dieper in op het gebruik van het Windows Autopilot Offline JSON-bestand, de voordelen ervan, maar vooral de valkuilen en best practices om problemen te voorkomen. Zo zorg je ervoor dat jouw implementatie soepel verloopt en optimaal presteert.


Windows Autopilot Offline Scenarios: Wanneer kies je voor een Offline JSON-bestand?

Het gebruik van een Windows Autopilot Offline JSON-bestand kan in specifieke situaties een uitstekende keuze zijn. Het biedt een oplossing voor uitdagingen waarbij de standaard online methodiek niet direct toepasbaar is. Denk bijvoorbeeld aan de volgende scenario’s:


  • Geen afspraken met een leverancier: Wanneer er geen afspraken zijn gemaakt met een hardware leverancier om Autopilot Hashes vooraf te uploaden naar de tenant.


  • Gebrek aan rechten: Bij nieuwe of bestaande apparaten die niet zijn geregistreerd in Microsoft Intune Autopilot, en waarbij de uitrol wordt uitgevoerd door iemand zonder rechten om de hashes online naar de tenant te uploaden.


  • Versnellen van het proces: Om eindgebruikers sneller van start te laten gaan door direct een uitrol te doen met het juiste Autopilot-profiel, zonder te wachten totdat een apparaat volledig geregistreerd is in Microsoft Intune Autopilot.


  • Andere specifieke redenen: Zoals implementaties in omgevingen met beperkte internettoegang of wanneer tijds kritische uitrol vereist is.


Waarom voorzichtig zijn met het gebruik van Windows Autopilot Offline JSON?

Een Windows Autopilot Offline JSON-bestand bevat waardevolle informatie zoals de Tenant ID en domeinsuffix. Hoewel informatie zoals de Tenant ID ook via andere bronnen te achterhalen is (bijvoorbeeld via websites zoals WhatIsMyTenantID), brengt het gebruik van deze JSON-bestanden specifieke risico’s met zich mee.


De risico's: Onbevoegde toegang en validatie-uitdagingen

  • Onbevoegde apparaat registratie: Als een Autopilot Offline JSON-bestand in verkeerde handen valt, bestaat het risico dat onbevoegde apparaten zich als legitieme bedrijfsapparaten registreren in Microsoft Intune.


  • Moeilijke onderscheiding: Een apparaat dat via een gestolen of misbruikt JSON-bestand wordt geregistreerd, kan lastig te onderscheiden zijn van een geldig apparaat, vooral zonder strikte validatieprocessen.


  • Beveiliging van de omgeving: Hoewel gebruikers nog steeds moeten inloggen met geldige Microsoft 365-accounts, kan een kwaadwillende met toegang tot het JSON-bestand en inloggegevens extra schade aanrichten. Dit kan leiden tot potentieel gevaarlijke "supply chain"-achtige aanvallen.


Maatregelen voor extra beveiliging bij Windows Autopilot Offline JSON

Hieronder bespreken we enkele methoden om de uitrol via Autopilot Offline extra te beveiligen en risico’s te minimaliseren.


Beveiliging via Intune instellingen

  • Blokkeer persoonlijke apparaten in Intune:

    Configureer Microsoft Intune zodat persoonlijke apparaten zich niet kunnen inschrijven.

    • Hoewel dit geen directe impact heeft op apparaten die een Offline Autopilot-profiel gebruiken (deze worden automatisch als 'Corporate' gemarkeerd), voorkomt het wel dat onbevoegde persoonlijke apparaten zich aanmelden buiten Autopilot-scenario’s.

    • Instelling: Ga in Intune naar Enrollment restrictions en blokkeer persoonlijke apparaten.

      Intune restrict personal devices
      Block Personal Owned Devices

Conditional Access policies

Met Conditional Access kan je aanvullende beveiligingslagen toepassen, specifiek gericht op apparaat registratie.

  • Register or join devices configureren: Stel Conditional Access in voor de User Actions optie Register or join devices en vereis altijd Multi-Factor Authentication (MFA).

    • Dit dwingt gebruikers om MFA te doorlopen voordat een apparaat geregistreerd wordt, waardoor het risico op onbevoegde apparaat registraties significant wordt verminderd.

    • Waarom belangrijk? Dit voorkomt dat kwaadwillende eenvoudig toegang krijgen met slechts het JSON-bestand en inloggegevens.



  • Blokkeren van Offline Autopilot-profielen: Omdat een Offline Autopilot-profiel een specifieke naam genereert, kan je Conditional Access configureren om:

    • Het gebruik van dit profiel volledig te blokkeren als het niet nodig is.

    • Alleen apparaten die dit profiel gebruiken vanaf vertrouwde locaties (bijv. een kantoor met vast IP-adres) te accepteren.



Windows Autopilot downloaden

Op de Microsoft-website wordt gedetailleerd uitgelegd hoe je de Windows Autopilot JSON-bestanden kunt downloaden via deze link.


Let op: voor het correct downloaden van de JSON-bestanden is PowerShell 7 vereist. Je kunt dit installeren via het volgende commando met Winget:

winget install --id Microsoft.PowerShell --source winget
Install PowerShell 7 with WinGet
Installeren van PowerShell 7 met WinGet

Gebruik vervolgens onderstaand PowerShell-script om de benodigde modules te installeren en de JSON-bestanden voor Autopilot te downloaden met PowerShell 7:

Powershell Script

# PowerShell Script for Downloading Windows Autopilot Profiles

# Description:

# This script installs the necessary modules for interacting with Windows Autopilot and Microsoft Graph,

# connects to the tenant, retrieves the Autopilot profiles, and saves them as JSON files into a local directory.

# The script is designed to be run in PowerShell 7.

# Prerequisites:

# PowerShell 7.x must be installed on your system.

# Make sure that you have the required permissions in Microsoft Intune to read the Autopilot profiles.


# Define constants

$logFolder = "C:\Autopilot"

$logFile = "$logFolder\AutopilotDownload.log"


# Ensure log folder exists

if (-not (Test-Path $logFolder)) {

New-Item -ItemType Directory -Path $logFolder -Force

}


# Logging function

function Write-Log {

param (

[string]$message

)

$timestamp = (Get-Date).ToString("yyyy-MM-dd HH:mm:ss")

Add-Content -Path $logFile -Value "$timestamp - $message"

}


Write-Log "Script started."


try {

Write-Log "Setting ExecutionPolicy to RemoteSigned..."

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process -Force


# Define required modules and minimum versions

$requiredModules = @(

@{ Name = 'WindowsAutopilotIntune'; MinVersion = '5.4.0' },

@{ Name = 'Microsoft.Graph.Groups' },

@{ Name = 'Microsoft.Graph.Authentication' },

@{ Name = 'Microsoft.Graph.Identity.DirectoryManagement' }

)


foreach ($module in $requiredModules) {

$name = $module.Name

$minVersion = $module.MinVersion


$isInstalled = Get-Module -ListAvailable -Name $name | Where-Object {

-not $minVersion -or $_.Version -ge [Version]$minVersion

}


if (-not $isInstalled) {

Write-Log "Installing module $name..."

if ($minVersion) {

Install-Module -Name $name -MinimumVersion $minVersion -Force -Scope CurrentUser -ErrorAction Stop

} else {

Install-Module -Name $name -Force -Scope CurrentUser -ErrorAction Stop

}

} else {

Write-Log "Module $name is already installed, skipping..."

}


Write-Log "Importing module $name..."

Import-Module -Name $name -ErrorAction Stop

}


# Connect to Microsoft Graph

Write-Log "Connecting to Microsoft Graph..."

Connect-MgGraph -Scopes "Device.ReadWrite.All", "DeviceManagementManagedDevices.ReadWrite.All", "DeviceManagementServiceConfig.ReadWrite.All", "Domain.ReadWrite.All", "Group.ReadWrite.All", "GroupMember.ReadWrite.All", "User.Read" -NoWelcome -ErrorAction Stop


# Retrieve Autopilot profiles

Write-Log "Retrieving Autopilot profiles..."

$autopilotProfiles = Get-AutopilotProfile -ErrorAction Stop


foreach ($profile in $autopilotProfiles) {

$safeDisplayName = $profile.displayName -replace '[\\\/:*?"<>|]', '_'

$profileDirectory = Join-Path -Path $logFolder -ChildPath $safeDisplayName


if (-not (Test-Path $profileDirectory)) {

Write-Log "Creating directory $profileDirectory..."

New-Item -ItemType Directory -Path $profileDirectory -Force | Out-Null

} else {

Write-Log "Directory $profileDirectory already exists."

}


Write-Log "Saving profile $safeDisplayName as JSON..."

$jsonContent = $profile | ConvertTo-AutopilotConfigurationJSON

$jsonPath = Join-Path -Path $profileDirectory -ChildPath "AutopilotConfigurationFile.json"

$jsonContent | Set-Content -Path $jsonPath -Encoding Ascii

}


Write-Host "✅ Autopilot profiles downloaded successfully to $logFolder"

Write-Log "Script completed successfully."


} catch {

Write-Log "❌ Error occurred: $_"

Write-Host "❌ An error occurred. Check the log file at $logFile for details."

}



Rechten voor Autopilot Offline profielen
Rechten benodigd voor het downloaden van Autopilot profielen

Entra Dynamische Groepen

Bij het gebruik van Windows Autopilot Offline-profielen, is het goed om te weten dat, zoals vermeld onder de sectie Conditional Access, een specifiek Enrollment Profile Name wordt gehanteerd. Deze waarde kan ook worden gebruikt in combinatie met Entra Dynamische groepen. Het is echter belangrijk te weten dat Windows Autopilot Offline altijd de naam OfflineAutopilotprofile-<correlator ID> gebruikt. De correlator ID, die overeenkomt met de ZtdCorrelationId, is terug te vinden in het Autopilot JSON-bestand en is gekoppeld aan het Autopilot-profiel.


Als je gebruik maakt van Entra Dynamische groepen waarbij de query is geconfigureerd op de naam van het Autopilot-profiel, moet je er rekening mee houden dat ook de waarde OfflineAutopilotprofile-<correlator ID> in de query wordt opgenomen.


Bronnen


Opmerkingen


bottom of page