Microsoft Teams 新年度準備（高校での年度更新作業・授業準備）

2020年度のコロナ対応でMicrosoft Teamsを用いて授業支援環境をつくってきましたが
新年度になるにあたって、年度更新作業が必要になったので、備忘録として記録に残します。
どなたかのお役に立てれば幸いです。

(2023年度に向けての作業で追記。 Premiumじゃないと使えない機能になったところなど)


#前提
- 高校での設定例です。（勤務している学校は3学年・8クラス）
- 「HRクラスごとにチームを作って、授業ごとにチャネルを作る」or「授業ごとにチームを作る」のいずれかになりますが、選択科目とかHRクラスをまたぐ授業クラスがあるので、「授業ごとにチームを作る」としています。
- 教員・生徒ともにOffice365のアカウント（アドレス・パスワード）を持っています。（事前にアカウントを作成している）

Office365 のドメインは　仮に contoso.ed.jpとして記述しています。

教員アカウント　→　hogehoge@contoso.ed.jp  ユーザ名は教員名をベースに付与
生徒アカウント　→　a000000@contoso.ed.jp　ユーザ名は prefix + 学籍番号6桁

各授業科目には　6桁の科目コードを設定　
（例えば　社会と情報なら　100115）
HRクラス、選択授業講座には　3桁のグループコードを設定
（例えば　1年8組なら　108）

各チームは、検索しやすいように
MailNickName を　a00_h2021_100115_108
DisplayName を　高21_社会と情報_1年8組
という風に頭に、年度やPrefixを設定しています。

###事前に作っておくデータ

- チームを設定する授業

|授業名（DisplayName)  |授業コード(MailNickName)  |
|---|---|
|高21_社会と情報_1年1組  |a00_h2021_100115_101  |
|高21_社会と情報_1年2組  |a00_h2021_100115_102  |
|…  |…  |

- 授業担当者（チームの所有者）

|授業コード(MailNickName)  |担当者（メールアドレス） |
|---|---|
|a00_h2021_100115_101  |sensei1@contoso.ed.jp  |
|a00_h2021_100115_102  |sensei2@contoso.ed.jp  |
|…  |…  |

- 授業の受講者（チームのメンバー）

|授業コード(MailNickName)  |生徒（メールアドレス） |
|---|---|
|a00_h2021_100115_101  |a000001@contoso.ed.jp  |
|a00_h2021_100115_101  |a000002@contoso.ed.jp  |
|a00_h2021_100115_101  |a000003@contoso.ed.jp  |
|…  |…  |

上記のデータをExcel等で事前に準備。このリストからコマンドにする部分の説明は省略してます。


#作業のながれ
- 新年度チーム作成（3月末ごろに準備はじめる）
- 旧年度チームをアーカイブ（4月に入ったらすぐ）
- 新入生のポリシー設定
- 新年度チームへの所属（教員）
- 新年度チームへの所属（生徒）

##事前準備
学校内の端末がWin8.1なので、PowershellのVersionを調べて、必要ならアップデート。

###PowerShellのVersionが5.1以上になっているか確認
```
> Get-Host | Select-Object Version

Version
-------
4.0
```
https://www.microsoft.com/download/details.aspx?id=54616

```

> Get-Host | Select-Object Version

Version
-------
5.1.14409.1005
```

###PowerShell の MicrosoftTeams モジュールをインストール
（TLS1.2でアクセスを強制する設定しないとだめだった…）
Install-Moduleだけで上手くいく場合は、最初の一行は不要


``` モジュールをインストール.ps1
[Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bOR [Net.SecurityProtocolType]::Tls12
Install-Module MicrosoftTeams

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process
Import-Module MicrosoftTeams -Force
```

###(確認)現在あるチームをリストアップ
``` チームをリストアップ.ps1
Connect-MicrosoftTeams
Get-Team | Out-GridView  #画面に表示
Get-Team | Select * | Set-Clipboard #クリップボードにコピー
Get-Team | Where-Object {$_.MailNickName -match ".*108$"} #末尾が108=1年8組のチームだけ検索

```
---

##新年度チーム設定

「チームを設定する授業」　のデータから↓のコマンドをつくる。

``` チームを追加.ps1
New-Team -DisplayName "高21_社会と情報_1年1組" -MailNickName "a00_h2021_100115_101" -Template "EDU_Class" -Owner "sensei1@contoso.ed.jp" -AllowGiphy $true -GiphyContentRating "strict" -AllowStickersAndMemes $true -AllowCustomMemes $true -AllowGuestCreateUpdateChannels $false -AllowGuestDeleteChannels $false -AllowCreateUpdateChannels $false -AllowDeleteChannels $false -AllowAddRemoveApps $false -AllowCreateUpdateRemoveTabs $false -AllowCreateUpdateRemoveConnectors $false -AllowUserEditMessages $true -AllowUserDeleteMessages $true -AllowOwnerDeleteMessages $true -AllowTeamMentions $true -AllowChannelMentions $true -ShowInTeamsSearchAndSuggestions $true -RetainCreatedGroup
```

科目ごとに生徒が検索しやすいように、教科ごと科目毎に色分けしてアイコンを別途作成してある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242233/ad7af2c1-e2d2-1558-f7c3-9d09576bdf0d.png)


``` アイコン設定.ps1
Get-Team -MailNickName "a00_h2021_100115_101" | Set-TeamPicture -ImagePath ".\100115.png"
```


###できないこと（ほんとはしたいこと）
チームでの投稿や返信を生徒からさせたくない（勝手に掲示板状態にならないように）
だけど、
~~チームのモデレーション設定（GraphAPI？）~~ 
「一般」チャネルのモデレーションはPowerShellやGraphAPIでは設定不可（今回は全部手作業）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242233/6c11ceca-cb61-2204-6c67-980197b413f1.png)


---
## 旧年度をリードオンリー

2020年度のチームをすべてArchiveする。（ReadOnlyになる）　　
MailNickNameでフィルタして2020年度の

``` 旧年度をアーカイブ.ps1
$teams = Get-Team
$teams | Where-Object { $_.MailNickName -like "a00_h2020_*" -and $_.Archived -eq $false } | Set-TeamArchivedState -Archived $true
```


上のコマンドで
SetSpoSiteReadOnlyForMembers $true　がうまく効かないことがあったので
SharePointOnline モジュールで、個別にLockStateをReadOnlyに設定
(例 2020年度のサイトをすべてReadOnlyに設定変更）

```  SharePointをReadonly.ps1
Install-Module -Name Microsoft.Online.SharePoint.PowerShell

Connect-SPOService -Url https://contosoedjp-admin.sharepoint.com
#状態を調べる
Get-SPOSite -Limit ALL | Where-Object { $_.Url -like "*a00_h2020_*"} | Select Url,LockState 
#設定する
Get-SPOSite -Limit ALL | Where-Object { $_.Url -like "a00_h2020_*"} | Set-SPOSite -LockState "ReadOnly"
```

---
##生徒ポリシー一括設定（新入生）
あらかじめ　ユーザは設定している。

テキストファイルには
a000001@contoso.ed.jp
a000002@contoso.ed.jp
a000003@contoso.ed.jp
と、ユーザ名（メールアドレス）を一覧にしている。

Teams管理画面で、ポリシーパッケージ「高校生」をカスタムで設定してある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242233/22d442a5-c0f6-434f-6bd3-aa9d0c7c5764.png)
設定方法はここでは省略

``` ポリシー設定（旧).ps1
Conncet-MicrosoftTeams
$users | Grant-CsTeamsAppPermissionPolicy -PolicyName "高校生"
$users | Grant-CsTeamsAppSetupPolicy -PolicyName "高校生"
$users | Grant-CsTeamsCallingPolicy -PolicyName "高校生"
$users | Grant-CsTeamsMeetingBroadcastPolicy -PolicyName "高校生"
$users | Grant-CsTeamsMessagingPolicy -PolicyName "高校生"
$users | Grant-CsTeamsMeetingPolicy -PolicyName "高校生"
```




↓カスタムポリシーパッケージでの設定方法(Premiumじゃないとできなくなった)
``` ポリシー設定.ps1
Conncet-MicrosoftTeams
$users = Get-Content "ユーザー一覧のテキストファイル"

$Users | ForEach-Object { Grant-CsUserPolicyPackage  -Identity $_ -PackageName "高校生" }
```


##新年度チームへの所属（教員）
毎回 Get-Teamをすると時間がかかるので、いったん$team に読み込んでから
Where-Object で 科目コード等でフィルタして、そこに教員ユーザを -Role Owner（所有者）で追加しています。
-Verboseは画面出力のメッセージがたくさん出るので進捗状況確認用

``` ユーザ所属（教員）.ps1
$team = Get-Team
$team | Where-Object { $_.MailNickName -eq "a00_h2021_100115_101" } |Add-TeamUser -User "sensei1@contoso.ed.jp" -Role Owner -Verbose
$team | Where-Object { $_.MailNickName -eq "a00_h2021_100115_101" } |Add-TeamUser -User "sensei2@contoso.ed.jp" -Role Owner -Verbose
```
※所有者への昇格などユーザにポップアップで通知されたりするので、真夜中に作業すると教員からクレームがくるかも…

##新年度チームへの所属（生徒）
基本は教員の追加と同じ。-Role Ownerを入れないとメンバーとして追加される。

``` ユーザ所属（生徒）.ps1
$team = Get-Team
$team | Where-Object { $_.MailNickName -eq "a00_h2021_100115_101" } |Add-TeamUser -User "a000001@contoso.ed.jp" -Verbose
$team | Where-Object { $_.MailNickName -eq "a00_h2021_100115_101" } |Add-TeamUser -User "a000002@contoso.ed.jp" -Verbose
$team | Where-Object { $_.MailNickName -eq "a00_h2021_100115_101" } |Add-TeamUser -User "a000003@contoso.ed.jp" -Verbose
```

※だいたい1000件で10分…結構時間がかかります。



###作業後の確認

チームと所属するメンバーを一覧にする場合は↓

``` チーム所属メンバーを調べる.ps1
$teams = @();
$team = Get-Team
$team | Where-Object { $_.MailNickName -like "a00_h2021_*" } | ForEach-Object {
	$groupId = $_.GroupId
	$displayName = $_.DisplayName
	$mailNickName = $_.MailNickName

	$_ | Get-TeamUser | ForEach-Object {
		$obj = New-Object object
		$obj | Add-Member -NotePropertyMembers @{
			"GroupId"       = $groupId ;
			"DisplayName"   = $displayName;
			"MailNickName" 	= $mailNickName;
			"User"		= $_.User;
			"Name"		= $_.Name;
			"Role"		= $_.Role;

		}
		$teams += ($obj | Select GroupId,MailNickName,DisplayName,User,Name,Role) 
	}	
}
$teams | Select * 
```

単にユーザ数だけ調べる場合は↓

``` ユーザ数調べる.ps1
$team = Get-Team
$team | Where-Object { $_.MailNickName -like "a00_h2021_*" } | ForEach-Object {
	$users = Get-TeamUser -GroupId $_.groupid
	$count = $users.count
	Write-Host $_.MailNickName,$count
}
```

---
##参考情報

https://docs.microsoft.com/en-us/powershell/module/teams/?view=teams-ps

##補足
勤務校はロイロノート・スクールを使っていて、ロイロの授業区分にあわせてTeamsの各チームを設定しました。
学校向けに特化したロイロはやっぱり便利なので、それくらいTeamsの設定が簡単になったら…と思いますが、あまりやり過ぎるのガラパゴス化しちゃうので、難しいところですね。