Масштабне забезпечення класів за допомогою PowerShell і Microsoft Graph

Корпорація Майкрософт посилює свій рівень безпеки в усіх продуктах і службах, і функції API змінюються, що може вплинути на користувачів, які раніше покладалися на дозволи лише для програм, щоб підготувати Блокноти для класів і Teams класів за допомогою API.

Примітка.

У більшості випадків ми радимо використовувати School Data Sync – безкоштовну службу, яка допомагає автоматизувати процес синхронізації даних користувачів і списків учасників із систем керування даними про учнів або системами керування за допомогою Microsoft 365. SDS допомагає керувати навчальним закладом, користувачами, класами та ролями, синхронізуючи дані з Microsoft Entra ID і Microsoft 365, що дає змогу використовувати Microsoft Teams, Intune for Education, Exchange Online, SharePoint Online і Блокноти OneNote для класу, а також використовувати програми сторонніх постачальників завдяки інтеграції Єдиний вхід.

Ви й надалі зможете підготувати класи та блокноти в масштабі за допомогою PowerShell і Microsoft Graph, дотримуючись підтримуваних методів. У цій статті описано кроки та наведено посилання на відповідну документацію.

Важливо

Якщо ви працюєте зі стороннім партнером над масштабним забезпеченням занять, поділіться з ним цією статтею, перш ніж робити кроки самостійно.

Підготовка нових класів

Попередження

До 21 серпня 2025 р. попередня версія цієї документації рекомендувала підготовку за допомогою Teams PowerShell до внесення обов'язкових оновлень. Ці оновлення завершено, і ви можете продовжити застосовувати цей підхід зараз. Дякую за терпіння.

За допомогою Teams PowerShell дуже просто підготувати нові класи (це забезпечить все необхідне налаштування класів і блокнотів). Просто налаштуйте потрібне коротке ім'я в сценарії нижче та запустіть його від імені адміністратора.

Важливо

Для наведеного нижче сценарію потрібно використовувати Microsoft Teams PowerShell версії 7.3.1 або новішої. 

Зразок сценарію

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

Варіант 2. За допомогою Microsoft Graph PowerShell

Якщо у вас немає доступу до Teams PowerShell, ви можете дослідити класи підготовки у великих масштабах за допомогою Microsoft Graph. Відредагуйте параметри у верхній частині сценарію нижче, а потім запустіть сценарій від імені адміністратора, щоб підготувати класи й блокноти в масштабі:

Зразок сценарію

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

Виправлення неполадок: надання дозволів наявним сайтам класів

Примітка.

Крім того, особа, яка запускає сценарій, має бути адміністратором сайту, як описано тут. Нижче наведено сценарій, щоб додати користувача, який ввійшов у систему, як адміністратора сайтів для сайтів, яким потрібно виправити неполадки.

Якщо ви вже підготували класи й спостерігаєте помилки або проблеми з дозволами в Блокноті для класу або призначеннях Teams, ви можете оновити дозволи сайту для своїх класів за допомогою сценарію нижче, замінивши параметр rawGroups на ідентифікатори груп відповідних класів:

Зразок сценарію

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