Aprowizowanie klas na dużą skalę przy użyciu programu PowerShell i programu Microsoft Graph

Firma Microsoft ulepsza swoje zabezpieczenia we wszystkich produktach i usługach, dlatego wprowadzono zmiany w funkcjach interfejsu API, które mogą mieć wpływ na klientów, którzy wcześniej polegali na uprawnieniach tylko do aplikacji w celu inicjowania obsługi notesów zajęć i zespołów zajęć przy użyciu interfejsów API.

Uwaga

W większości przypadków zalecamy korzystanie z aplikacji School Data Sync (SDS), bezpłatnej usługi, która pomaga zautomatyzować proces synchronizacji danych użytkowników i wykazów z informacji o uczniach lub systemów zarządzania za pomocą platformy Microsoft 365. Narzędzie SDS ułatwia zarządzanie organizacją edukacyjną, użytkownikami, klasami i rolami, synchronizując dane z usługą Microsoft Entra ID i platformą Microsoft 365, dzięki czemu można korzystać z usług Microsoft Teams, Intune for Education, Exchange Online, SharePoint Online, notesów zajęć programu OneNote oraz włączać aplikacje innych firm z funkcją logowania jednokrotnego integracji.

Nadal możesz aprowizować klasy i notesy na dużą skalę przy użyciu programu PowerShell i programu Microsoft Graph, postępując zgodnie z obsługiwanymi metodami. W tym artykule opisano poszczególne kroki i udostępniono linki do odpowiedniej dokumentacji.

Ważne

Jeśli pracujesz z partnerem zewnętrznym nad aprowizacją klas na dużą skalę, udostępnij mu ten artykuł przed podjęciem samodzielnych kroków.

Inicjowanie obsługi nowych zajęć

Ostrzeżenie

Przed 21 sierpnia 2025 r. wcześniejsza wersja tej dokumentacji zalecała aprowizację za pomocą programu Teams PowerShell przed wprowadzeniem wymaganych aktualizacji. Te aktualizacje zostały ukończone i w tej chwili możesz kontynuować tę metodę. Dziękujemy za cierpliwość.

Inicjowanie obsługi nowych zajęć przy użyciu programu PowerShell dla usługi Teams, który będzie zawierać wszystkie niezbędne konfiguracje dotyczące zajęć i notesów, jest prosty. Po prostu dostosuj żądaną nazwę wyświetlaną w poniższym skrypcie i uruchom ją jako administrator.

Ważne

Poniższy skrypt wymaga użycia programu Microsoft Teams PowerShell w wersji 7.3.1 lub nowszej. 

Przykładowy skrypt

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

Opcja 2. Przy użyciu programu Microsoft Graph PowerShell

Jeśli nie masz dostępu do programu PowerShell dla aplikacji Teams, możesz zapoznać się z klasami aprowizacji na dużą skalę przy użyciu funkcji Microsoft Graph. Edytuj odpowiednio parametry u góry poniższego skryptu, a następnie uruchom skrypt jako administrator, aby zainicjować klasy i notesy z zachowaniem odpowiedniej skali:

Przykładowy skrypt

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

Rozwiązywanie problemów: udzielanie uprawnień do istniejących witryn zajęć

Uwaga

Takie podejście wymaga również, aby osoba uruchamiająca skrypt była administratorem witryny, zgodnie z opisem w tym artykule. Poniższy skrypt zawiera krok dodawania obecnie zalogowanego użytkownika jako administratora witryn wymagających rozwiązania problemów.

Jeśli zainicjowano już zajęcia i obserwujesz błędy lub problemy z uprawnieniami w notesie zajęć lub zadaniach w aplikacji Teams, możesz zaktualizować uprawnienia witryny dla zajęć przy użyciu następującego skryptu, zastępując parametr rawGroups identyfikatorami grup klas, których dotyczy problem:

Przykładowy skrypt

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