ルドルフもわたるふもいろいろあってな

Microsoft 365、Power Platform、PowerShellについて調べたことや検証したことなどを投稿します。技術の話は面白い。

Teams管理者権限なしでテナント内のチーム一覧をCSVに出力する(PowerShell版)

今回の内容は、先日投稿したチーム一覧をCSVに出力するPower Automate フローの番外編のような立ち位置です。
wataruf.hatenablog.com

背景・経緯

先日の投稿では、テナント内のチームの一覧をPower Automateを使って取得するフローについて解説をしました。

このフローを実際に使用いただいたコメントをもらいました。

  • 「テナント内のチームが多すぎてフローがタイムアウトした」
  • タイムアウトを回避するためにフローの最大実行時間をのばしたけれど、チームが多すぎてフローが一向に終わらない」

Power Automate の特長と弱点

Power Automateの特長のひとつは、前準備・処理実行・出力をすべてクラウド内で完結できることが強みだと思います。


技術的なバックボーンが無いユーザーさんに「チームの一覧を取得するツール」を提供するとしたら、個々のユーザーまたはユーザーのPCに対して準備をする必要があるPowerShellよりも、フローを共有してすぐ実行してもらうことができるPower Automateのが手軽で良いです。


ですが、Power Automateにも弱点があります。それは、基本的に大量のデータの操作や長時間の処理に向いてないことです。上記のコメントで頂いたようなチームの数が多すぎるテナントでは、フローを使った取得処理では「そもそも取得ができない」「取得できるけれど現実的でない時間がかかる」という事態になることがあります。

だから、今回はPowerShellを使います。

Power Automateに比べるとPowerShellは大量のデータの操作や長時間の処理に向いています。なので今回は掲題の内容を実現するPowerShellスクリプトを作成しました。

スクリプトの解説

出力イメージ

CSVへの出力イメージです。

列の説明

  • DisplayName   ・・・ チームの表示名
  • Mail       ・・・ メールアドレス
  • CreatedDateTime ・・・ チームが作成された日付(時刻も含む)
  • Visibility     ・・・ プライベートチームか、それともパブリックチームか

前提条件

チームの一覧取得に必要な条件は以下の通りです。

  • 以下のモジュールがPC端末にインストールされていること

今回のPowerShellはTeamsのモジュールは使いません。また、Teams管理者の権限も不要です。その理由は、今回取得する情報(例:チーム名やアドレス)は一般ユーザーが取得可能な範囲であるためです。

ソースコード

#-------------------------------------------------
#認証情報
#-------------------------------------------------
$user = "****@****.com"
$pass = "****" | ConvertTo-SecureString -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential($user,$pass) 

#-------------------------------------------------
#前準備:チームに紐づくグループをすべて取得
#-------------------------------------------------
Connect-AzureAD -Credential $credential

$allTeams = Get-AzureADMSGroup -Filter "groupTypes/any(c:c eq 'Unified')" -All $true

#-------------------------------------------------
#主処理:グループの情報をCSVに出力する
#-------------------------------------------------
$outputFile = ".\output.csv"

foreach($team in $allTeams)
{
    #チームの情報をCSVに出力
    $obj = New-Object PSObject
    $obj | Add-Member -MemberType NoteProperty -Name DisplayName     -Value $team.DisplayName
    $obj | Add-Member -MemberType NoteProperty -Name Mail            -Value $team.Mail
    $obj | Add-Member -MemberType NoteProperty -Name CreatedDateTime -Value $team.CreatedDateTime
    $obj | Add-Member -MemberType NoteProperty -Name Visibility      -Value $team.Visibility

    $obj | Export-Csv -Path $outputFile -Encoding UTF8 -NoTypeInformation -Append
}

ちなみに

Teams管理者の権限を使って情報を取得スクリプトも以前投稿しました。チームが持っている他の情報(例:チームのメンバ)を取得したいのであれば、今回の投稿より以前の投稿を参考にしていただいたほうが良いです。
wataruf.hatenablog.com

最後に

これで約束は果たしました。前半のうちに書けた。(`・ω・´)

今回は以上です。