Provisioning delle classi su vasta scala tramite PowerShell e Microsoft Graph

Man mano che Microsoft migliora il livello di sicurezza in tutti i prodotti e servizi, sono state apportate modifiche alla funzionalità API che potrebbero avere un impatto sui clienti che in precedenza si affidavano alle autorizzazioni solo delle app per eseguire il provisioning di blocchi appunti per la classe e team di classe usando le API.

Nota

Nella maggior parte dei casi, è consigliabile usare School sincronizzazione dati (SDS), un servizio gratuito che consente di automatizzare il processo di sincronizzazione dei dati degli utenti e dei registri dai sistemi informativi o di gestione degli studenti con Microsoft 365. SDS consente di gestire l'organizzazione didattica, 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 descrive i passaggi e fornisce collegamenti alla documentazione pertinente.

Importante

Se si collabora con un partner di terze parti al provisioning su vasta scala delle classi, condividere questo articolo con loro prima di intraprendere azioni proprie.

Provisioning di nuove classi

Avviso

Prima del 21 agosto 2025, una versione precedente di questa documentazione consigliava il provisioning tramite PowerShell per Teams prima che fossero apportati gli aggiornamenti necessari. 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 usando PowerShell per Teams, che includerà tutta la configurazione necessaria per classi e blocchi appunti. È sufficiente personalizzare il nome visualizzato desiderato nello script seguente ed eseguirlo come amministratore.

Importante

Lo script seguente richiede l'uso di Microsoft Teams PowerShell versione 7.3.1 o successiva. 

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 per Microsoft Graph

Se non si ha accesso a PowerShell per 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 e 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 delle autorizzazioni ai siti di classe esistenti

Nota

Questo approccio richiede anche 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 è già stato eseguito il provisioning delle classi e si riscontrano errori o problemi di autorizzazioni con il blocco appunti per la classe o le attività di Teams, è possibile 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 triggering 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"
}