Nettoyage de 12 000 appareils en double dans Intune

Le Scénario

Vous avez un appareil enrôlé et utilisé. Vous le réinitialisez pour un test. Après le ré-enrôlement, surprise : Intune affiche deux entrées avec des IDs différents pour le même appareil physique. Ce phénomène se répète à chaque réinstallation ou changement d’utilisateur si le désenrôlement propre n’est pas fait.

Résultat ? Un client s’est retrouvé avec plus de 12 000 doublons. Cela fausse les rapports Power BI et rend les métriques de déploiement de mises à jour totalement illisibles pour la direction.

Qu’est-ce qui définit un appareil en double ?

  • Nom de l’appareil : Peu fiable (noms aléatoires).
  • Numéro de série : Excellent point de départ, sauf quand il ne remonte pas (Android Device Admin).
  • Numéro IMEI : Le top, car unique au monde.
  • Adresse MAC Wi-Fi : Utile, mais difficile à filtrer via Graph.

Logique de suppression

Si une requête filtrée sur le numéro de série ou l’IMEI renvoie plusieurs résultats, seul le plus récent (basé sur la date lastsyncdate) est conservé. Les autres sont considérés comme des doublons.

Étape 1 : Connexion et récupération (Exemple iOS)

Il faut d’abord se connecter avec les permissions DeviceManagementManagedDevices.ReadWrite.All et Device.ReadWrite.All.

# Initialisation des variables (Utilisez un coffre-fort pour le secret !)
$global:tenant = "xxxxxxx"
$global:clientId = "xxxxxxx"
$global:clientSecret = "xxxxxxxx"
$SecuredPassword = ConvertTo-SecureString -String $clientSecret -AsPlainText -Force
$Credential = New-Object System.Management.Automation.PSCredential($clientId, $SecuredPassword)
Connect-MgGraph -TenantId $tenant -ClientSecretCredential $Credential
# Récupération des appareils iOS
$allDevices = @()
$duplicateDevices = @()
$devicesarray = @{}
$nextLink = "https://graph.microsoft.com/beta/devicemanagement/manageddevices?`$filter=operatingsystem eq 'iOS'"
while (![string]::IsNullOrEmpty($nextLink)) {
$response = Invoke-MgGraphRequest -Method GET -Uri "$nextLink"
$allDevices += $response.value
$nextLink = $response.'@odata.nextLink'
}

Étape 2 : Identification des doublons

On parcourt la liste pour isoler les identifiants déjà croisés.

foreach ($device in $allDevices) {
$imei = $device.imei
$serialNumber = $device.serialNumber
$identifier = $null
if ($imei) {
$identifier = $imei
} elseif ($serialNumber -and $serialNumber -ne "0") {
$identifier = $serialNumber
} else { continue }
if ($devicesarray.ContainsKey($identifier)) {
Write-Host "Doublon trouvé : $identifier"
$duplicateDevices += $device
} else {
$devicesarray[$identifier] = $device
}
}

Étape 3 : Suppression (Intune + Entra ID)

Attention : Testez toujours avec un Write-Warning avant d’exécuter le DELETE.

foreach ($duplicate in $duplicateDevices) {
$filterField = if ($duplicate.imei) { "imei" } else { "serialNumber" }
$filterValue = if ($duplicate.imei) { $duplicate.imei } else { $duplicate.serialNumber }
$uri = "https://graph.microsoft.com/beta/devicemanagement/manageddevices?`$filter=$filterField eq '$filterValue'"
$response = Invoke-MgGraphRequest -uri $uri -Method GET
# On trie et on saute le plus récent (Skip 1)
$duplicatesSorted = $response.value | Sort-Object lastsyncdatetime -Descending | Select-Object -Skip 1
foreach ($oldDevice in $duplicatesSorted) {
$intuneId = $oldDevice.id
$azureAdId = $oldDevice.azureADDeviceId
# 1. Suppression Intune
Write-Host "Suppression Intune de : $($oldDevice.deviceName)" -ForegroundColor Yellow
# Invoke-MgGraphRequest -Method DELETE -Uri "https://graph.microsoft.com/beta/devicemanagement/manageddevices/$intuneId"
# 2. Recherche et suppression Entra ID
$uriEntra = "https://graph.microsoft.com/beta/devices?`$filter=deviceid eq '$azureAdId'"
$entraDevice = Invoke-MgGraphRequest -Method GET -Uri $uriEntra
if ($entraDevice.value.id) {
$objId = $entraDevice.value.id
Write-Host "Suppression Entra ID de : $objId" -ForegroundColor Red
# Invoke-MgGraphRequest -Method DELETE -Uri "https://graph.microsoft.com/beta/devices/$objId"
}
}
}

Conclusion

Cette logique s’applique à iOS et Android. Pour Windows, basez-vous uniquement sur le numéro de série. En nettoyant régulièrement ces objets, vous garantissez la fiabilité de vos inventaires et de vos rapports de conformité.

Retrouvez les scripts complets par plateforme sur mon GitHub !

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