わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

PowerShellを使って,Teamsにメンバーを一括登録

 10月1日から後期授業が始まりました.
 受講者は,1年後期の科目が120名ほど,2年後期の科目が100名弱です.前期と同じように,授業資料の提示や答案の提出にはMoodleを,質問対応などはTeamsの投稿やチャットを使用しています.
 今期は,授業開始前に受講者が決まっているので,ダウンロードできる履修者名簿をもとに,Moodleのコースと,Teamsのチームに,それぞれ一括登録しておきます.Moodleについてはインタフェースが変更されているものの登録方法は変わりません.問題はTeamsです.
 研究室のメンバーなら,個別にメールアドレスを打ち込んで,氏名が間違っていないのを確認して追加すればいいし,実際3年配属の4名にはそのようにしたのですが,100名前後となると,同じ方法をとりたくありません.
 そこで一括登録の方法を探してみると,PowerShellスクリプトが掲載されていました.

 「ユーザー配列」と「チーム名」を書き換えて,実行したものの,うまくいきませんでした.どうやらAdd-TeamUserのところで,追加ができていません.もう少し調べると,Add-TeamUserを行う直前のGet-Teamで,失敗していることがわかりました.
 ところで,Add-TeamUserの用法は,https://docs.microsoft.com/en-us/powershell/module/teams/add-teamuser?view=teams-psに載っています.パラメータに「-GroupId」というのがありますが,コピーしたPowerShellスクリプトではこれがなく,「|」で渡している形となっています.
 グループIDを見つけましょう.PowerShellを「管理者として実行」で起動し,以下のコマンドを実行しました.2番目の実行の途中で,ウィンドウが開き,Microsoftアカウントの認証がありました.

PS C:\WINDOWS\System32> Install-Module -Name MicrosoftTeams -Force
PS C:\WINDOWS\System32> Connect-MicrosoftTeams
PS C:\WINDOWS\System32> Get-Team -User 自分のメール@アドレス

 最後のコマンドで,所属しているTeamsのチームが出力されました.最初の,16進数をいくつかハイフンでつないだものが,グループIDです.
 スクリプトファイルを書き換えました.adduser.ps1という名前にし,デスクトップに置きました.

# Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Force
Install-Module -Name MicrosoftTeams -Force
$users = @("メール@アドレス","メール@アドレス",(略),"メール@アドレス")
$team_Name = "チーム名"
$gid = "グループID"
# Connect-MicrosoftTeams
foreach($u in $users){
    Write-Output "Add $u to $team_Name"
    Add-TeamUser -GroupId $gid -User $u -Role Member
    Write-Output "Done"
}
# Set-ExecutionPolicy -ExecutionPolicy Restricted -Force

 先ほどの,管理者で起動したPowerShellで,「Connect-MicrosoftTeams」を実行していたので,二度手間を避けるため,上記スクリプトではコメントアウトにしています.
 実行は次のとおりです*1

PS C:\WINDOWS\System32> cd C:\Users\takehikom\Desktop
PS C:\Users\takehikom\Desktop> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Force
PS C:\Users\takehikom\Desktop> .\adduser.ps1

 なのですが,「Add $u to $team_Name」のうち$team_Nameが文字化けして表示されました.adduser.ps1をBOM (Byte Order Mark)付きのUTF-8で保存すればよい*2と知ったのは,あとのことでした.
 ともあれメールアドレスをもとにユーザが登録されたのを,Teams内で確認できました.

*1:PowerShellスクリプトの実行にあたっては,https://www.atmarkit.co.jp/ait/articles/0709/20/news125.htmlが有用でした.

*2:Emacsで編集していました.https://qiita.com/jjzak/items/b2ade63da2f5cecf534cによると,C-x RET f utf-8-with-signature-dosとすればよいわけです.