Microsoft는 모든 제품 및 서비스에서 보안 태세를 강화함에 따라 이전에 API를 사용하여 수업용 전자 필기장 및 수업용 Teams를 프로비전하기 위해 앱 전용 권한에 의존했던 고객에게 영향을 미칠 수 있는 API 기능이 변경 되었습니다.

참고: 대부분의 경우 학생 정보 또는 관리 시스템의 사용자 및 명단 데이터를 Microsoft 365와 동기화하는 프로세스를 자동화하는 데 도움이 되는 무료 서비스인 SDS(학교 데이터 동기화)를 사용하는 것이 좋습니다. SDS를 사용하면 교육 organization, 사용자, 수업 및 역할을 관리하고 데이터를 Microsoft Entra ID 및 Microsoft 365와 동기화하여 Microsoft Teams, 교육용 Intune, Exchange Online, SharePoint Online, OneNote 수업용 전자 필기장을 사용하고 타사 앱을 사용하도록 설정할 수 있습니다. Single Sign On 통합.

지원되는 메서드에 따라 PowerShell 및 Microsoft Graph를 사용하여 클래스 및 Notebook을 대규모로 프로비전할 수 있습니다. 이 문서에서는 단계를 간략하게 설명하고 관련 설명서에 대한 링크를 제공합니다.

중요: 클래스의 대규모 프로비저닝에 대해 타사 파트너와 함께 작업하는 경우 직접 단계를 수행하기 전에 이 문서를 공유하세요.

새 클래스 프로비전

옵션 1(권장): Teams PowerShell 사용

경고: 2025년 8월 21일 이전에는 이 설명서의 이전 버전에서 필요한 업데이트가 이루어지기 전에 Teams PowerShell을 통한 프로비저닝을 권장했습니다. 이제 이러한 업데이트가 완료되었으며 현재 이 방법을 진행할 수 있습니다. 기다려 주셔서 감사합니다.

Teams PowerShell을 사용하여 새 클래스를 프로비전하는 것은 간단합니다. 여기에는 클래스 및 Notebook에 필요한 모든 설정이 포함됩니다. 다음 스크립트에서 원하는 표시 이름을 사용자 지정하고 관리자 권한으로 실행하기만 하면됩니다.

중요: 다음 스크립트를 사용하려면 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'

옵션 2: Microsoft Graph PowerShell 사용

Teams PowerShell에 액세스할 수 없는 경우 Microsoft Graph를 사용하여 대규모로 프로비저닝 클래스를 탐색할 수 있습니다. 다음 스크립트의 맨 위에 있는 매개 변수를 적절하게 편집한 다음, 관리자 권한으로 스크립트를 실행하여 클래스 및 Notebook을 대규모로 프로비전합니다.

샘플 스크립트

# 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 매개 변수를 영향을 받는 클래스의 groupID로 바꿀 수 있습니다.

샘플 스크립트

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

도움이 더 필요하세요?

더 많은 옵션을 원하세요?

구독 혜택을 살펴보고, 교육 과정을 찾아보고, 디바이스를 보호하는 방법 등을 알아봅니다.