Poiché Microsoft migliora la propria posizione di sicurezza in tutti i prodotti e i servizi, sono state apportate modifiche alla funzionalità API che potrebbero influire sui clienti che in precedenza si affidavano alle autorizzazioni solo delle app per il provisioning dei blocchi appunti per la classe e dei team di classe con le API.
Nota: Nella maggior parte dei casi, è consigliabile usare School Data Sync(SDS), un servizio gratuito che consente di automatizzare il processo di sincronizzazione dei dati di utenti e registri da Student Information or Management Systems con Microsoft 365. SDS consente di gestire l'organizzazione educativa, gli utenti, le classi e i ruoli, sincronizzando i dati con Microsoft Entra ID e Microsoft 365, in modo da poter usare Microsoft Teams, Intune for Education, Exchange Online, SharePoint Online, blocchi appunti di OneNote per la classe e abilitare le app di terze parti con l'integrazione di Single Sign On.
È comunque possibile eseguire il provisioning di classi e blocchi appunti su vasta scala usando PowerShell e Microsoft Graph seguendo i metodi supportati. Questo articolo illustra i passaggi e fornisce i collegamenti alla documentazione pertinente.
Importante: Se si collabora con un partner di terze parti al provisioning su vasta scala delle classi, è possibile condividere questo articolo prima di intraprendere autonomamente le azioni necessarie.
Provisioning di nuove classi
Opzione 1 (scelta consigliata): uso di Teams PowerShell
Avviso: Prima del 21 agosto 2025, era stata eseguita una versione precedente di questa documentazione che raccomandava il provisioning tramite PowerShell di Teams prima dell'aggiornamento richiesto. Questi aggiornamenti sono stati completati ed è possibile procedere con questo approccio in questo momento. Grazie per la pazienza.
È semplice eseguire il provisioning di nuove classi con Teams PowerShell, che includerà tutte le configurazioni necessarie per le classi e i blocchi appunti. È sufficiente personalizzare il nome visualizzato desiderato nello script seguente ed eseguirlo come amministratore.
Script di esempio
# Using the Teams PowerShell SDK
Install-Module -MicrosoftTeams -Force -AllowClobber
New-Team -DisplayName 'Test Class 20251208.4' -Template 'EDU_Class'
|
Opzione 2: uso di PowerShell di Microsoft Graph
Se non si ha accesso a PowerShell di Teams, è consigliabile esplorare le classi di provisioning su vasta scala usando Microsoft Graph. Modificare i parametri nella parte superiore dello script seguente in base alle esigenze, quindi eseguire lo script come amministratore per eseguire il provisioning di classi e blocchi appunti su vasta scala:
Script di esempio
# 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
|
Risoluzione dei problemi: concessione di autorizzazioni a siti di classe esistenti
Nota: Questo approccio richiede inoltre che la persona che esegue lo script sia un amministratore del sito, come descritto di seguito. Lo script seguente include un passaggio per aggiungere l'utente attualmente connesso come amministratore del sito per i siti che richiedono la risoluzione dei problemi.
Se hai già eseguito il provisioning delle classi e stai osservando errori o problemi di autorizzazione relativi a Blocco appunti per la classe o Attività di Teams, puoi aggiornare le autorizzazioni del sito per le classi usando lo script seguente, sostituendo il parametro rawGroups con i groupID delle classi interessate:
Script di esempio
#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"
}
|