Подготовка классов в большом масштабе с помощью PowerShell и Microsoft Graph

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

Примечание

В большинстве случаев рекомендуется использовать бесплатную службу School Синхронизация данных (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 или более поздней. 

Пример скрипта

# Использование пакета SDK Для Teams PowerShell Install-Module -MicrosoftTeams -Force -AllowClobber New-Team -DisplayName 'Test Class 20251208.4' -Template 'EDU_Class'

Вариант 2. Использование Microsoft Graph PowerShell

Если у вас нет доступа к Teams PowerShell, вы можете изучить классы подготовки в большом масштабе с помощью Microsoft Graph. Измените параметры в верхней части следующего скрипта соответствующим образом, а затем запустите скрипт от имени администратора для подготовки классов и записных книжек в большом масштабе:

Пример скрипта

# Использование MS API Graph Install-Module Microsoft.Graph -AllowClobber -Force # PARAMETERS $Name = "Test Class 20251208.3" $Description = "A Test Class" $Mail = $Name -replace '[^a-zA-Z0-9\s]|[ ]', '' # Замените этот псевдоним почты предпочитаемым методом создания $OwnerId = "000-0000-00000-000000-0000" # Замените это идентификатором GUID владельца # ------------ # Создание новой группы M365 $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" ], "видимость": "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 необходимо подключиться к SharePoint, Exchange Online, и Graph со следующими объектами -Scopes Sites.FullControl.All, а также соберите идентификаторы групп групп, затронутых $rawGroups Exchange Online =@("b0a5905d-09ae-4605-8e12-94da93ecbe92","e0eec729-24ef-451e-b079-56d0baf4dfc9") # Convert to массив объектов с .groupid $groups = $rawGroups | ForEach-Object { Get-UnifiedGroup -Identity $_ } $step = 0 #get учетную запись пользователя, вошедшего в систему, добавить в качестве $CUA администратора сайта = (get-mgcontext).account foreach ($group в $groups) { $step = $step + 1 Set-SPOUser -Site $group. SharePointSiteUrl -LoginName $CUA -IsSiteCollectionAdmin $true Write-Host "SiteCollectionAdmin добавлен на $step сайтов классов $($Groups.Count) } #Pause в течение 5 минут, прежде чем создать общую папку Write-Host "Приостановка в течение 5 минут перед добавлением перм , чтобы разрешить распространение siteCollectionAdmin" Start-Sleep -Seconds 300 Write-Host "Working on $($Groups.Count) Classes" foreach ($group в $groups) { #$step = $step + 1 $Site = Get-MgGroupSite -GroupId $group. ExternalDirectoryObjectId -SiteId "root" $SiteId = $Site.Id Write-Host "Обработка разрешений на $step классов $($Groups.Count) " # Это AppId для общих EDU Microsoft Приложения $AppIds = @{ "8f348934-64be-4bb2-bc16-c54c96789f43"="Назначения EDU"; "22d27567-b3f0-4dc2-9ec2-46ed368ba538"="Задания чтения"; "2d4d3d8e-2be3-4bef-9f87-7875a61c29de"="OneNote"; "c9a559d2-7aab-4f13-a6ed-e7e9c52aec87"="Microsoft Forms"; " 13291f5a-59ac-4c59-b0fa-d1632e8f3292"="EDU OneNote"; } # Применение разрешений к сайту группы $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 "Обработанные $($Groups.Count) классы, удаление sitecollectionadmin" $step = 0 foreach ($group в $groups) { $step = $step + 1 Set-SPOUser -Site $group. SharePointSiteUrl -LoginName $CUA -IsSiteCollectionAdmin $false Write-Host "SiteCollectionAdmin удален на $step сайтов классов $($Groups.Count) " }