Підготовка класів у масштабі за допомогою PowerShell і Microsoft Graph

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

Примітка.

У більшості випадків ми радимо використовувати School Data Sync(SDS) – безкоштовну службу, яка допомагає автоматизувати процес синхронізації даних користувачів і списків із системи керування інформацією про учнів і студентів із Microsoft 365. SDS дає змогу керувати навчальною організацією, користувачами, класами та ролями, синхронізувати дані з Microsoft Entra ID та Microsoft 365, щоб ви могли використовувати Microsoft Teams, Intune для навчальних закладів, 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 на ідентифікатори groupID відповідних класів.

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

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