Vous tentez de retirer un appareil Intune avec Invoke‑MgRetireDeviceManagementManagedDevice et obtenez une erreur malgré des droits élevés ? Voici une analyse claire, les causes probables et un pas‑à‑pas éprouvé pour réussir l’opération via Microsoft Graph PowerShell.
Vue d’ensemble du problème
Un administrateur Intune exécute la cmdlet Invoke‑MgRetireDeviceManagementManagedDevice (module Microsoft.Graph) afin de retirer un smartphone ou un PC Windows géré. Malgré des privilèges d’administration importants et quel que soit l’identifiant fourni (GUID de l’appareil ou ObjectId), l’appel échoue. Une hypothèse fréquente est que la commande serait « en bêta ». En réalité, ce n’est pas le cas : l’action retire correspond à l’API Microsoft Graph v1.0 et la cmdlet est stable. Les erreurs proviennent presque toujours d’un ou plusieurs prérequis non respectés (portée d’autorisations, type d’identifiant, licence Intune, version de module).
Ce que fait réellement la commande Retire
L’action retire demande à Intune de désinscrire l’appareil du MDM et de supprimer les données et profils professionnels déployés par l’organisation, tout en conservant les données personnelles de l’utilisateur. Concrètement :
- iOS/iPadOS/Android : suppression des apps et profils gérés, retrait de la gestion MDM.
- Windows : dissolution de l’inscription MDM, retrait des configurations et certificats gérés. L’appareil n’est plus géré mais n’est pas réinitialisé.
À la différence de Wipe (réinitialisation d’usine selon l’OS), Retire est une action non destructive pour les données personnelles.
Causes les plus probables de l’échec
Si la cmdlet échoue systématiquement, vérifiez prioritairement les points suivants :
- Portée d’autorisations insuffisante : la portée (scope) minimale à demander lors de
Connect‑MgGraphestDeviceManagementManagedDevices.PrivilegedOperations.All. Sans ce scope, l’appel échoue même pour un Administrateur général. - Mauvais identifiant : la cmdlet attend
-ManagedDeviceId <GUID>, c’est‑à‑dire l’Id de l’objet managedDevice renvoyé parGet‑MgDeviceManagementManagedDevice. Ne pas passer l’ObjectId Entra ID (Azure AD) de l’appareil ni le DeviceId côté Entra. - Absence de licence Intune : le tenant doit disposer d’au moins une licence Intune active. En l’absence de licence, l’API renvoie un échec générique.
- Module PowerShell obsolète : les versions 1.x du SDK Graph PowerShell ont connu des anomalies sur certaines actions d’appareil. Utilisez Microsoft.Graph 2.x ou supérieur.
- Contexte d’authentification inadapté : en mode délégué, un consentement administrateur peut être nécessaire la première fois que vous demandez la portée ci‑dessus. En mode application, des autorisations applicatives équivalentes doivent être accordées et validées par l’administrateur.
Résumé des vérifications essentielles
| Point à vérifier | Détails clés |
|---|---|
| État de la cmdlet | Invoke‑MgRetireDeviceManagementManagedDevice est stable et s’appuie sur l’API Graph v1.0 (retire). Elle n’est pas limitée à une préversion. |
| Autorisations minimales | Exiger la portée DeviceManagementManagedDevices.PrivilegedOperations.All. Sans ce scope, l’appel échoue avec des 403/Authorization_RequestDenied. |
| Licence | Le tenant doit disposer d’au moins une licence Intune active. À défaut, l’API peut renvoyer un échec générique. |
| Paramètre obligatoire | Utiliser -ManagedDeviceId <GUID>, qui correspond au champ Id du managedDevice (obtenu via Get‑MgDeviceManagementManagedDevice). Ne pas confondre avec l’ObjectId Entra ID. |
| Consentement admin | En délégué, un consentement administrateur peut être requis lors de la première demande de la portée ci‑dessus. |
| Version du module | Vérifier et mettre à jour en 2.x : Get‑InstalledModule Microsoft.Graph*. Les 1.x anciennes comportent des bugs connus côté actions d’appareil. |
| Diagnostic recommandé | Connect‑MgGraph -Scopes "DeviceManagementManagedDevices.PrivilegedOperations.All" Get‑MgDeviceManagementManagedDevice -Filter "deviceName eq 'NomAppareil'" → récupérer Id Invoke‑MgRetireDeviceManagementManagedDevice -ManagedDeviceId <Id> -Verbose Ajouter -Debug pour l’analyse fine du message d’erreur. |
| Contournement | Tester Wipe via Invoke‑MgWipeDeviceManagementManagedDevice pour isoler un problème de droits/état. |
Diagnostic pas à pas
Vérifier le module et le profil
# Lister les versions installées
Get-InstalledModule Microsoft.Graph* | Sort-Object Name, Version | Format-Table Name, Version
# Mettre à jour si nécessaire
Update-Module Microsoft.Graph -Force
# Forcer l'utilisation de l'API v1.0
Select-MgProfile -Name "v1.0"
Ouvrir une session Graph avec la bonne portée
# Session déléguée (utilisateur)
Connect-MgGraph -Scopes "DeviceManagementManagedDevices.PrivilegedOperations.All"
# Vérifier le contexte
(Get-MgContext).Scopes
Si la portée attendue n’apparaît pas, reconnectez‑vous en incluant explicitement DeviceManagementManagedDevices.PrivilegedOperations.All. En mode application, l’authentification se fait sans scope interactif mais requiert que l’application ait l’autorisation applicative correspondante et que le consentement admin soit accordé.
Contrôler la présence d’une licence Intune active
# Vérifier rapidement la présence d'une (ou plusieurs) SKU Intune/EMS/M365
$skus = Get-MgSubscribedSku
$hasIntune = $skus.SkuPartNumber -match 'INTUNE|EMS|SPE|M365'
if (-not $hasIntune) { Write-Warning "Aucune licence Intune/EMS/M365 détectée sur le tenant. L'appel retire peut échouer." }
Identifier correctement l’appareil et son ManagedDeviceId
# 1) Par nom d'appareil : attention aux doublons
$devs = Get-MgDeviceManagementManagedDevice -Filter "deviceName eq 'MON-DEVICE-01'" -ConsistencyLevel eventual -Count variable:total
$devs | Select-Object Id, deviceName, operatingSystem, userDisplayName, azureAdDeviceId | Format-Table -AutoSize
# 2) Par Azure AD DeviceId (si vous l'avez depuis Entra ID)
$azId = '00000000-0000-0000-0000-000000000000'
$dev = Get-MgDeviceManagementManagedDevice -Filter "azureADDeviceId eq '$azId'"
$dev | Select-Object Id, deviceName, managementAgent, managementState
La valeur attendue par la cmdlet Invoke‑MgRetireDeviceManagementManagedDevice est Id (GUID du managedDevice). N’utilisez pas l’ObjectId de l’appareil coté Entra ID et ne mélangez pas non plus avec deviceId d’Entra.
Lancer le retire avec verbosité et journalisation
$id = $dev.Id # ou $devs[0].Id si plusieurs résultats
Invoke-MgRetireDeviceManagementManagedDevice -ManagedDeviceId $id -Verbose -Debug
Le retour attendu est souvent « vide » (succès 204). Sur échec, exploitez le flux -Debug pour récupérer le code d’état HTTP et le message Graph : ils sont déterminants pour la suite.
Exemples d’erreurs et interprétations rapides
| Message / Code | Cause probable | Correctif |
|---|---|---|
403 Forbidden / Authorization_RequestDenied ou Insufficient privileges | La portée DeviceManagementManagedDevices.PrivilegedOperations.All n’est pas présente (délégué) ou pas consentie (application). | Reconnecter avec la bonne portée, ou accorder l’autorisation applicative et consentir au niveau tenant. |
404 NotFound | -ManagedDeviceId incorrect ou appareil non géré par Intune. | Rechercher l’appareil via Get‑MgDeviceManagementManagedDevice et récupérer le bon Id. |
400 BadRequest | Paramètre mal formé (GUID invalide) ou profil Graph non v1.0. | Vérifier Select‑MgProfile "v1.0" et le format du GUID. |
| Échec générique sans détail | Tenant sans licence Intune, ou service Intune indisponible temporairement. | Vérifier les SKU du tenant, réessayer et consulter l’intégrité du service. |
Scripts PowerShell prêts à l’emploi
Script de diagnostic et retrait en mode délégué
param(
[Parameter(Mandatory)]
[string] $DeviceName
)
# 1) Profil et module
Select-MgProfile -Name "v1.0"
if (-not (Get-Module -ListAvailable Microsoft.Graph)) {
Write-Host "Module Microsoft.Graph absent. Installation recommandée : Install-Module Microsoft.Graph -Scope CurrentUser"
}
# 2) Connexion avec la portée requise
Connect-MgGraph -Scopes "DeviceManagementManagedDevices.PrivilegedOperations.All"
$ctx = Get-MgContext
if ($ctx.Scopes -notcontains "DeviceManagementManagedDevices.PrivilegedOperations.All") {
throw "La portée DeviceManagementManagedDevices.PrivilegedOperations.All n'est pas accordée."
}
# 3) Vérif licence (indicative)
$skus = Get-MgSubscribedSku
if (-not ($skus.SkuPartNumber -match 'INTUNE|EMS|SPE|M365')) {
Write-Warning "Aucune licence Intune/EMS/M365 détectée (contrôle informatif)."
}
# 4) Recherche de l'appareil
$devs = Get-MgDeviceManagementManagedDevice -Filter "deviceName eq '$DeviceName'" -ConsistencyLevel eventual -Count variable:count
if (-not $devs) { throw "Aucun appareil nommé $DeviceName dans Intune." }
if ($devs.Count -gt 1) {
Write-Host "Plusieurs appareils trouvés :"
$devs | Select-Object Id, deviceName, operatingSystem, userDisplayName | Format-Table -AutoSize
throw "Nom ambigu. Affiner la recherche (AzureADDeviceId, user, OS...)."
}
$dev = $devs | Select-Object -First 1
Write-Host "Retrait de $($dev.deviceName) (Id=$($dev.Id))..."
# 5) Retire
try {
Invoke-MgRetireDeviceManagementManagedDevice -ManagedDeviceId $dev.Id -Verbose -Debug
Write-Host "Demande de retrait envoyée. Surveillez l'état de l'appareil lors du prochain check-in."
}
catch {
Write-Error "Échec du retire : $($_.Exception.Message)"
throw
}
Script en mode application (App registration)
Lorsque vous utilisez une application (client secret/certificat), assurez‑vous que l’application possède l’autorisation application équivalente à DeviceManagementManagedDevices.PrivilegedOperations.All et qu’un administrateur a accordé le consentement. Exécution :
$TenantId = "<TENANT-ID>"
$ClientId = "<APP-ID>"
$Thumb = "<CERT-THUMBPRINT>"
# Connexion applicative : pas de scopes interactifs, mais des permissions applicatives déjà consenties
Connect-MgGraph -TenantId $TenantId -ClientId $ClientId -CertificateThumbprint $Thumb
Select-MgProfile -Name "v1.0"
# Récupération de l'Id managé
$dev = Get-MgDeviceManagementManagedDevice -Filter "deviceName eq 'MON-DEVICE-01'"
Invoke-MgRetireDeviceManagementManagedDevice -ManagedDeviceId $dev.Id -Verbose
Appel REST brut (secours) via Microsoft Graph PowerShell
Si la cmdlet échoue pour une raison liée au SDK, vous pouvez appeler directement l’endpoint REST v1.0. Le résultat attendu est un 204 No Content en cas de succès :
$id = $dev.Id
$uri = "https://graph.microsoft.com/v1.0/deviceManagement/managedDevices/$id/retire"
Invoke-MgGraphRequest -Method POST -Uri $uri
Retire, Wipe, Delete : que choisir ?
| Action | Effet principal | Impact utilisateur | Scénarios typiques |
|---|---|---|---|
| Retire | Désinscrit du MDM, supprime données/profils gérés, conserve les données personnelles. | Faible : l’appareil reste utilisable. | BYOD quitté, départ collaborateur, recyclage léger. |
| Wipe | Réinitialisation (factory reset) selon l’OS. | Élevé : l’appareil revient à l’état d’origine. | Perte/vol, restitution, réaffectation complète. |
| Delete | Supprime uniquement l’enregistrement dans Intune. | Nul sur l’appareil : aucune action distante. | Nettoyage de l’inventaire, doublons, appareils déjà reformatés. |
Pièges fréquents et bonnes pratiques
- Confusion d’identifiants : ManagedDeviceId ≠ Azure AD DeviceId ≠ ObjectId. Obtenez toujours
IdviaGet‑MgDeviceManagementManagedDevice. - Scopes implicites : être Administrateur général ne suffit pas. Graph impose des scopes/permissions explicites.
- Check‑in requis : l’action est prise en compte au prochain passage de l’appareil. Un appareil hors ligne peut retarder l’exécution.
- Version du SDK : privilégiez Microsoft.Graph 2.x et le profil
v1.0. Évitez les mélanges de profils. - Autopilot : Retire n’efface pas l’enregistrement Autopilot. Gérez‑le séparément si nécessaire.
Check‑list opérationnelle
- Mettre à jour le module Microsoft.Graph (2.x mini) et fixer le profil
v1.0. - Se connecter avec
DeviceManagementManagedDevices.PrivilegedOperations.All(ou autorisation applicative équivalente consentie). - Vérifier la présence d’au moins une licence Intune dans le tenant.
- Récupérer l’
Iddu managedDevice depuis Intune/Graph. - Exécuter
Invoke‑MgRetireDeviceManagementManagedDevice -ManagedDeviceId <Id> -Verbose -Debug. - Contrôler les journaux Intune et l’état de l’appareil au prochain check‑in.
FAQ express
La cmdlet est‑elle en préversion ?
Non. Elle cible l’API v1.0 et est considérée comme stable.
Le rôle Administrateur général suffit‑il ?
Pas dans Graph. Vous devez obtenir la portée DeviceManagementManagedDevices.PrivilegedOperations.All (délégué) ou l’autorisation applicative associée, avec consentement admin.
Pourquoi mon ObjectId ne marche pas ?
Parce que la cmdlet attend l’Id Intune (managedDevice). Récupérez‑le via Get‑MgDeviceManagementManagedDevice.
Que faire si Retire échoue encore ?
Tester Wipe pour valider les droits, vérifier la licence Intune, recontrôler le scope et utiliser l’appel REST brut en secours.
Exemple de script « de A à Z » (nom, AzureADDeviceId, ou user)
function Get-ManagedDeviceBy {
param(
[Parameter(Mandatory=$true)]
[ValidateSet('Name','AzureAdDeviceId','UserPrincipalName')]
[string] $By,
[Parameter(Mandatory=$true)]
[string] $Value
)
Select-MgProfile -Name "v1.0" | Out-Null
switch ($By) {
'Name' { $filter = "deviceName eq '$Value'" }
'AzureAdDeviceId' { $filter = "azureADDeviceId eq '$Value'" }
'UserPrincipalName'{ $filter = "userPrincipalName eq '$Value'" }
}
Get-MgDeviceManagementManagedDevice -Filter $filter -ConsistencyLevel eventual -Count variable:count
}
function Invoke-RetireDevice {
param(
[Parameter(Mandatory)]
[string] $ManagedDeviceId
)
try {
Invoke-MgRetireDeviceManagementManagedDevice -ManagedDeviceId $ManagedDeviceId -Verbose
Write-Host "Retrait demandé pour $ManagedDeviceId"
}
catch {
Write-Error ("Retrait échoué ({0}) : {1}" -f $*.Exception.HResult, $*.Exception.Message)
throw
}
}
# Connexion
Select-MgProfile -Name "v1.0"
Connect-MgGraph -Scopes "DeviceManagementManagedDevices.PrivilegedOperations.All" | Out-Null
# Exemple : par nom
$devs = Get-ManagedDeviceBy -By Name -Value "MON-DEVICE-01"
if ($devs.Count -gt 1) {
$devs | Select Id, deviceName, operatingSystem, userPrincipalName | Format-Table -AutoSize
throw "Plusieurs correspondances : précisez AzureAdDeviceId ou UPN."
}
Invoke-RetireDevice -ManagedDeviceId $devs[0].Id
Bonnes pratiques sécurité
- Utilisez des comptes de service ou des applications avec le minimum d’autorisations nécessaires (principe du moindre privilège).
- Consignez toutes les actions sensibles (retire, wipe) dans un journal d’audit interne (tickets, change log).
- Automatisez avec des groupes de sécurité et des étiquettes Intune pour réduire les erreurs humaines.
- Validez systématiquement l’
Idde l’appareil avant d’exécuter des actions destructives.
Conclusion
Le problème ne vient pas d’un statut bêta de la cmdlet. Dans la quasi‑totalité des cas, l’échec de Invoke‑MgRetireDeviceManagementManagedDevice s’explique par une portée insuffisante, un identifiant erroné, une licence Intune absente ou un module obsolète. En appliquant la procédure de diagnostic ci‑dessus, en demandant explicitement DeviceManagementManagedDevices.PrivilegedOperations.All et en fournissant le ManagedDeviceId exact, l’opération de retrait aboutit de manière fiable.
Astuce pour aller plus loin : standardisez vos scripts de gestion Intune dans un module maison (Company.Intune.Tools) et imposez une vérification automatique des prérequis (profil, scope, licence, version du SDK) avant toute action.

