Klassen op schaal inrichten met behulp van PowerShell en Microsoft Graph

Terwijl Microsoft zijn beveiligingspostuur voor alle producten en services verbetert, zijn er wijzigingen in API-functionaliteit die van invloed kunnen zijn op klanten die voorheen afhankelijk waren van app-only machtigingen om klasnotitieblokken en klasteams in te richten met behulp van API's.

Opmerking

In de meeste gevallen raden we u aan om School Data Sync (SDS) te gebruiken, een gratis service die helpt bij het automatiseren van het proces van het synchroniseren van gebruikers- en roostergegevens van studenteninformatie- of -beheersystemen met Microsoft 365. SDS helpt u bij het beheren van uw onderwijsorganisatie, gebruikers, klassen en rollen, door uw gegevens te synchroniseren met Microsoft Entra ID en Microsoft 365, zodat u Microsoft Teams, Intune for Education, Exchange Online, SharePoint Online, OneNote Class-notitieblokken kunt gebruiken en apps van derden kunt inschakelen met Single sign-on-integratie.

U kunt klassen en notitieblokken nog steeds op schaal inrichten met behulp van PowerShell en Microsoft Graph door de ondersteunde methoden te volgen. Dit artikel bevat een overzicht van de stappen en koppelingen naar relevante documentatie.

Belangrijk

Als u met een externe partner werkt aan het op schaal aanbieden van klassen, deel dit artikel dan met hen voordat u zelf stappen onderneemt.

Nieuwe klassen inrichten

Waarschuwing

Vóór 21 augustus 2025 adviseerde een eerdere versie van deze documentatie om in te richten via Teams PowerShell voordat de vereiste updates waren gemaakt. Deze updates zijn nu voltooid en u kunt nu doorgaan met deze aanpak. Hartelijk dank voor uw geduld.

Het is eenvoudig om nieuwe klassen in te richten met behulp van Teams PowerShell, waarin alle benodigde instellingen voor klassen en notitieblokken zijn opgenomen. Pas de gewenste weergavenaam aan in het volgende script en voer het uit als beheerder.

Belangrijk

Voor het volgende script moet u versie 7.3.1 of hoger van Microsoft Teams PowerShell gebruiken

Voorbeeldscript

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

Optie 2: Microsoft Graph PowerShell gebruiken

Als u geen toegang hebt tot Teams PowerShell kunt u experimenteren met het op grote schaal inrichten van klassen met behulp van Microsoft Graph. Bewerk de parameters boven aan het volgende script waar nodig en voer het script vervolgens uit als een beheerder om klassen en notitieblokken op schaal in te richten:

Voorbeeldscript

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

Problemen oplossen: machtigingen verlenen aan bestaande klassensites

Opmerking

Voor deze aanpak is het ook vereist dat de persoon die het script uitvoert, een sitebeheerder is, zoals hier wordt beschreven. Het onderstaande script bevat een stap om de momenteel aangemelde gebruiker toe te voegen als sitebeheerder voor de sites waarvoor probleemoplossing nodig is.

Als u klassen al hebt ingericht en fouten of machtigingsproblemen met opdrachten van Class Notebook of Teams waarneemt, kunt u de sitemachtigingen voor uw klassen bijwerken met behulp van het volgende script, waarbij de parameter rawGroups wordt vervangen door de groupID's van de desbetreffende klassen:

Voorbeeldscript

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