HomeMicrosoft 365Comment obtenir la liste complète des Microsoft Forms d’un...

Comment obtenir la liste complète des Microsoft Forms d’un tenant M365

Dans un environnement Microsoft 365, les Microsoft Forms peuvent se multiplier rapidement : sondages, formulaires RH, quiz techniques, évaluations internes, etc. Mais lorsqu’un employé quitte l’organisation, lorsqu’un groupe est supprimé ou lorsqu’un projet change d’équipe, une question revient souvent :

Où sont les formulaires et qui en est responsable ?

Autrement dit : peut-on obtenir une liste complète de tous les Forms d’un tenant, avec leurs propriétaires et identifier les forms orphelins ? La réponse est oui, même si Microsoft ne propose pas encore une interface centralisée pour le faire. Dans cet article, je te montre comment y parvenir grâce à PowerShell et Microsoft Graph.

Pourquoi cette liste n’est pas directement disponible ?

Microsoft Forms repose sur un modèle simple :

  • un formulaire appartient soit à un utilisateur,
  • soit à un groupe Microsoft 365,
  • soit à un compte supprimé, auquel cas le formulaire devient “orphelin”.

Le défi, c’est qu’il n’existe pas de page unique dans M365 pour visualiser tous les formulaires. Pour obtenir une vue complète, il faut donc :

  1. Récupérer tous les utilisateurs et groupes du tenant
  2. Interroger Microsoft Forms via l’API Graph
  3. Consolider les résultats
  4. Détecter les formulaires dont le propriétaire n’existe plus

Heureusement, tout cela peut être automatisé.

Ce qu’il vous faut avant de commencer

Pour exécuter le script, il faut :

  • Le module Microsoft Graph PowerShell
  • Un compte Administrateur M365
  • Une machine Windows, macOS ou Linux avec PowerShell 7+

Installation :

Install-Module Microsoft.Graph -Scope AllUsers

Connexion :

Connect-MgGraph -Scopes "User.Read.All","Group.Read.All","Forms.Read.All"

Et vous êtes prêts.

Le script complet pour inventorier tous les Microsoft Forms

Voici la version prête à l’emploi.
Elle génère automatiquement un CSV contenant :

  • le nom du formulaire
  • son propriétaire
  • son type (utilisateur/groupe)
  • la date de modification
  • et s’il est orphelin ou non
# ============================================
# Script : Inventaire des Microsoft Forms
# Objectif : Lister tous les Forms du tenant,
#            avec propriétaires et forms orphelins
# ============================================
Write-Host "Connexion à Microsoft Graph..." -ForegroundColor Cyan
Connect-MgGraph -Scopes "User.Read.All","Group.Read.All","Forms.Read.All"
Select-MgProfile -Name beta
Write-Host "Récupération des utilisateurs..." -ForegroundColor Cyan
$users = Get-MgUser -All -Property "id,displayName,userPrincipalName,accountEnabled"
Write-Host "Récupération des groupes M365..." -ForegroundColor Cyan
$groups = Get-MgGroup -All -Filter "groupTypes/any(c:c eq 'Unified')" -Property "id,displayName,mail"
$results = @()
function Get-FormsByOwner {
    param(
        [string]$OwnerId,
        [string]$OwnerType,
        [string]$OwnerName
    )
    try {
        $forms = Invoke-MgGraphRequest -Method GET -Uri "https://graph.microsoft.com/beta/solutions/forms/owners/$OwnerId/forms"
        
        foreach ($form in $forms.value) {
            $results += [pscustomobject]@{
                FormId       = $form.id
                FormTitle    = $form.displayName
                OwnerType    = $OwnerType
                OwnerName    = $OwnerName
                OwnerId      = $OwnerId
                LastModified = $form.lastModifiedDateTime
                IsOrphan     = $false
            }
        }
    }
    catch {}
}
foreach ($user in $users) {
    Write-Host "Analyse : $($user.userPrincipalName)" -ForegroundColor Yellow
    Get-FormsByOwner -OwnerId $user.Id -OwnerType "User" -OwnerName $user.userPrincipalName
}
foreach ($group in $groups) {
    Write-Host "Analyse groupe : $($group.displayName)" -ForegroundColor Yellow
    Get-FormsByOwner -OwnerId $group.Id -OwnerType "Group" -OwnerName $group.displayName
}
Write-Host "Détection des forms orphelins..." -ForegroundColor Magenta
foreach ($item in $results) {
    if ($item.OwnerType -eq "User") {
        $owner = $users | Where-Object { $_.Id -eq $item.OwnerId }
        if (-not $owner -or $owner.accountEnabled -eq $false) {
            $item.IsOrphan = $true
        }
    }
}
$output = "FormsInventory_$(Get-Date -Format 'yyyyMMdd').csv"
$results | Export-Csv $output -NoTypeInformation -Encoding UTF8
Write-Host "Inventaire terminé ! Fichier généré : $output" -ForegroundColor Green

Ce que vous obtenez avec ce script

Le fichier produit vous donne une vue claire et exploitable :

FormTitleOwnerOwnerTypeLastModifiedOrphelin
Sondage RH 2025jean.dupont@entreprise.comUser2025-02-12Non
Quiz AzureÉquipe TIGroup2025-01-03Non
Formulaire ancien employé(compte supprimé)User2023-09-11Oui

Avec cette vue globale, vous pouvez :

✔ gérer les transferts de propriété
✔ éviter de perdre des formulaires critiques lors du départ d’un employé
✔ organiser le nettoyage de l’environnement
✔ renforcer votre gouvernance M365

Même si Microsoft ne propose pas encore un bouton magique “Inventaire complet des Forms”, il est tout à fait possible d’obtenir une vue exhaustive grâce à Microsoft Graph.

Charles Jenkins
Charles Jenkinshttps://trivium365.com/
Fort de plus de 15 ans d’expérience, il accompagne les organisations dans l’adoption des outils Microsoft pour optimiser leur collaboration et leur productivité. Passionné par l’innovation et l’amélioration continue, il met son expertise au service des équipes pour les aider à tirer le meilleur parti de la transformation numérique.