توفير فصول دراسية على نطاق واسع باستخدام PowerShell وMicrosoft Graph

نظرا لأن Microsoft تعمل على تحسين وضع الأمان عبر جميع المنتجات والخدمات، فقد تم إدخال تغييرات على وظيفة واجهة برمجة التطبيقات التي قد تؤثر على العملاء الذين اعتمدوا سابقا على أذونات التطبيق فقط لتوفير دفاتر ملاحظات للصفوف وفرق الصفوف باستخدام واجهات برمجة التطبيقات.

ملاحظة

في معظم الحالات، نوصي باستخدام School Data Sync(SDS)، وهي خدمة مجانية تساعد على أتمتة عملية مزامنة بيانات المستخدم والكشف من معلومات الطلاب أو أنظمة الإدارة باستخدام Microsoft 365. يساعدك SDS على إدارة مؤسستك التعليمية والمستخدمين والفصول والأدوار، ومزامنة بياناتك مع Microsoft Entra ID وMicrosoft 365، حتى تتمكن من استخدام Microsoft Teams و Intune for Education و 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'

الخيار الثاني: استخدام 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 بمعرفات المجموعات الخاصة بالفصول المتأثرة:

برنامج نصي نموذجي

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