Provisionamento de classes em escala usando o PowerShell e o Microsoft Graph

À medida que a Microsoft aprimora sua postura de segurança em todos os produtos e serviços, houve alterações na funcionalidade da API que podem afetar os clientes que anteriormente dependiam de permissões somente de aplicativo para provisionar Blocos de Anotações de Classe e Equipes de Classe usando APIs.

Observação

Na maioria dos casos, recomendamos o uso do School Sincronização de Dados (SDS), um serviço gratuito que ajuda a automatizar o processo de sincronização de dados de usuário e lista de dados de Informações do Aluno ou Sistemas de Gerenciamento com o Microsoft 365. O SDS ajuda você a gerenciar sua organização educacional, usuários, classes e funções, sincronizando seus dados com o Microsoft Entra ID e o Microsoft 365, para que você possa usar o Microsoft Teams, o Intune para Educação, o Exchange Online, o SharePoint Online, os blocos de anotações de classe do OneNote e habilitar aplicativos de terceiros com a integração de Logon único.

Você ainda pode provisionar classes e blocos de anotações em escala usando o PowerShell e o Microsoft Graph seguindo métodos compatíveis. Este artigo descreve as etapas e fornece links para a documentação relevante.

Importante

Se você estiver trabalhando com um parceiro terceirizado no provisionamento em escala de classes, compartilhe este artigo com ele antes de executar as etapas por conta própria.

Provisionando novas classes

Aviso

Antes de 21 de agosto de 2025, uma versão anterior desta documentação recomendava o provisionamento por meio do PowerShell do Teams antes que as atualizações necessárias fossem feitas. Essas atualizações foram concluídas e você pode continuar com essa abordagem no momento. Agradecemos pela sua paciência.

É simples provisionar novas classes usando o PowerShell do Teams, que incluirá todas as configurações necessárias para classes e blocos de anotações. Basta personalizar o nome de exibição desejado no script a seguir e executá-lo como administrador.

Importante

O script a seguir requer que você use o Microsoft Teams PowerShell versão 7.3.1 ou mais recente. 

Script de exemplo

# Using the Teams PowerShell SDK
Install-Module -MicrosoftTeams -Force -AllowClobber
New-Team -DisplayName 'Test Class 20251208.4' -Template 'EDU_Class'

Opção 2: usar o Microsoft Graph PowerShell

Se você não tiver acesso ao PowerShell do Teams, talvez queira explorar classes de provisionamento em escala usando o Microsoft Graph. Edite os parâmetros na parte superior do script a seguir, conforme apropriado, e execute o script como administrador para provisionar classes e blocos de anotações em escala:

Script de exemplo

# 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​​​​​​​

Solução de problemas: concessão de permissões a sites de classe existentes

Observação

Essa abordagem também exigirá que a pessoa que executa o script seja um administrador do site, conforme descrito aqui. O script a seguir inclui uma etapa para adicionar o usuário conectado no momento como administrador do site para os sites que exigem solução de problemas.

Se você já provisionou classes e está observando falhas ou problemas de permissão com o Bloco de Anotações de Classe ou Tarefas do Teams, você pode atualizar as permissões de site para suas classes usando o script a seguir, substituindo o parâmetro rawGroups pelas groupIDs das classes afetadas:

Script de exemplo

#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"
}