Le problème n'est pas le prix, c'est le silence
Une licence IA non utilisée se comporte exactement comme une licence utilisée : elle est attribuée, elle est facturée, elle se renouvelle toute seule. Rien dans le processus normal ne la signale.
Ce n'est ni un défaut du produit, ni de la négligence. La facture est juste, l'attribution est juste, la personne existe bien. Seul l'usage manque, et l'absence d'usage n'est un événement pour personne : aucune alerte ne se déclenche, aucun rapport ne remonte de lui-même.
C'est ce qui la rend si durable. Un serveur inutilisé finit par être remarqué, parce que quelqu'un fait le ménage dans une console. Une licence inutilisée n'apparaît dans aucun ménage : elle traverse les renouvellements sans que personne n'ait jamais eu à décider de la garder.
Activée n'est pas active : Microsoft le dit lui-même
Le vocabulaire officiel du rapport d'utilisation Microsoft 365 distingue deux populations, et tout le sujet tient dans l'écart entre les deux :
- Utilisateurs activés : les personnes qui détiennent une licence Copilot sur la période.
- Utilisateurs actifs : celles qui ont réellement déclenché une fonctionnalité Copilot.
Microsoft publie même le ratio des deux sous le nom de taux d'utilisateurs actifs. Autrement dit, l'éditeur vous donne l'outil pour mesurer ce que vous lui payez pour rien.
Un détail compte beaucoup dans la définition de l'activité : ouvrir le volet Copilot dans Word ne compte pas comme un usage actif. Il faut une action intentionnelle, par exemple envoyer une requête. C'est une bonne nouvelle pour la sincérité de la mesure, et une mauvaise pour les taux d'adoption annoncés en comité.
Six situations, qui ne se traitent pas de la même façon
« Licence dormante » recouvre des cas très différents. Les confondre mène soit à sous-estimer le gisement, soit à retirer son outil à quelqu'un qui s'en sert.
| Situation | Ce que ça veut dire | Quoi en faire |
|---|---|---|
| Compte désactivé | Un départ dont la licence n'a jamais été retirée | Retrait immédiat, aucun arbitrage à avoir |
| Jamais activée | Attribuée, jamais ouverte une seule fois | Réaffecter en priorité |
| Aucune requête sur la période | L'application a été ouverte, mais rien n'a été demandé | Presque équivalent à « jamais activée » |
| Inactive depuis plus de 30 jours | Un usage réel, puis un abandon | Comprendre pourquoi avant de retirer |
| Usage marginal | Trois jours d'activité ou moins sur la période | Le cas le plus délicat, voir plus bas |
| Active | Usage régulier | Ne pas y toucher |
Les deux premières lignes sont du gain net, sans discussion possible. Commencez par là : c'est rapide, sans risque, et ça donne un chiffre immédiat à poser sur la table.
La licence jamais activée vient presque toujours du même mécanisme. On achète un volume pour obtenir une remise, on attribue largement pour ne pas avoir à gérer les demandes une par une, et on n'y revient jamais. Il n'y a aucun sujet humain : personne ne perdra un outil dont personne ne s'est servi.
La licence d'un ex-salarié est le cas le plus embarrassant, parce que l'information existe déjà dans l'entreprise. Le compte a été désactivé dans l'annuaire, l'extension IA est restée attachée à l'abonnement, et elle continue d'être facturée jusqu'à l'échéance annuelle. Simplement, personne n'a rapproché l'annuaire de la facture.
La licence abandonnée après l'essai demande un arbitrage, parce qu'elle raconte autre chose : soit l'outil ne correspond pas au métier de la personne, soit la formation a manqué. Retirer la licence règle le problème budgétaire. Comprendre pourquoi elle a été abandonnée règle le problème de fond, et évite de refaire la même erreur sur la vague suivante.
L'usage marginal demande du discernement. Trois jours d'activité sur quatre-vingt-dix, cela peut être quelqu'un qui n'a pas adopté l'outil. Cela peut aussi être quelqu'un qui l'utilise ponctuellement pour une tâche à forte valeur, quatre fois par an. Un juriste qui dépouille un contrat complexe une fois par trimestre justifie peut-être sa licence mieux qu'un utilisateur quotidien qui reformule des messages. Le chiffre pose la question, il n'y répond pas.
Ce que ça représente en euros
Prenons un parc de 250 licences Microsoft 365 Copilot au tarif entreprise officiel de 26,00 € HT par personne et par mois en paiement annuel, soit 312,00 € par personne et par an et 78 000 € HT par an au total.
| Taux de dormance | Licences dormantes | Gaspillage annuel |
|---|---|---|
| 20 % | 50 | 15 600 € |
| 30 % | 75 | 23 400 € |
| 40 % | 100 | 31 200 € |
Ces trois lignes ne sont pas choisies au hasard : elles encadrent les seuls repères publics disponibles. EPC Group, cabinet de conseil spécialisé sur l'écosystème Microsoft, avance 30 à 40 % de licences non utilisées dans les quatre-vingt-dix jours suivant un déploiement généralisé, et 15 à 20 % quand l'entreprise repère et réattribue les licences inactives chaque mois.
À prendre pour ce que c'est : une observation de terrain, pas une étude, publiée par un acteur qui vend aussi des audits de licences. Aucune mesure indépendante n'existe aujourd'hui sur cette part.
Votre taux dépend de la façon dont les licences ont été distribuées, et il varie fortement d'une direction à l'autre dans la même entreprise. C'est le seul chiffre qui vous serve à quelque chose.
Deux façons d'obtenir un ordre de grandeur
Demander cinq chiffres, sans aucun outil
Si vous n'avez pas accès au centre d'administration, ces cinq questions à l'équipe qui administre Microsoft 365 suffisent à cadrer le sujet :
- Combien de licences IA sont attribuées aujourd'hui, toutes directions confondues ?
- Combien de personnes sont actives sur les trente derniers jours ?
- Combien n'ont jamais enregistré la moindre activité depuis leur attribution ?
- Combien sont attachées à un compte désactivé dans l'annuaire ?
- Quelle est la date exacte de la prochaine échéance de renouvellement ?
Les questions 1 et 2 se lisent directement dans le rapport d'utilisation. Les questions 3 et 4 demandent un rapprochement entre deux sources. La question 5 détermine votre marge de manœuvre : une licence ne se rend pas n'importe quand, et rater la fenêtre de renouvellement coûte une année entière.
Lire le rapport soi-même, en cinq minutes
Le rôle Lecteur de rapports dans Entra ID suffit, et il n'y a pas une ligne de code à écrire.
- Ouvrez le centre d'administration Microsoft 365.
- Allez dans Rapports, puis Utilisation, puis le rapport d'usage Microsoft 365 Copilot.
- Comparez le nombre d'utilisateurs actifs au nombre de licences attribuées, sur trente jours puis sur quatre-vingt-dix.
L'écart entre les deux, multiplié par votre coût annuel par licence, vous donne un premier chiffre : imparfait, mais défendable.
Ses limites disent le reste du travail. Il ne distingue pas « a ouvert une fois » de « utilise tous les jours ». Il ne détecte pas les comptes désactivés qui portent encore une licence. Et, dans la plupart des entreprises, il ne vous dira pas qui.
Le piège principal : vos rapports sont anonymisés par défaut
Depuis le 1er septembre 2021, Microsoft masque par défaut les noms dans tous les
rapports d'usage, et les remplace par des chaînes du type
E58EEF6A6BBD3D0293CB306D24A42057.
Conséquence directe : tant que ce réglage est actif, vous ne pouvez pas relier un usage à une personne. Vous saurez quelle part du parc est inactive, sans savoir qui la compose. Le rapport ne permet alors de décider de rien.
Le réglage se trouve dans le centre d'administration, sous Paramètres, puis Paramètres de l'organisation, puis Services, puis Rapports. C'est la case qui masque les noms d'utilisateurs, de groupes et de sites dans tous les rapports (« Conceal user, group, and site names in all reports » dans la console anglaise) : il faut la décocher.
Trois choses à savoir avant de le faire.
- Il faut être administrateur général. Le rôle Lecteur de rapports permet de lire les rapports, pas de lever le masquage. Dans beaucoup d'organisations, la personne qui mène l'audit n'est donc pas celle qui peut le débloquer.
- Le changement s'applique à tous les rapports du tenant, pas seulement à Copilot : Teams, SharePoint, OneDrive, Exchange, Viva Engage, groupes, utilisateurs actifs. Vous démasquez tout.
- C'est une décision de protection des données, pas un réglage technique. Si votre organisation a maintenu ce masquage volontairement, la personne qui suit ces sujets chez vous a son mot à dire avant qu'on le lève.
Notre position, pour être clair : ce réglage se lève le temps de l'audit et se rétablit après. C'est une décision qui vous revient, pas à un outil.
Sortir la liste, licence par licence
Le rapport de Microsoft s'exporte très bien tout seul, et il est juste. Le problème n'est pas là : il ne sait répondre qu'à une question sur trois.
Il sait ce qui s'est passé dans Copilot. Il ne sait pas qui a quitté l'entreprise, il ne sait pas qui détient quelle offre quand plusieurs coexistent, et il ne sait pas dans quel service travaille la personne. Ces trois informations sont dans votre annuaire, à côté, dans une autre console. Aucune des deux ne va chercher l'autre.
| La question | Rapport d'usage | Annuaire Entra ID |
|---|---|---|
| Cette licence a-t-elle servi, et combien ? | oui | non |
| Le compte est-il encore actif ? | non | oui |
| Dans quel service travaille la personne ? | non | oui |
| Quelle offre Copilot est détenue ? | non | oui |
C'est exactement le mécanisme décrit plus haut à propos des ex-salariés : l'information existe déjà dans l'entreprise, elle est simplement rangée en deux endroits que personne ne rapproche. La licence d'un compte désactivé est le cas le plus rentable et le seul sans arbitrage, et c'est précisément celui que le rapport d'usage ne peut pas vous donner.
Le script ci-dessous ne va donc chercher aucune donnée nouvelle. Il fait la jointure, et il en tire la classification : une ligne par licence Copilot attribuée, avec la personne, son service, l'état de son compte, son dernier usage, le nombre de requêtes soumises, et laquelle des six situations elle relève.
Il est en lecture seule. Il ne retire aucune licence et ne modifie aucun réglage du tenant, y compris celui du masquage : il le lit, et il s'arrête si les noms sont encore masqués plutôt que de produire un fichier faux.
Prérequis : le module Microsoft.Graph
(Install-Module Microsoft.Graph -Scope CurrentUser), le rôle Lecteur de
rapports dans Entra ID, et cinq permissions Graph en lecture,
Reports.Read.All, User.Read.All, Organization.Read.All,
AuditLog.Read.All et ReportSettings.Read.All. La colonne « dernière
connexion » demande en plus une licence Entra ID P1 ou P2 ; sans elle, le
script tourne quand même et laisse la colonne vide.
<#
Audit-CopilotLicenses.ps1
Licences Microsoft 365 Copilot attribuees, croisees avec l'usage reel.
LECTURE SEULE : ce script ne retire aucune licence et ne modifie aucun
reglage du tenant.
Ecrit sans caracteres accentues a dessein : un .ps1 sans BOM ouvert par
Windows PowerShell 5.1 les rendrait illisibles.
#>
[CmdletBinding()]
param(
# Periode d'agregation. La version 2 du rapport accepte D7, D28, D90, D180.
# Attention : elle n'accepte PAS D30, contrairement a la version 1.
[ValidateSet('D7', 'D28', 'D90', 'D180')]
[string]$Period = 'D90',
[string]$OutputPath = ".\copilot-licences-dormantes.csv"
)
$ErrorActionPreference = 'Stop'
# --- 1. Connexion, en lecture seule --------------------------------------
Connect-MgGraph -Scopes 'User.Read.All', 'Organization.Read.All',
'Reports.Read.All', 'AuditLog.Read.All', 'ReportSettings.Read.All' -NoWelcome
# --- 2. Le masquage des noms est-il actif ? ------------------------------
# Actif par defaut depuis le 1er septembre 2021. Tant qu'il l'est, la colonne
# "User Principal Name" du rapport contient un condensat et non une adresse :
# le rapprochement echoue en silence et TOUT LE MONDE ressort dormant. On
# s'arrete plutot que de produire un fichier faux.
if ((Get-MgAdminReportSetting).DisplayConcealedNames) {
Write-Warning @"
Les noms sont masques dans les rapports d'usage de ce tenant.
Le rapport ne peut pas etre rapproche des comptes : arret avant de produire
un fichier trompeur.
Pour lever le masquage (role administrateur general requis) :
Centre d'administration M365 > Parametres > Parametres de l'organisation
> Services > Rapports > decocher la case qui masque les noms.
Le reglage s'applique a TOUS les rapports du tenant. Pensez a le retablir.
"@
return
}
# --- 3. Quelles offres Copilot dans ce tenant ? --------------------------
# Aucun GUID en dur : il existe plusieurs references Copilot (extension
# entreprise, Copilot Business, formules groupees).
$CopilotSkus = Get-MgSubscribedSku -All |
Where-Object { $_.SkuPartNumber -match 'COPILOT' }
if (-not $CopilotSkus) {
Write-Host "Aucune offre Copilot dans ce tenant." -ForegroundColor Yellow
return
}
foreach ($Sku in $CopilotSkus) {
Write-Host (" {0} : {1} attribuees / {2} achetees" -f
$Sku.SkuPartNumber, $Sku.ConsumedUnits, $Sku.PrepaidUnits.Enabled)
}
# --- 4. Les comptes qui portent ces licences -----------------------------
# signInActivity exige Entra ID P1/P2 et ne se combine pas toujours avec un
# filtre : on tente avec, on retombe sans plutot que d'echouer.
$Champs = 'Id,DisplayName,UserPrincipalName,AccountEnabled,Department'
$Porteurs = [System.Collections.Generic.List[object]]::new()
foreach ($Sku in $CopilotSkus) {
$Filtre = "assignedLicenses/any(s:s/skuId eq $($Sku.SkuId))"
try {
$Comptes = Get-MgUser -All -ConsistencyLevel eventual -CountVariable n `
-Filter $Filtre -Property "$Champs,SignInActivity"
}
catch {
Write-Warning "signInActivity illisible (licence Entra ID P1/P2 ?). Colonne laissee vide."
$Comptes = Get-MgUser -All -ConsistencyLevel eventual -CountVariable n `
-Filter $Filtre -Property $Champs
}
foreach ($C in $Comptes) {
$Porteurs.Add([PSCustomObject]@{
UserPrincipalName = $C.UserPrincipalName
DisplayName = $C.DisplayName
Department = $C.Department
AccountEnabled = $C.AccountEnabled
Sku = $Sku.SkuPartNumber
LastSignIn = $C.SignInActivity.LastSuccessfulSignInDateTime
})
}
}
Write-Host ("{0} licences Copilot attribuees au total." -f $Porteurs.Count)
# --- 5. Le rapport d'usage, en version 2 ---------------------------------
# La v1.0 de l'API renvoie un CSV : c'est /beta qui renvoie du JSON. On ecrit
# donc le flux sur disque et on le relit. Avantage annexe : un fichier n'est
# pas pagine, il n'y a pas de page suivante a oublier.
# version='v2' ajoute les deux colonnes qui manquent a la v1 : le nombre de
# requetes soumises et le nombre de jours reellement actifs.
$Temp = Join-Path ([System.IO.Path]::GetTempPath()) "copilot-usage-$(Get-Random).csv"
$Uri = "https://graph.microsoft.com/v1.0/copilot/reports/" +
"getMicrosoft365CopilotUsageUserDetail(period='$Period',version='v2')"
try {
Invoke-MgGraphRequest -Uri $Uri -Method GET -OutputFilePath $Temp
$Usage = Import-Csv -Path $Temp
}
catch {
Write-Warning "Rapport d'usage illisible : $_"
Write-Warning "Verifiez le role attribue et la permission Reports.Read.All."
return
}
# Intitules de colonnes de la version 2, tels que documentes par Microsoft.
$COL_UPN = 'User Principal Name'
$COL_DERNIER = 'Last Activity Date'
$COL_PROMPTS = 'Prompts submitted for all apps'
$COL_JOURS = 'Active Usage Days for all apps'
foreach ($Col in @($COL_UPN, $COL_DERNIER, $COL_PROMPTS, $COL_JOURS)) {
if ($Usage -and $Col -notin $Usage[0].PSObject.Properties.Name) {
Write-Warning "Colonne absente du rapport : $Col."
Write-Warning "Microsoft a renomme une colonne, la classification serait fausse."
return
}
}
$ParUpn = @{}
foreach ($Ligne in $Usage) {
if ($Ligne.$COL_UPN) { $ParUpn[$Ligne.$COL_UPN.ToLower()] = $Ligne }
}
Remove-Item $Temp -ErrorAction SilentlyContinue
# --- 6. Croiser les deux -------------------------------------------------
$Aujourdhui = Get-Date
$Rapport = [System.Collections.Generic.List[object]]::new()
foreach ($P in $Porteurs) {
$U = $ParUpn[$P.UserPrincipalName.ToLower()]
$Dernier = $null
$Requetes = 0
$Jours = 0
if ($U) {
if ($U.$COL_DERNIER) { $Dernier = [datetime]$U.$COL_DERNIER }
if ($U.$COL_PROMPTS) { $Requetes = [int]$U.$COL_PROMPTS }
if ($U.$COL_JOURS) { $Jours = [int]$U.$COL_JOURS }
}
$Depuis = if ($Dernier) { [math]::Round(($Aujourdhui - $Dernier).TotalDays) } else { $null }
$Statut =
if (-not $P.AccountEnabled) { 'Compte desactive' }
elseif (-not $Dernier) { 'Jamais activee' }
elseif ($Requetes -eq 0) { 'Aucune requete sur la periode' }
elseif ($Depuis -gt 30) { 'Inactive depuis plus de 30 jours' }
elseif ($Jours -le 3) { 'Usage marginal' }
else { 'Active' }
$Rapport.Add([PSCustomObject]@{
UserPrincipalName = $P.UserPrincipalName
DisplayName = $P.DisplayName
Department = $P.Department
Sku = $P.Sku
AccountEnabled = $P.AccountEnabled
LastSignIn = $P.LastSignIn
DernierUsage = $Dernier
JoursDepuisUsage = $Depuis
Requetes = $Requetes
JoursActifs = $Jours
Statut = $Statut
})
}
# --- 7. Synthese et export ----------------------------------------------
# Deux totaux, pas un seul : ce qui se recupere sans discussion n'est pas de
# meme nature que ce qui demande un arbitrage.
$Rapport | Group-Object Statut | Sort-Object Count -Descending | ForEach-Object {
Write-Host (" {0,-34} {1,4}" -f $_.Name, $_.Count)
}
$GainNet = @('Compte desactive', 'Jamais activee')
$AArbitrer = @('Aucune requete sur la periode',
'Inactive depuis plus de 30 jours',
'Usage marginal')
Write-Host ("`n{0} licences a recuperer sans arbitrage, {1} a examiner, sur {2} attribuees." -f
($Rapport | Where-Object { $_.Statut -in $GainNet }).Count,
($Rapport | Where-Object { $_.Statut -in $AArbitrer }).Count,
$Rapport.Count) -ForegroundColor Yellow
$Rapport |
Sort-Object Statut, @{ Expression = 'JoursDepuisUsage'; Descending = $true } |
Export-Csv -Path $OutputPath -NoTypeInformation -Encoding UTF8
Write-Host "Rapport exporte : $OutputPath"Sans argument, il analyse les quatre-vingt-dix derniers jours. La période et le fichier de sortie se changent :
.\Audit-CopilotLicenses.ps1
.\Audit-CopilotLicenses.ps1 -Period D28 -OutputPath "C:\audit\copilot-aout.csv"
Une remarque sur les périodes, parce qu'elle fait perdre du temps : la version 2 du rapport accepte 7, 28, 90 et 180 jours. Pas 30. C'est la version 1 qui propose 30 jours, et elle ne remonte ni les requêtes soumises ni les jours actifs. Si vous tenez au mois calendaire, prenez le rapport du centre d'administration.
Ce script n'est pas un produit
Le script réalisé avec l'aide de l'IA reste fourni tel quel, sans support ni garantie. Relisez-le avant de le lancer, et commencez par un périmètre restreint.
Les autres pièges
- L'historique s'arrête à 180 jours. Le rapport du centre d'administration se filtre sur 7, 30, 90 ou 180 jours, et le tableau par personne couvre celles ayant détenu une licence à un moment quelconque des 180 derniers jours. Au delà, la question « cette licence a-t-elle déjà servi ? » n'a plus de réponse. Si vous ne collectez pas au fil de l'eau, vous perdez définitivement l'information.
- Les données ont plusieurs jours de retard. Les rapports d'usage ne sont pas en temps réel. N'interprétez pas une activité manquante sur les tout derniers jours.
- « Dernière activité » n'est pas « usage significatif ». Quelqu'un qui a ouvert Copilot une seule fois en trois mois a une date de dernière activité, et elle ne dit rien. La version 2 du rapport d'usage de Microsoft ajoute deux colonnes bien plus honnêtes : le nombre de requêtes soumises et le nombre de jours réellement actifs.
- L'usage de Copilot Chat sans licence ne figure pas dans ce rapport. Microsoft l'écrit noir sur blanc : ces données ne passent pas par les rapports Graph, elles s'obtiennent par le rapport Copilot Chat du centre d'administration ou par le journal d'audit Purview. La conséquence est contre-intuitive. Quelqu'un qui utilise beaucoup Copilot Chat sans licence, et jamais Copilot licencié, apparaît comme dormant. Sa licence est peut-être inutile ; c'est peut-être aussi exactement la personne à qui la laisser.
- Le journal d'audit ne remplace pas les rapports d'usage. Il répond à cette question précise, pas à la question générale. Microsoft écrit que les données d'audit, conçues pour la sécurité et la conformité, ne sont pas destinées à fonder des rapports d'usage, et que les agrégats qu'on en tire peuvent diverger des chiffres officiels. Reconstruire tout l'usage depuis Purview reste une fausse bonne idée.
- Il existe plusieurs offres Copilot. L'extension entreprise historique, Copilot Business, et des formules groupant la licence de base et Copilot dans un seul abonnement. Un inventaire qui ne cherche qu'une seule référence en rate une partie.
- Cet audit ne vaut que pour Copilot. Le même travail est à refaire dans la console GitHub, dans celle de ChatGPT Enterprise, chez Salesforce, sur les factures d'API au token, et sur les pools de crédits prépayés qui expirent sans que personne ne reçoive de facture pour le signaler. Chaque console a son vocabulaire, sa fenêtre d'historique et son unité, et aucune ne parle des autres. On finit avec cinq chiffres justes et aucun total.
Transformer le chiffre en économie
Vous avez une liste et un montant. Deux étapes pour qu'ils deviennent autre chose qu'une diapositive.
Réaffectez avant de résilier. Une licence dormante chez quelqu'un qui n'en veut pas est peut-être très utile ailleurs. La réaffectation est immédiate ; la résiliation, elle, dépend de votre date d'engagement annuel. Repérez-la avant de promettre une économie à votre direction financière.
Instaurez le contrôle, parce que ce travail se périme. À chaque arrivée, chaque départ, chaque changement de poste, du gaspillage se recrée. Deux mesures suffisent pour l'essentiel : ajouter le retrait des licences IA à la procédure de départ, et refaire cet audit tous les trimestres.
Et pensez à rétablir le masquage des noms si vous l'aviez levé.
Comment optidome le fait
optidome se connecte aux API d'administration de vos fournisseurs et à votre annuaire, en lecture seule, et fait le rapprochement à votre place. Vous obtenez la liste des licences dormantes classées selon les six situations ci-dessus, le montant que chacune représente sur l'année, et la date de la prochaine fenêtre de renouvellement pour savoir quand agir.
Trois différences avec l'audit décrit plus haut. La collecte est continue : l'historique ne s'efface pas au bout de 180 jours, et la question « cette licence a-t-elle déjà servi ? » garde une réponse l'année suivante. Elle ne s'arrête pas à Microsoft : GitHub Copilot, Salesforce Agentforce, ChatGPT Enterprise, les API OpenAI et Anthropic, et les pools de crédits prépayés entrent dans le même référentiel, chiffrés en euros. Et la restitution est pseudonymisée par défaut, ce qui évite précisément le dilemme du masquage : les noms n'apparaissent que pour qui a le droit de les voir, sans qu'il faille lever quoi que ce soit à l'échelle du tenant.
Le contenu des conversations n'est jamais lu ni stocké : l'analyse porte sur les métadonnées d'usage, pas sur ce que vos équipes écrivent. Les données sont hébergées en France.
Pour un ordre de grandeur chiffré sans rien installer, le calculateur de gaspillage demande deux minutes : votre nombre de licences, votre tarif (prérempli pour les outils dont le prix est public), et l'une des deux fourchettes citées plus haut, ou votre propre taux si vous l'avez déjà mesuré.
Et si votre parc est petit et stable, cet audit tous les trimestres suffit largement. Faites-le.
Les tarifs cités sont ceux publiés par Microsoft à la date indiquée en bas de page. Ils changent, et les remises négociées s'en écartent. Vérifiez les vôtres sur votre contrat avant toute décision.