Klargøring af klasser i stor skala ved hjælp af PowerShell og Microsoft Graph

Efterhånden som Microsoft forbedrer sit sikkerhedsniveau på tværs af alle produkter og tjenester, er der sket ændringer i API-funktionalitet, der kan påvirke kunder, der tidligere var afhængige af apptilladelser til at klargøre klassenotesbøger og klasseteams ved hjælp af API'er.

Bemærk

I de fleste tilfælde anbefaler vi at bruge School Data Sync (SDS), som er en gratis tjeneste, der hjælper med at automatisere processen med at synkronisere bruger- og listedata fra elevoplysninger eller administrationssystemer med Microsoft 365. SDS hjælper dig med at administrere din uddannelsesorganisation, brugere, klasser og roller ved at synkronisere dine data med Microsoft Entra ID og Microsoft 365, så du kan bruge Microsoft Teams, Intune for Education, Exchange Online, SharePoint Online, OneNote-klassenotesbøger og aktivere tredjepartsapps med integration af Enkeltlogon.

Du kan stadig klargøre klasser og notesbøger i stor skala ved hjælp af PowerShell og Microsoft Graph ved hjælp af følgende understøttede metoder. I denne artikel beskrives trinnene og indeholder links til relevant dokumentation.

Vigtig

Hvis du arbejder med en tredjepartspartner om klargøring af klasser i stor skala, skal du dele denne artikel med dem, før du selv træffer dine trin.

Klargøring af nye klasser

Advarsel

Før den 21. august 2025 anbefalede en tidligere version af denne dokumentation klargøring via Teams PowerShell, før de nødvendige opdateringer var foretaget. Disse opdateringer er nu fuldført, og du kan fortsætte med denne fremgangsmåde på nuværende tidspunkt. Tak for din tålmodighed.

Det er nemt at klargøre nye klasser ved hjælp af Teams PowerShell, som vil indeholde al nødvendig konfiguration af klasser og notesbøger. Du skal blot tilpasse det ønskede viste navn i følgende script og køre det som administrator.

Vigtig

Følgende script kræver, at du bruger Microsoft Teams PowerShell version 7.3.1 eller nyere. 

Eksempel på script

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

Mulighed 2: Brug af Microsoft Graph PowerShell

Hvis du ikke har adgang til Teams PowerShell, kan du udforske klargøringsklasser i stor skala ved hjælp af Microsoft Graph. Rediger parametrene øverst i følgende script efter behov, og kør derefter scriptet som administrator for at klargøre klasser og notesbøger i stor skala:

Eksempel på script

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

Fejlfinding: tildeling af tilladelser til eksisterende klassewebsteder

Bemærk

Denne fremgangsmåde kræver også, at den person, der kører scriptet, er webstedsadministrator, som beskrevet her. Scriptet nedenfor indeholder et trin til at tilføje den bruger, der er logget på i øjeblikket, som webstedsadministrator for de websteder, der kræver fejlfinding.

Hvis du allerede har klargjort klasser og observerer fejl eller problemer med tilladelser i Klassenotesbog eller Teams-opgaver, kan du opdatere webstedstilladelser for dine klasser ved hjælp af følgende script og erstatte parameteren rawGroups med groupIDs for de berørte klasser:

Eksempel på script

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