A medida que Microsoft mejora su posición de seguridad en todos los productos y servicios, ha habido cambios en la funcionalidad de la API que pueden afectar a los clientes que anteriormente dependían de permisos solo de aplicación para aprovisionar Blocs de notas de clase y Equipos de clase mediante API.
Nota
En la mayoría de los casos, se recomienda usar School Data Sync (SDS), un servicio gratuito que ayuda a automatizar el proceso de sincronización de datos de usuarios y listas de sistemas de información o de administración de estudiantes con Microsoft 365. SDS le ayuda a administrar su organización educativa, usuarios, clases y roles, sincronizando sus datos con Microsoft Entra ID y Microsoft 365, para que pueda usar Microsoft Teams, Intune para Educación, Exchange Online, SharePoint Online, blocs de notas de clase de OneNote y habilitar aplicaciones de terceros con Inicio de sesión único integración.
Todavía puede aprovisionar clases y blocs de notas a escala con PowerShell y Microsoft Graph siguiendo los métodos admitidos. En este artículo se describen los pasos y se proporcionan vínculos a la documentación pertinente.
Importante
Si está trabajando con un asociado externo en el aprovisionamiento a escala de clases, comparta este artículo con ellos antes de tomar medidas por su cuenta.
Aprovisionamiento de nuevas clases
Opción 1 (recomendada): usar el PowerShell de Teams
Advertencia
Antes del 21 de agosto de 2025, una versión anterior de esta documentación recomendaba el aprovisionamiento a través de PowerShell de Teams antes de realizar las actualizaciones necesarias. Estas actualizaciones ya están completas y puede continuar con este enfoque en este momento. Hola, gracias por tu paciencia.
Aprovisionar nuevas clases es sencillo con PowerShell de Teams, que incluirá toda la configuración necesaria para las clases y los blocs de notas. Simplemente personalice el nombre para mostrar deseado en el siguiente script y ejecútelo como administrador.
Importante
El siguiente script requiere que use la versión 7.3.1 o posteriores de PowerShell de Microsoft Teams .
Script de muestra
# Using the Teams PowerShell SDK
Install-Module -MicrosoftTeams -Force -AllowClobber
New-Team -DisplayName 'Test Class 20251208.4' -Template 'EDU_Class'
Opción 2: Usar Microsoft Graph PowerShell
Si no tiene acceso a PowerShell para Teams, puede explorar la posibilidad de explorar el aprovisionamiento de clases a escala con Microsoft Graph. Edite los parámetros en la parte superior del siguiente script según corresponda y, a continuación, ejecútelo como administrador para aprovisionar clases y blocs de notas a escala:
Script de muestra
# 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
Solución de problemas: conceder permisos a sitios de clase existentes
Nota
Este enfoque también requerirá que la persona que ejecuta el script sea un administrador del sitio, como se describe aquí. El siguiente script incluye un paso para agregar el usuario que ha iniciado sesión actualmente como administrador del sitio para los sitios que requieren solución de problemas.
Si ya ha aprovisionado clases y observa errores o problemas de permisos con el Bloc de notas de clase o las tareas de Teams, puede actualizar los permisos del sitio para las clases mediante el siguiente script, reemplazando el parámetro rawGroups por los groupID de las clases afectadas:
Script de muestra
#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"
}