Avant de réorganiser un environnement collaboratif, commencer par un état des lieux reproductible.
J’ai adapté ici un script de mes procédures d’administration Teams. Il relève le nom de chaque équipe sélectionnée et le nombre de propriétaires et de membres retournés par le service. Il ne modifie aucune équipe ni aucune appartenance.
Définir le périmètre
Utiliser le module MicrosoftTeams, puis ouvrir une session avec Connect-MicrosoftTeams. Le compte doit disposer des autorisations de lecture nécessaires. Fournir les identifiants des équipes à contrôler et le chemin d’un nouveau CSV dans un dossier existant.
Le script ne cherche pas à élargir automatiquement le périmètre à tout le tenant. Les noms des membres ne sont pas exportés ; le rapport contient le nom des équipes et leurs effectifs.
Comprendre les trois opérations
- Lire les équipes :
Get-Team -GroupIdcible chaque équipe choisie. - Compter les rôles :
Get-TeamUserrelève séparément les propriétaires et les membres. - Exporter : le CSV est écrit localement, avec un séparateur point-virgule. Un fichier existant n’est pas écrasé.
Le script complet
Une erreur d’accès interrompt l’export afin de ne pas présenter silencieusement un rapport incomplet. Le code s’appuie sur les commandes documentées par Microsoft ; son exécution nécessite votre environnement Teams.
Afficher le code
#requires -Version 5.1
#requires -Modules MicrosoftTeams
<#
.SYNOPSIS
Inventaire en lecture seule d'un perimetre d'equipes Microsoft Teams.
.DESCRIPTION
Connexion prealable avec Connect-MicrosoftTeams.
Le compte doit etre autorise a consulter les equipes selectionnees.
Aucune equipe ni appartenance n'est modifiee. Le CSV reste local.
Les effectifs correspondent aux roles retournes par Microsoft Teams.
Les canaux prives/partages et les droits SharePoint ne sont pas audites.
.PARAMETER GroupId
Identifiants des equipes a inventorier (copier depuis votre administration).
.PARAMETER Path
Chemin d'un nouveau fichier CSV, dans un dossier existant.
#>
[CmdletBinding()]
param(
[Parameter(Mandatory = $true)]
[ValidateNotNullOrEmpty()]
[guid[]]$GroupId,
[Parameter(Mandatory = $true)]
[ValidateNotNullOrEmpty()]
[string]$Path
)
Set-StrictMode -Version Latest
$ErrorActionPreference = 'Stop'
# Aucun fichier existant n'est remplace.
if (Test-Path -LiteralPath $Path) {
throw 'Le fichier de destination existe deja. Choisissez un nouveau nom.'
}
# Protege les libelles dans les tableurs contre une interpretation comme formule.
function ConvertTo-CsvLabel {
param([string]$Value)
if ($Value -match '^[\s=+@-]') { return "'$Value" }
return $Value
}
# Une erreur d'acces interrompt l'export : pas de resultat incomplet silencieux.
$report = @(foreach ($id in ($GroupId | Select-Object -Unique)) {
$team = Get-Team -GroupId $id.ToString() -ErrorAction Stop
if (-not $team) { throw "Equipe inaccessible : $id" }
$owners = @(Get-TeamUser -GroupId $id.ToString() -Role Owner -ErrorAction Stop)
$members = @(Get-TeamUser -GroupId $id.ToString() -Role Member -ErrorAction Stop)
[PSCustomObject]@{
Equipe = ConvertTo-CsvLabel -Value $team.DisplayName
Proprietaires = $owners.Count
Membres = $members.Count
Observation = if ($owners.Count -eq 0) { 'A verifier : aucun proprietaire retourne' } else { 'Proprietaire(s) recense(s)' }
}
})
$report | Export-Csv -LiteralPath $Path -NoTypeInformation -NoClobber -Encoding UTF8 -Delimiter ';'
Write-Output ("{0} equipe(s) exportee(s)." -f $report.Count)
Lire le résultat
Une équipe sans propriétaire retourné mérite une vérification des droits du compte et de son organisation. Les effectifs sont ceux des rôles renvoyés par Teams au moment de l’exécution. Cet inventaire ne couvre ni les canaux privés ou partagés, ni les permissions SharePoint.
Observer un périmètre choisi, conserver un résultat lisible et décider ensuite des changements.
Références Microsoft : Get-Team et Get-TeamUser.