隨著 Microsoft 在所有產品與服務中強化安全防護,API 功能也發生 了變化 ,這些變更可能影響過去依賴僅應用程式權限來使用 API 配置 Class Notebook 和 Class Teams 的客戶。
注意
在大多數情況下,我們建議使用 School 資料同步 (SDS) ,這是一項免費服務,能自動化學生資訊或管理系統中使用者與名冊資料與 Microsoft 365 的同步流程。 SDS 協助你管理教育組織、使用者、課程與角色,並將資料與 Microsoft Entra ID 及 Microsoft 365 同步,讓你能使用 Microsoft Teams、Intune for Education、Exchange Online、SharePoint Online、OneNote Class 筆記本,並啟用具備單一登入整合的第三方應用程式。
你仍然可以透過 PowerShell 和 Microsoft Graph 依照支援的方法大規模配置類別和筆記本。 本文概述步驟並提供相關文件連結。
重要
如果你正與第三方合作夥伴合作進行大規模課程的配置,請在自行採取行動前先分享這篇文章給他們。
新類別的配置
建議 (選項一) :使用 Teams PowerShell
警告
在 2025 年 8 月 21 日之前,本文件的先前版本建議在必要更新前先透過 Teams PowerShell 進行配置。 這些更新現已完成, 您現在就可以繼續進行此方法。 感謝您的耐心等候。
使用 Teams PowerShell 配置新類別非常簡單,該軟體包含所有類別和筆記本的必要設定。 只要在以下腳本中自訂所需的顯示名稱,並以管理員身份執行即可。
重要
以下腳本要求你使用 Microsoft Teams PowerShell 7.3.1 版本 或更新版本。
範例腳本
| # 使用 Teams PowerShell SDK Install-Module -MicrosoftTeams -force -AllowClobber New-Team -DisplayName 'Test Class 20251208.4' -模板 'EDU_Class' |
|---|
選項二:使用 Microsoft Graph PowerShell
如果你無法使用 Teams PowerShell,或許可以嘗試使用 Microsoft Graph 進行大規模配置類別。 請根據適當情況編輯以下腳本頂端的參數,然後以管理員身份執行腳本,以大規模配置類別與筆記本:
範例腳本
| # 使用 MS 圖形 API Install-Module Microsoft.Graph -AllowClobber -Force # 參數 $Name = 「Test Class 20251208.3」 $Description = 「A Test Class」 $Mail = $Name -替換 '[^a-zA-Z0-9\s]|[ ]', '' # 將此郵件別名替換為偏好產生方法 $OwnerId = “000-0000-00000-00000-0000” # 以擁有者的 GUID 替換 # ------------ # 建立新的 M365 群組 $CreateGroupBody = @" { "描述“: ”$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 -MethodPOST -ContentType “application/json” # 從群組建立 Teams 類別 團隊 $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 |
|---|
故障排除:授權現有類別網站權限
注意
此方法也要求執行腳本的人是網站管理員,如 此處所述。 以下腳本包含一個步驟,可以將目前已登入的使用者新增為需要故障排除網站的網站管理員。
如果你已經設定好類別,且發現 Class Notebook 或 Teams 指派出現失敗或權限問題,你可以使用以下腳本更新類別的網站權限,將 rawGroups 參數替換成受影響類別的 GroupID:
範例腳本
| #You 需要透過以下 -Scopes Sites.FullControl.All 連接 SharePoint、Exchange Online 和 Graph,並收集受影響的類別團隊 ID,$rawGroups =@ (“b0a5905d-09ae-4605-8e12-94da93ecbe92”,“e0eec729-24ef-451e-b079-56d0baf4dfc9”) # 轉換為帶有 .groupid 的物件陣列 $groups = $rawGroups | ForEach-Object { Get-UnifiedGroup -Identity $_ } $step = 0 #get 目前登入的使用者帳號,新增為網站管理員 $CUA = (get-mgcontext) .account foreach ($group in $groups) { $step = $step + 1 Set-SPOUser -Site $group.SharePointSiteUrl -LoginName $CUA -IsSiteCollectionAdmin $true Write-Host「SiteCollectionAdmin 新增於 $ ($Groups.Count) 類別網站」#Pause$step 5 分鐘後開始建立一般資料夾 Write-Host「在新增 perms 以允許 SiteCollectionAdmin 傳播前暫停 5 分鐘」Start-Sleep -300 秒 Write-Host 「正在處理 $ ($Groups.Count) 類別」 $groups) 中每個 ($group { #$step = $step + 1 $Site = Get-MgGroupSite -GroupID $group。ExternalDirectoryObjectId -SiteId “root” $SiteId = $Site.Id Write-Host “處理權限在 $ ($Groups.Count) 類別$step” # 這些是常見 Microsoft EDU 應用程式的 AppIds $AppIds = @{ “8f348934-64be-4bb2-bc16-c54c96789f43”=“EDU Assignments”;“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 “Processed $ ($Groups.Count) Classes, removing sitecollectionadmin” $step = 0 for each ($group in $groups) { $step = $step + 1 Set-SPOUser -Site $group.SharePointSiteUrl -LoginName $CUA -IsSiteCollectionAdmin $false Write-Host「SiteCollectionAdmin 於 $step ($Groups.Count) 類別網站被移除」} |
|---|