Osztályok nagy mértékű kiépítése a PowerShell és a Microsoft Graph használatával

Mivel a Microsoft az összes termékre és szolgáltatásra vonatkozóan fokozza biztonsági helyzetét, olyan változások történtek az API működésében, ami hatással lehet azokra az ügyfelekre, akik korábban csak alkalmazás engedélyekkel végezték az osztályjegyzetfüzetek és az osztálycsoportok API-k használatával történő kiépítését.

Megjegyzés

A legtöbb esetben az Iskolai adatok szinkronizálása (SDS) ingyenes szolgáltatás használatát javasoljuk, amely segít automatizálni a felhasználói adatok és a résztvevőlista adatainak a Microsoft 365-tel való szinkronizálását. Az SDS segítségével kezelheti oktatási szervezetét, felhasználóit, osztályait és szerepköreit, szinkronizálhatja adatait a Microsoft Entra ID és a Microsoft 365 segítségével, így használhatja a Microsoft Teamst, az Intune for Educationt, az Exchange Online-t, a SharePoint Online-t és a OneNote Osztályjegyzetfüzeteket, és engedélyezheti a külső alkalmazások használatát az Egyszeri bejelentkezés funkcióval integráció szempontjából.

Továbbra is kiépíthet nagy méretekben osztályokat és jegyzetfüzeteket a PowerShell és a Microsoft Graph használatával a támogatott módszereket követve. Ez a cikk összefoglalja ennek lépéseit, és a vonatkozó dokumentációra mutató hivatkozásokat tartalmaz.

Fontos

Ha külső partnerrel dolgozik együtt az osztályok nagy mértékű kiépítésén, ossza meg vele ezt a cikket, mielőtt saját lépéseket tenne.

Új osztályok kiépítése

Figyelmeztetés

2025. augusztus 21. előtt a dokumentáció egy korábbi verziója a Teams PowerShellen keresztüli kiépítést javasolta a szükséges frissítések elvégzése előtt. Ezek a frissítések befejeződtek, és most folytathatja ezt a megközelítést. Köszönjük a türelmét.

Egyszerűen kiépíthet új osztályokat a Teams PowerShell használatával, amely tartalmazza az osztályok és a jegyzetfüzetek összes szükséges beállítását. Egyszerűen szabja testre a kívánt megjelenítendő nevet a következő parancsfájlban, és futtassa rendszergazdaként.

Fontos

A következő parancsfájl használatához a Microsoft Teams PowerShell 7.3.1-es vagy újabb verziója szükséges. 

Minta parancsprogram

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

2. lehetőség: A Microsoft Graph PowerShell használata

Ha nem rendelkezik hozzáféréssel a Teams PowerShellhez, érdemes lehet felfedezni az osztályok nagy léptékű kiépítését a Microsoft Graph használatával. Szükség szerint szerkessze a következő parancsfájl tetején lévő paramétereket, majd futtassa a parancsfájlt rendszergazdaként az osztályok és jegyzetfüzetek nagy léptékű kiépítéséhez:

Minta parancsprogram

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

Hibaelhárítás: engedélyek megadása meglévő osztálywebhelyeknek

Megjegyzés

Ehhez a megközelítéshez a parancsfájlt futtató személynek szintén webhelyrendszergazdának kell lennie, az itt leírtak szerint. Az alábbi parancsfájl egy lépést tartalmaz a jelenleg bejelentkezett felhasználó webhelygazdaként való hozzáadásához azokra a webhelyekre, amelyek hibaelhárítást igényelnek.

Ha már kiépített osztályokat, és az Osztályjegyzetfüzettel vagy a Teams-feladatokkal kapcsolatos hibákat vagy jogosultsági problémákat tapasztal, a következő szkripttel frissítheti az osztályai webhelyengedélyeit, és a rawGroups paramétert lecserélheti az érintett osztályok groupID azonosítójára:

Minta parancsprogram

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