👥

Microsoft Teams のチームに大量のメンバーをメールアドレスから自動で追加する方法

2022/12/12に公開
6

本ドキュメントは PowerShell を用いた Microsoft Teams のチームへの自動一括追加のやり方について解説したものです。
学生・社員を特定のチームに一括で追加したい場合などに活用してください。


これは 天久保 Advent Calendar 2022 の 12 日目の記事です。


背景

Microsoft Teams に一括で大量のメンバーを追加したいことがたまにあります。しかし現在(2022/12/12)の Microsoft Teams の仕組みでは、名前での個別入力か、配布リスト・セキュリティグループでの一括追加しかできません。

しかし大学の授業や会社のプロジェクトなどで、事前にグループなどが定義されていないたくさんのメンバーを一度に追加したいことがあると思われます。その場合はひとりひとりのメールアドレスを一つづつ入力していくしかないのが現状です。

とはいえ、それでは手間がかかりますし、何よりミスを誘発します。

そこで本記事では PowerShell を用いた Microsoft Teams のチームへの自動一括追加のやり方について解説します。他にもチームへメンバーを自動で一括追加する方法がありますが、この方法が一番シンプルで、余計なものをあまりインストールしなくても良いのでオススメです。

もし以下の方法でエラーが出た場合はコメントをいただけると幸いです。

前提条件

  • Windows 11 (10) を使用している
    • 筆者が Windwos 11 Home で確認したというだけで Windows 10 でも動作すると思います
  • チームに追加したいメンバーのメールアドレスが分かっている
  • あなたが追加したいチームの管理者である
    • ご自身でチームを作成した場合はおそらく管理者になっているはずです

実行手順

全体方針

PowerShell から Microsoft Teams PowerShell モジュールを用いて、CSV に保存されたメールアドレスの情報をもとに任意のチームにメンバーを一括追加します。
WEB API 経由で追加する方法などもありますが、今回 Microsoft Teams PowerShell モジュールを用いる理由は、他の方法と比べて Teams との連携がスムーズなためです。

Microsoft Teams PowerShell モジュールをインストール

Microsoft Teams PowerShell モジュールは PowerShell から Microsoft Teams と連携するためのツールです。PowerShell から連携できるので、今回のようにコマンドラインから色々な操作を自動化することができます。

スタートメニューから管理者権限で PowerShell を起動

後述するモジュールのインストールは管理者権限で行う必要があります。色々な方法がありますがここでは PowerShell 自体を管理者権限で起動する方法を取ります。

スタートメニューで PowerShell と検索
「管理者として実行する」から PowerShell を管理者モードで起動
PowerShell を管理者モードで起動する

モジュールをインストール

以下のコマンドでインストールすることができます。
もし失敗する場合は PowerShell のバージョンが古い、適切な .NET Framework がインストールされていないなどが考えられます。PowerShellGallery を使用したインストールに詳しい情報がありますので参考にしてみてください。

> Install-Module -Name PowerShellGet -Force -AllowClobber
> Install-Module -Name MicrosoftTeams -Force -AllowClobber

実行結果
実行結果

メールアドレスを CSV 形式で保存

追加したいメンバーのメールアドレスを CSV 形式で保存します。ここではemails.csvとして保存します。
先頭はemailという文字で始まり、一行ごとにメールアドレスを保存します。以下のような形式です。先頭の email という文字はそのまま残してください。 そうしないとエラーが発生します。(コメント欄により詳細な解説があります)

email
h20xxxx1@hosokawa.dev
h20xxxx2@hosokawa.dev
h20xxxx3@hosokawa.dev

実行権限を設定

今後のスクリプトを実行するのには現在のユーザに権限を設定する必要があります。
Set-ExecutionPolicy[1]は PowerShell ポリシーを設定するコマンドです。
このコマンドでは-Scope Processを指定しているため現在のプロセスにいる間だけ権限が付与されます。そのため PowerShell を途中で閉じた場合はこの作業をもう一度行う必要があります。
それが面倒な場合は-Scope CurrentUserを使用して現在のユーザに対して恒久的に権限を与えてください。

> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process

Microsft Teams と連携

ここでは Microsoft Teams PowerShell モジュールと Microsoft Teams を連携する作業を行います。

Connect-MicrosoftTeamsを入力するとポップアップが表示されるのでログインをします。

> Connect-MicrosoftTeams  # Teams と接続し権限を取得

以下のようにポップアップが出てきて Microsoft Teams の連携をするためにサインインが求められるので、サインインします。
ポップアップで表示されるログイン画面

自動追加スクリプトを作成

グループ ID を調べる

グループ ID とはチームに割り振られた ID のことです。

PowerShell で以下のコマンドを入力することでグループ ID を調べることができます。
-Userオプションには自分のアカウントのメールアドレスを入れてください。自分が所属しているチームのグループ ID が取得できます。

> Get-Team -User h2xxxxxx@hosokawa.dev  # チーム名とグループ ID の一覧を取得
GroupId                              DisplayName
-------                              -----------
2ef068eb-dea5-476d-98dc-e6059874d59d チーム AAAAAAA...
ce80767c-06de-4009-a4c4-c86f723efc01 チーム BBBBBBB...
432ca0b3-f219-4089-ba21-cf520bed18f8 チーム CCCCCCC
75f03c09-be9b-45d0-846d-a085f54916af チーム DDDDDDD...
87291ee5-608f-4ac0-9857-609f87dba60b チーム EEEEEEE...
458d7f8b-4cc0-46f6-b9f2-e98bc7bf28cd チーム HOSOKAWA...

スクリプトをダウンロード、修正

以下のスクリプトを作成します。
グループ ID と CSV のフルパスを設定するのを忘れないでください。
なおStart-Sleep 10;の箇所で待ち時間を短くすると手元の環境では失敗することがありました。

$groupId = "<グループ ID>"     # ex) 00000000-0000-0000-0000-000000000000
$csvPath = "<CSV のパス>"   # ex) .\emails.csv

Connect-MicrosoftTeams
Import-Csv -Path $csvPath | ForEach-Object {
    Add-TeamUser -GroupId $groupId -User $_.email;
    Write-Output "Added $($_.email)";
    Start-Sleep 10;
}

このスクリプトは以下のようにしてダウンロードすることもできます。

>  wget https://raw.githubusercontent.com/HosokawaR/teams-script/main/bulk-add-member.ps1 -OutFile bulk-add-member.ps1

スクリプトを実行

その後スクリプトを起動します。

> powershell .\bulk-add-member.ps1

以下のような出力がされればおそらく追加できています。
なお、後述するようにここで成功しても Teams のアプリ上でメンバー欄に反映されるには時間がかかるようです。

Account                  Environment Tenant                               TenantId
-------                  ----------- ------                               --------
<あなたのメールアドレス> AzureCloud  00000000-0000-0000-0000-0000000000000 00000000-0000-0000-0000-0000000000000
Added <チームに追加した人のメールアドレス>

確認

Teams のメンバータブから確認できます。ただし手元で試したときには設定が反映されるまでラグがありました。私の場合は数時間ほどかかりました。場合によっては反映まで 24 - 48 時間かかることもあるそうです。[2]

その他

プライベートチャンネルへの招待

プライベートチャンネルにユーザを招待するには追加で以下の操作が必要です。
なおプライベートチャンネルにユーザを招待するには、そのユーザはあらかじめチームのメンバーである必要があります。

まず前述のように追加したいユーザのメールアドレスが掲載されたファイルを用意します。
次に以下のスクリプトを用意し、同じように実行します。

"<チャンネル名>" はそのプライベートチャンネルの名前をそのまま入れます。例えば -DisplayName "鍵チャンネル" のように指定します。もしチャンネル名が日本語の場合は、このファイルを Shift_JIS で保存の上実行してください。

$groupId = "<グループ ID>"   # ex) 00000000-0000-0000-0000-000000000000
$csvPath = "<CSV のパス>"   # ex) .\emails.csv

Connect-MicrosoftTeams
Import-Csv -Path $csvPath | ForEach-Object {
    Add-TeamChannelUser -GroupId $groupId -DisplayName "<チャンネル名>" -User $_.email;
    Write-Output "Added $($_.email)";
    Start-Sleep 10;
}

実行方法は前述と同じです。

脚注
  1. https://docs.microsoft.com/ja-jp/previous-versions/powershell/module/microsoft.powershell.security/set-executionpolicy?view=powershell-7.1 ↩︎

  2. https://docs.microsoft.com/en-us/powershell/module/teams/add-teamuser?view=teams-ps#:~:text=the command will return immediately%2C but the teams application will not reflect the update immediately. the change can take between 24 and 48 hours to appear within the teams client. ↩︎

Discussion

MackFMackF

すみません。教えていただきたいです。スクリプトに関する知識はほぼゼロです。
Teamsへのメンバー一括追加(登録)を自分で何とかできるようにしたいと思い、あちらこちら見てみたのですがどれを真似してもなかなかうまくいきません。
こちらのスクリプトを実行すると、以下のようなエラーが出ます。どう対処すればよろしいでしょうか?

Add-TeamUser : 引数が null であるため、パラメーター 'User' にバインドできません。
発生場所 C:@tools\bulk-add-member.ps1:6 文字:42

  • Add-TeamUser -GroupId $groupId -User $_.email;
    

-User $_.email
の部分は当方の環境によって書き換えないといけないのでしょうか?

HosokowaRHosokowaR

コメントありがとうございます。

-User $_.email
の部分は当方の環境によって書き換えないといけないのでしょうか?

メールアドレスが書かれた CSV ファイルの作り方がこの記事通りなら書き換える必要はありません。

確認ですが、メールアドレスが書かれたファイルの一行目は、以下のように emailとなっているでしょうか?
以下に正しい例と誤った例を掲載しました。ご参考になると幸いです。

正しい例

email
test1@example.com
test2@example.com

誤った例

スペルミス、余分な空行の混入

スペルミス等があると正しく動かない可能性があります。

eamil # ← "email" とスペルミスをしている
        # ← 余分な空行が入っている
test1@example.com
        # ← 余分な空行が入っている
test2@exam

試しに CSV ファイルの先頭一行目を email2 とわざと変えてみると、以下のような同じエラーが確認できました。

> powershell .\bulk-add-member.ps1
Add-TeamUser : 引数が null であるため、パラメーター 'User' にバインドできません。
発生場所 D:\temp\bulk-add-member.ps1:6 文字:42
+     Add-TeamUser -GroupId $groupId -User $_.email;

全角スペースの混入

全角スペースが混入している場合も「プログラムが全角スペースを含めて文字列と解釈する」可能性があるので正しく動かない可能性があります。

eamil  # (分かりにくいですが)email のあとに余分な全角スペース「 」が入っている
test1@example.com
test2@exam

もし解決されない場合は、CSV ファイルと bulk-add-memer.ps1 スクリプトを、個人情報部分をダーミの文字列に置き換えた上でここのコメントに共有いただければ何か手がかりになるかもしれません。

MackFMackF

さっそくご教授いただきありがとうございました。
1行目の
email
を削除してしまっておりました。
お陰様でうまくいきました。御礼申し上げます。m(__)m

HosokowaRHosokowaR

良かったです!こちらもコメントをいただき記事の質を上げることができました。ありがとうございます。

koikekoike

大変お世話になっております。
143名の学生のアドレスを一括登録したくて困っておりましたところ,HosokowaR様の本記事を見つけ大変助かりました。Teamsへの反映も即時確認できました。

さらに欲が出てまいりまして,Team内の鍵付きChannelに登録することもできるのでしょうか?
以下を見ましたら,ひとりずつ設定することはできそうだと思いましたが,一括でやる場合には,人数分のコマンドを用意する方法があるのでしょうか?
ご教示いただけましたら幸いです。
https://learn.microsoft.com/ja-jp/powershell/module/teams/Add-TeamChannelUser?view=teams-ps

HosokowaRHosokowaR

コメントありがとうございます。
「プライベートチャンネルへの招待」という項目を追加したのでそちらを参照ください。