À mesure que Microsoft améliore sa posture de sécurité dans tous les produits et services, des modifications ont été apportées aux fonctionnalités d’API qui peuvent avoir un impact sur les clients qui s’appuyaient précédemment sur des autorisations d’application uniquement pour provisionner des blocs-notes pour la classe et les équipes de classe à l’aide d’API.
Remarque : Dans la plupart des cas, nous vous recommandons d’utiliser School Data Sync(SDS), un service gratuit qui permet d’automatiser le processus de synchronisation des données des utilisateurs et des listes de travail à partir des systèmes d’information ou de gestion des étudiants avec Microsoft 365. SDS vous aide à gérer vos organization, utilisateurs, classes et rôles éducatifs, en synchronisant vos données avec Microsoft Entra ID et Microsoft 365, afin que vous puissiez utiliser Microsoft Teams, Intune éducation, Exchange Online, SharePoint Online, OneNote Pour la classe, et activer des applications tierces avec intégration Authentification unique.
Vous pouvez toujours provisionner des classes et des notebooks à grande échelle à l’aide de PowerShell et de Microsoft Graph en suivant les méthodes prises en charge. Cet article décrit les étapes et fournit des liens vers la documentation appropriée.
Important : Si vous travaillez avec un partenaire tiers sur l’approvisionnement à grande échelle de classes, partagez cet article avec lui avant de prendre des mesures par vous-même.
Provisionnement de nouvelles classes
Option 1 (recommandée) : Utilisation de Teams PowerShell
Avertissement : Avant le 21 août 2025, une version antérieure de cette documentation recommandait l’approvisionnement via Teams PowerShell avant la mise à jour requise. Ces mises à jour sont maintenant terminées, et vous pouvez procéder à cette approche à ce stade. Merci de votre patience.
Il est simple de provisionner de nouvelles classes à l’aide de Teams PowerShell, qui inclut toute la configuration nécessaire pour les classes et les notebooks. Personnalisez simplement le nom d’affichage souhaité dans le script suivant et exécutez-le en tant qu’administrateur.
Exemple de script
# Using the Teams PowerShell SDK
Install-Module -MicrosoftTeams -Force -AllowClobber
New-Team -DisplayName 'Test Class 20251208.4' -Template 'EDU_Class'
|
Option 2 : Utilisation de Microsoft Graph PowerShell
Si vous n’avez pas accès à Teams PowerShell, vous pouvez explorer les classes d’approvisionnement à grande échelle à l’aide de Microsoft Graph. Modifiez les paramètres en haut du script suivant, le cas échéant, puis exécutez le script en tant qu’administrateur pour provisionner des classes et des notebooks à grande échelle :
Exemple de script
# Using the MS Graph API
Install-Module Microsoft.Graph -AllowClobber -Force
# PARAMETERS
$Name = "Test Class 20251208.3"
$Description = "A Test Class"
$Mail = $Name -replace '[^a-zA-Z0-9\s]|[ ]', '' # Replace this mail alias with a preferred generation method
$OwnerId = "000-000-00000-000000-000" # Replace this with the Owner's GUID
# ------------
# Create a new M365 Group
$CreateGroupBody = @"
{
"description": "$Name",
"displayName": "$Description",
"groupTypes": [
"Unified"
],
"mailEnabled": false,
"mailNickname": "$Mail",
"securityEnabled": false,
"members@odata.bind": [
"https://graph.microsoft.com/v1.0/users/$OwnerId"
],
"owners@odata.bind": [
"https://graph.microsoft.com/v1.0/users/$OwnerId"
],
"visibility": "HiddenMembership",
"creationOptions": [
"ExchangeProvisioningFlags:461",
"classAssignments"
],
"extension_fe2174665583431c953114ff7268b7b3_Education_ObjectType": "Section",
"resourceBehaviorOptions": [
"appRoleForSite:22d27567-b3f0-4dc2-9ec2-46ed368ba538:fullcontrol",
"appRoleForSite:c9a559d2-7aab-4f13-a6ed-e7e9c52aec87:fullcontrol",
"appRoleForSite:13291f5a-59ac-4c59-b0fa-d1632e8f3292:fullcontrol",
"appRoleForSite:2d4d3d8e-2be3-4bef-9f87-7875a61c29de:fullcontrol",
"appRoleForSite:8f348934-64be-4bb2-bc16-c54c96789f43:fullcontrol"
]
}
"@
$NewGroup = Invoke-MgGraphRequest -uri 'https://graph.microsoft.com/v1.0/groups/' -Body $CreateGroupBody -Method POST -ContentType "application/json"
# Create Teams Class Team from group
$CreateTeamBody = @{
"template@odata.bind" = "https://graph.microsoft.com/v1.0/teamsTemplates('educationClass')"
"group@odata.bind" = "https://graph.microsoft.com/v1.0/groups('$($NewGroup.Id)')"
}
New-MgTeam -BodyParameter $CreateTeamBody
|
Résoudre les problèmes : octroi d’autorisations à des sites de classes existants
Remarque : Cette approche nécessite également que la personne qui exécute le script soit un administrateur de site, comme décrit ici. Le script ci-dessous inclut une étape permettant d’ajouter l’utilisateur actuellement connecté en tant qu’administrateur de site pour les sites nécessitant une résolution des problèmes.
Si vous avez déjà provisionné des classes et que vous observez des échecs ou des problèmes d’autorisation avec le bloc-notes pour la classe ou les affectations Teams, vous pouvez mettre à jour les autorisations de site pour vos classes à l’aide du script suivant, en remplaçant le paramètre rawGroups par les GROUPID des classes affectées :
Exemple de script
#You will need to connect to SharePoint, Exchange Online, and Graph with the following -Scopes Sites.FullControl.All, as well as collect the groupIDs of Class Teams affected
$rawGroups =@("b0a5905d-09ae-4605-8e12-94da93ecbe92","e0eec729-24ef-451e-b079-56d0baf4dfc9")
# Convert to array of objects with .groupid
$groups = $rawGroups | ForEach-Object { Get-UnifiedGroup -Identity $_ }
$step = 0
#get the currently logged in user's account to add as a site admin
$CUA = (get-mgcontext).account
foreach ($group in $groups) {
$step = $step + 1
Set-SPOUser -Site $group.SharePointSiteUrl -LoginName $CUA -IsSiteCollectionAdmin $true
Write-Host "SiteCollectionAdmin added on $step of $($Groups.Count) Class Sites"
}
#Pause for 5 minutes before tiggering the General Folder creation
Write-Host "Pausing for 5 Minutes before adding perms to allow SiteCollectionAdmin to propagate"
Start-Sleep -Seconds 300
Write-Host "Working on $($Groups.Count) Classes"
foreach ($group in $groups) {
#$step = $step + 1
$Site = Get-MgGroupSite -GroupId $group.ExternalDirectoryObjectId -SiteId "root"
$SiteId = $Site.Id
Write-Host "Processing permissions on $step of $($Groups.Count) Classes"
# These are the AppIds for common Microsoft EDU Apps
$AppIds = @{
"8f348934-64be-4bb2-bc16-c54c96789f43"="EDU Assignments";
"22d27567-b3f0-4dc2-9ec2-46ed368ba538"="Reading Assignments";
"2d4d3d8e-2be3-4bef-9f87-7875a61c29de"="OneNote";
"c9a559d2-7aab-4f13-a6ed-e7e9c52aec87"="Microsoft Forms";
"13291f5a-59ac-4c59-b0fa-d1632e8f3292"="EDU OneNote";
}
# Apply the permissions to the group site
$AppIds.Keys | %{
$AppId = $_
$Name = $AppIds[$_]
$Body = @"
{
"roles": ["fullcontrol"],
"grantedToIdentities": [{
"application": {
"id": "$AppId",
"displayName": "$Name"
}
}]
}
"@
Invoke-MgGraphRequest -Method POST -Uri "https://graph.microsoft.com/v1.0/sites/$SiteId/permissions" -Body $Body -ContentType "application/json"
}
}
Write-Host "Processed $($Groups.Count) Classes, removing sitecollectionadmin"
$step = 0
foreach ($group in $groups) {
$step = $step + 1
Set-SPOUser -Site $group.SharePointSiteUrl -LoginName $CUA -IsSiteCollectionAdmin $false
Write-Host "SiteCollectionAdmin removed on $step of $($Groups.Count) Class Sites"
}
|