Gérer et désactiver en toute sécurité les appareils Windows obsolètes

Je comprends et respecte le fait que les clients avec lesquels je travaille préfèrent une approche plus graduelle, étape par étape, plutôt que de simplement supprimer les appareils obsolètes.

Cela fait sens, car il existe des exigences légales de conservation des appareils dans l’écosystème pendant une certaine période. De plus, une fois qu’un appareil est supprimé, l’action est irréversible.

Après plusieurs discussions, nous sommes parvenus à un compromis avec l’approche suivante :

  1. Récupérer tous les appareils Windows gérés qui ne se sont pas synchronisés depuis 180 jours.
  2. Identifier les objets Entra correspondants.
  3. Désactiver ces appareils dans Entra.
  4. Ajouter les appareils dans un groupe Entra « Locked-Group ».
  5. Appliquer une politique Intune pour bloquer les connexions des utilisateurs sur ces appareils.

L’appareil sera supprimé d’Intune et d’Entra par un autre runbook dédié. Cela ne fait pas partie de cet article ; nous allons nous concentrer uniquement sur la désactivation.

Maintenant, prenez un café, c’est l’heure du script.

Récupérer tous les appareils Windows gérés de plus de 180 jours

Tout d’abord, connectez-vous à Microsoft Graph à l’aide d’une application enregistrée de manière sécurisée. Vous aurez besoin des permissions suivantes :

  • GroupMember.ReadWrite.All – Pour ajouter les appareils au groupe Entra verrouillé.
  • ManagedDevices.Read.All – Pour lire les appareils gérés.
  • Device.ReadWrite.All – Pour lire et désactiver les appareils Entra.

Définissez votre date de référence au bon format. J’ai une confession à faire : je déteste travailler avec les dates.

$filterDate = (Get-Date).AddDays(-180).ToString("yyyy-MM-ddTHH:mm:ssZ")

Maintenant, récupérons nos appareils obsolètes et stockons-les dans un tableau. Assurez-vous d’inclure l’en-tête ConsistencyLevel: eventual dans votre requête et de filtrer exclusivement sur les appareils Windows.

PowerShell

$allDevices = @()
# Création de l'URI API avec le filtre, le ConsistencyLevel est nécessaire pour gérer les dates
$nextlink = "https://graph.microsoft.com/beta/devicemanagement/manageddevices?`$filter=lastSyncDateTime lt $filterdate and operatingSystem eq 'Windows'&`$ConsistencyLevel=eventual"
while (![string]::IsNullOrEmpty($nextLink)) {
$response = Invoke-MgGraphRequest -Method GET -Uri "$nextLink"
$allDevices += $response.value # Ajoute les appareils de cette page
$nextLink = $response.'@odata.nextLink' # Récupère l'URL de la page suivante
Write-Host $nextLink
}

Ajouter chaque appareil au groupe verrouillé

Définissons d’abord l’ID du groupe dans le script :

# ID du groupe où vous souhaitez placer vos appareils
$groupid = "9b7bd32f-7b3c-4ff6-b30d-63e6857fd432"

Ensuite, pour chaque appareil obsolète récupéré via Intune, nous devons trouver son ID d’objet Entra correspondant (nécessaire pour l’ajout à un groupe). Nous l’obtenons en faisant correspondre la propriété azureADDeviceId de l’appareil Intune.

foreach ($device in $alldevices) {
# Récupérer l'ID d'objet Entra
$azureaddeviceid=$device.azureADDeviceId
$urientra = "https://graph.microsoft.com/beta/devices?`$filter=deviceid eq '$azureaddeviceid'"
$request = Invoke-MgGraphRequest -method GET -uri $urientra
$entraobjectid = $request.value.id
# Ajouter l'appareil au groupe
$urigroup="https://graph.microsoft.com/v1.0/groups/$groupid/members/`$ref"
$body = @{
"@odata.id"="https://graph.microsoft.com/v1.0/directoryObjects/{$entraobjectid}"
}
Invoke-MgGraphRequest -method POST -uri $urigroup -Body $body

Désactiver l’appareil dans Entra

Comprenons ce que fait la désactivation d’un appareil avant de l’exécuter :

À ce stade, l’appareil perd son Primary Refresh Token (PRT), ce qui révoque de fait ses accès. Lorsqu’un utilisateur tentera d’accéder à une ressource protégée depuis un appareil désactivé, il rencontrera un message d’erreur d’authentification.

Pour désactiver l’appareil, réglez la propriété accountEnabled sur false.

    # Désactiver l'appareil
    $uridisable="https://graph.microsoft.com/beta/devices/$entraobjectid"
    $bodydisable = @{"accountEnabled"="false"}
    Invoke-MgGraphRequest -method POST -uri $uridisable -Body $bodydisable
}

Note : La désactivation d’appareils via une application enregistrée en mode « application » n’est supportée que pour les appareils Windows.

Empêcher les utilisateurs de se connecter

Pourquoi ajouter les appareils dans un groupe si je les ai déjà désactivés ?

La désactivation suffit à empêcher l’accès aux ressources, mais les clients préfèrent souvent ajouter une couche de sécurité supplémentaire. En ciblant ce groupe avec un profil de configuration Intune utilisant le paramètre Allow local logon, on empêche physiquement toute connexion locale sur la machine.

Dans cette politique, je crée une exception pour l’un de mes comptes de secours (break glass account).

Cibler cette politique sur le groupe des appareils désactivés garantit que personne ne peut ouvrir de session sur l’ordinateur (sauf le compte de secours).

Le client est satisfait car cette approche traite le problème étape par étape, tout en ménageant les utilisateurs qui pourraient être absents pour une longue période (congé maternité, arrêt maladie longue durée, etc.).

Vous pouvez retrouver le script complet sur mon Github personnel.

# Use an Azure Vault for storing your client secret for a secured usage and avoid plain text secret
$global:tenant = "xxxx-xxxx-xxx-xxxx"
$global:clientId = "xxxx-xxxx-xxx-xxxx"
$global:clientSecret = "xxxx-xxxx-xxx-xxxx"
$SecuredPasswordPassword = ConvertTo-SecureString -String $clientSecret -AsPlainText -Force
$ClientSecretCredential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $clientId, $SecuredPasswordPassword
Connect-MgGraph -TenantId $tenant -ClientSecretCredential $ClientSecretCredential
###################################################################################################################
$filterDate = (Get-Date).AddDays(-180).ToString("yyyy-MM-ddTHH:mm:ssZ")
###################################################################################################################
## create array that will contains managed devices filtered
$allDevices = @()
# create the api uri with the filter, consitancy is needed to handle dates
$nextlink = "https://graph.microsoft.com/beta/devicemanagement/manageddevices?`$filter=lastSyncDateTime lt $filterdate and operatingSystem eq 'Windows'&`$ConsistencyLevel=eventual"
while (![string]::IsNullOrEmpty($nextLink)) {
$response = Invoke-MgGraphRequest -Method GET -Uri "$nextLink"
$allDevices += $response.value # Add this page's devices
$nextLink = $response.'@odata.nextLink' # Get the next page's URL
Write-Host $nextLink
}
# Group ID where you want to put your device
$groupid = "9b7bd32f-7b3c-4ff6-b30d-63e6857fd432"
foreach ($device in $alldevices) {
# Get Entra Object ID
$azureaddeviceid=$device.azureADDeviceId
$urientra = "https://graph.microsoft.com/beta/devices?`$filter=deviceid eq '$azureaddeviceid'"
$request = Invoke-MgGraphRequest -method GET -uri $urientra
$entraobjectid = $request.value.id
# Add the device into the group
$urigroup="https://graph.microsoft.com/v1.0/groups/$groupid/members/`$ref"
$body = @{
"@odata.id"="https://graph.microsoft.com/v1.0/directoryObjects/{$entraobjectid}"
}
Invoke-MgGraphRequest -method POST -uri $urigroup -Body $body
# Disable the device
$uridisable="https://graph.microsoft.com/beta/devices/$entraobjectid"
$bodydisable = @{"accountEnabled"="false"}
Invoke-MgGraphRequest -method POST -uri $uridisable -Body $bodydisable
}

Laisser un commentaire

En savoir plus sur Poem to MDM

Abonnez-vous pour poursuivre la lecture et avoir accès à l’ensemble des archives.

Poursuivre la lecture