Zřizování tříd ve velkém měřítku pomocí PowerShellu a Microsoft Graphu

S tím, jak Microsoft vylepšuje svůj stav zabezpečení ve všech produktech a službách, došlo ke změnám funkcí rozhraní API, které mohou mít dopad na zákazníky, kteří se dříve při zřizování poznámkových bloků předmětů a týmů předmětů pomocí rozhraní API spoléhali na oprávnění pouze pro aplikace.

Poznámka

Ve většině případů doporučujeme používat School Synchronizace dat (SDS), což je bezplatná služba, která pomáhá automatizovat proces synchronizace dat uživatelů a seznamů studentů z informačních systémů studentů nebo systémů pro správu s Microsoft 365. SDS vám pomůže spravovat vzdělávací organizaci, uživatele, předměty a role, synchronizuje data s Microsoft Entra ID a Microsoftem 365, takže můžete používat Microsoft Teams, Intune for Education, Exchange Online, SharePoint Online, Onenotové poznámkové bloky předmětů a povolit aplikace třetích stran s Jednotné přihlašování integrace.

Třídy a poznámkové bloky můžete dál zřizovat ve velkém měřítku pomocí PowerShellu a Microsoft Graphu pomocí podporovaných metod. Tento článek popisuje jednotlivé kroky a poskytuje odkazy na příslušnou dokumentaci.

Důležité

Pokud spolupracujete s partnerem třetí strany na zřizování tříd ve velkém měřítku, než podniknete kroky sami, nasdílejte s ním tento článek.

Zřizování nových tříd

Varování

Před 21. srpnem 2025 doporučovala předchozí verze této dokumentace zřizování přes Teams PowerShell před provedením požadovaných aktualizací. Tyto aktualizace jsou nyní dokončeny a v tuto chvíli můžete pokračovat v tomto přístupu. Děkujeme za vaši trpělivost.

Nové předměty můžete snadno zřizovat pomocí Teams PowerShellu, který bude zahrnovat všechna potřebná nastavení pro předměty a poznámkové bloky. Jednoduše přizpůsobte požadovaný zobrazovaný název v následujícím skriptu a spusťte jej jako správce.

Důležité

Následující skript vyžaduje, abyste používali Microsoft Teams PowerShell verze 7.3.1 nebo novější. 

Ukázka skriptu

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

Možnost 2: Použití Microsoft Graph PowerShellu

Pokud nemáte přístup k Teams PowerShellu, možná budete chtít prozkoumat zřizování tříd ve velkém měřítku pomocí Microsoft Graphu. Podle potřeby upravte parametry v horní části následujícího skriptu a pak spusťte skript jako správce, aby se zřizovaly třídy a poznámkové bloky ve velkém měřítku:

Ukázka skriptu

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

Řešení potíží: Udělení oprávnění existujícím webům tříd

Poznámka

Tento přístup bude také vyžadovat, aby osoba, která skript spouští, byla správcem webu, jak je popsáno tady. Následující skript obsahuje krok, jak přidat aktuálně přihlášeného uživatele jako správce webu pro weby, které vyžadují řešení potíží.

Pokud jste už třídy zřídili a pozorujete chyby nebo problémy s oprávněními u Poznámkového bloku předmětu nebo zadání v Teams, můžete aktualizovat oprávnění webu pro vaše předměty pomocí následujícího skriptu a nahradit parametr rawGroups identifikátory skupin dotčených tříd:

Ukázka skriptu

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