הקצאת כיתות בקנה מידה נרחב באמצעות PowerShell ו- Microsoft Graph

ככל ש- Microsoft משפרת את מצב האבטחה שלה בכל המוצרים והשירותים, חלו שינויים בפונקציונליות של API שעשויים להשפיע על לקוחות שבעבר הסתמכו על הרשאות של אפליקציה בלבד כדי להקצות מחברות כיתה וצוותי כיתה באמצעות ממשקי 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, שיכלול את כל הגדרות הכיתה הדרושות עבור כיתות ומחברות. פשוט התאם אישית את שם התצוגה הרצוי בקובץ ה- Script הבא והפעל אותו כמנהל מערכת.

חשוב

קובץ ה- Script הבא דורש שימוש ב - Microsoft Teams PowerShell גירסה 7.3.1 ואילך. 

קובץ Script לדוגמה

# 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. ערוך את הפרמטרים שבראש קובץ ה- Script הבא לפי הצורך ולאחר מכן הפעל את קובץ ה- Script כמנהל מערכת כדי להקצות כיתות ומחברות בקנה מידה גדול:

קובץ Script לדוגמה

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

פתרון בעיות: הענקת הרשאות לאתרי כיתה קיימים

הערה

גישה זו גם דורשת שהאדם המפעיל את קובץ ה- Script יהיה מנהל אתר, כמתואר כאן. קובץ ה- Script שלהלן כולל שלב להוספת המשתמש המחובר כעת כמנהל אתר עבור האתרים הדורשים פתרון בעיות.

אם כבר הקצית כיתות ואתה מבחין בכשלים או בבעיות הרשאה במחברת כיתה או במטלות של Teams, באפשרותך לעדכן הרשאות אתר עבור הכיתות שלך באמצעות קובץ ה- Script הבא, ולהחליף את הפרמטר rawGroups במזהי הקבוצות של המחלקות המושפעות:

קובץ Script לדוגמה

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