Teamsチームの一覧をPowerShellから出力する

Teamsのチーム一覧はTeams管理センター上からもCSV形式で出力できますが、出力される項目は限定的です。

そこで、本記事ではPowerShellコマンドを組み合わせて、必要な複数の情報を一つのCSVファイルで見られるようにします。

チーム一覧を出力する

PowerShellコマンドでチームの一覧をCSVに出力する方法を説明していきます。

前提

  • PowerShellモジュールのインストールが必要
    • ExchangeOnlineモジュール
    • SharePointOnlineモジュール
    • AzureADのPoweshellモジュール
  • 実行にはグローバル管理者権限か、もしくはExchange Online・SharePoint Online・Entra(旧Azure AD)の管理者権限が必要

また、実行前に以下のコマンドを実行し、管理センターへ接続しておきます。

以下のConnectコマンドを一行ずつ実行します。実行時に認証画面が表示されるので、管理者権限を持つアカウントで認証します。

Connect-ExchangeOnline
Connect-SPOService -Url https://[テナント名]-admin.sharepoint.com
Connect-AzureAD

※Connect-SPOServiceに指定する[テナント名]部分は、GUI上からSharePoint管理センターへアクセスした際のURLからも確認できます
※上記コマンドを実行すると認証画面が表示されるので、管理者権限を持つユーザーのUPNとパスワードを入力します。

実行コマンド

まずは実行コマンドと取得できる項目を先に紹介します。
テナント内のMicrosoft 365グループをすべて取得し一覧化して、CSVに出力します。
出力項目

# 項目名 出力内容 備考
1 種類 Teamsに未接続のMicrosoft 365グループであれば「M365Group」、
Teamsに接続済みのMicrosoft 365グループであれば(チームであれば)「Team」と出力
-
2 グループ名 Microsoft 365グループ名(チーム名) -
3 アクセスタイプ Microsoft 365グループ(チーム)のアクセスタイプ(チーム種類) privateまたはpublic
4 グループID Microsoft 365グループのID テナント内で一意となる値
5 所有者の数 Microsoft 365グループ(チーム)の所有者の数 -
6 所有者(表示名) Microsoft 365グループ(チーム)の所有者のDisplayName 複数いる場合はカンマ区切りで出力
7 所有者(UPN) Microsoft 365グループ(チーム)の所有者のUserPrinsipalName 複数いる場合はカンマ区切りで出力
8 メンバーの数 Microsoft 365グループ(チーム)のメンバーの数 -
9 メンバー(表示名) Microsoft 365グループ(チーム)のメンバーのDisplayName 複数いる場合はカンマ区切りで出力
10 メンバー(UPN) Microsoft 365グループ(チーム)のメンバーのUserPrinsipalName 複数いる場合はカンマ区切りで出力
11 SharePoint OnlineサイトURL Microsoft 365グループ(チーム)に紐づくSharePoint OnlineサイトのURL -
12 SharePoint Onlineサイトのストレージ(MB) Microsoft 365グループ(チーム)に紐づくSharePoint Onlineサイトのストレージ値 @{StorageQuota=[ストレージ値]}の形式で出力※単位はMB
13 SharePoint Onlineサイトの使用済ストレージ(MB) Microsoft 365グループ(チーム)に紐づくSharePoint Onlineサイトの使用済みストレージ値 @{StorageUsageCurrent=[ストレージ値]}の形式で出力※単位はMB

コマンド

$startTime = Get-Date
Write-Host "========================
リストの取得を開始しました。開始時間: $startTime"
$groups = Get-UnifiedGroup -ResultSize unlimited 
$output = @()
#グループごとに処理を繰り返す
foreach ($group in $groups) {
    $groupId = $group.ExternalDirectoryObjectId
    $groupName = $group.DisplayName
    $accessType = $group.AccessType
    $groupType = ""
    $groupEmail = $group.PrimarySmtpAddress
    #「種類」の設定
    if ($group.ResourceProvisioningOptions -contains "Team") {
        $groupType = "Team"
    } else {
        $groupType = "M365Group"
    }
    #「SharePoint OnlineサイトURL」「SharePoint Onlineサイトのストレージ」「SharePoint Onlineサイトの使用済ストレージ」の取得
    $storage = 0
    $storageUsed = 0
    $teamSiteUrl = Get-UnifiedGroup -Identity $groupId | Select-Object -ExpandProperty SharePointSiteUrl
    if ($teamSiteUrl) {
        $storage = Get-SPOSite -Identity $teamSiteUrl | Select-Object StorageQuota
        $storageUsed = Get-SPOSite -Identity $teamSiteUrl | Select-Object StorageUsageCurrent
    }
    $membersList = @()
    $membersUPNList = @()
    foreach ($member in $members) {
        $memberUser = Get-AzureADUser -ObjectId $member.ExternalDirectoryObjectId
        if ($memberUser) {
            $membersList += $memberUser.DisplayName
            $membersUPNList += $memberUser.UserPrincipalName
        }
    }
    $ownerCount = $ownersList.Count
    $memberCount = $membersList.Count
    
    $groupInfo = [PSCustomObject]@{
        "種類" = $groupType
        "グループ名" = $groupName
        "アクセスタイプ" = $AccessType
        "グループID" = $groupId
        "所有者の数" = $ownerCount
        "所有者(表示名)" = $ownersList -join ","
        "所有者(UPN)" = $ownersUPNList -join ","
        "メンバーの数" = $memberCount
        "メンバー(表示名)" = $membersList -join ","
        "メンバー(UPN)" = $membersUPNList -join ","
        "SharePoint OnlineサイトURL" = $teamSiteUrl
        "SharePoint Onlineサイトのストレージ(MB)" = $storage
        "SharePoint Onlineサイトの使用済ストレージ(MB)" = $storageUsed
    }
    $output += $groupInfo
}
$output | Export-Csv -Path (".\M365グループリスト_" + (Get-Date -Format yyyyMMdd_HHmmss) + ".csv") -Encoding UTF8 -NoTypeInformation
$endTime = Get-Date
$executionTime = New-TimeSpan -Start $startTime -End $endTime
Write-Host "リストの取得が終了しました。終了時間: $endTime
===============実行時間: $executionTime"

実行方法

上記の実行コマンドをコピーしPowerShellの画面に貼り付け、Enterボタンを押下しコマンドを実行します。

PowerShell実行画面1

実行すると、以下のように実行開始時間が画面に出力されます。

PowerShell実行画面2

テナント内のMicrosoft 365グループの数やネットワークの状態にもよりますが、私が検証した100個程度グループがあるテナントでは実行完了まで3分ほどかかりました。

コマンドの実行が完了すると以下のようなメッセージが表示され、終了時間と終了までにかかった時間が表示されます。

PowerShell実行画面3

CSVはカレントディレクトリ(コマンドを実行したディレクトリ)に「M365グループリスト_yyyyMMdd_HHmmss.csv」というファイル名で出力されます。

CSVの出力フォルダ

コマンド分解

このコマンドにはいくつかポイントがあります。コマンドを分解して、ポイントごとに以下説明します。

Microsoft 365グループ(≒チーム)を取得する

Microsoft 365グループは実行コマンドの以下部分で取得しています。

Get-UnifiedGroupの既定出力件数(ResultSize)は1,000件であるため、-ResultSizeにはunlimitedを指定しておくと良いでしょう。

$groups = Get-UnifiedGroup -ResultSize unlimited 

Microsoft 365グループには二つ種類があり、Teamsに接続されているMicrosoft 365グループ*1と、Teamsに接続されていないMicrosoft 365グループ*2があります。

このコマンドでは、両方のMicrosoft 365グループを取得してます。

出力されたときに分かりやすいように、「種類」列へはMicrosoft 365グループであれば”M365Group”、Teamsに接続済みのMicrosoft 365グループであれば"Team"と出力されるようにしました。

#「種類」の設定
if ($group.ResourceProvisioningOptions -contains "Team") {
    $groupType = "Team"
} else {
    $groupType = "M365Group"
}
Microsoft 365グループの「種類」出力結果

Microsoft 365グループの所属ユーザーを取得する

実行コマンドの以下部分で、Microsoft 365グループに所属するユーザーを取得しています。

複数ユーザーいる場合は、UPNをカンマ区切りでつなげて一つのセルに出力しています。

#所有者、メンバー情報の取得
$owners = Get-UnifiedGroupLinks -Identity $groupId -LinkType Owners
$members = Get-UnifiedGroupLinks -Identity $groupId -LinkType Members
$ownersList = @()
$ownersUPNList = @()
foreach ($owner in $owners) {
    $ownerUser = Get-AzureADUser -ObjectId $owner.ExternalDirectoryObjectId
    if ($ownerUser) {
        $ownersList += $ownerUser.DisplayName
        $ownersUPNList += $ownerUser.UserPrincipalName
    }
}
$membersList = @()
$membersUPNList = @()
foreach ($member in $members) {
    $memberUser = Get-AzureADUser -ObjectId $member.ExternalDirectoryObjectId
    if ($memberUser) {
        $membersList += $memberUser.DisplayName
        $membersUPNList += $memberUser.UserPrincipalName
    }
}
$ownerCount = $ownersList.Count
$memberCount = $membersList.Count

所有者、メンバーはそれぞれ人数と表示名、UPNを出力します。

所有者、メンバーの出力

SharePoint Onlineサイトの容量=チームの容量を取得する

チームの容量はチーム作成時にセットで払い出されるSharePointサイトの容量となります。

このため、チームの容量はどこまで使えるかとどこまで使用済みであるかは、SharePointサイトを確認する必要があります。

実行コマンドの以下部分でSharePointサイトのURL、ストレージ、使用済みストレージを取得します。

#「SharePoint OnlineサイトURL」「SharePoint Onlineサイトのストレージ」「SharePoint Onlineサイトの使用済ストレージ」の取得
$storage = 0
$storageUsed = 0
$teamSiteUrl = Get-UnifiedGroup -Identity $groupId | Select-Object -ExpandProperty SharePointSiteUrl
if ($teamSiteUrl) {
    $storage = Get-SPOSite -Identity $teamSiteUrl | Select-Object StorageQuota
    $storageUsed = Get-SPOSite -Identity $teamSiteUrl | Select-Object StorageUsageCurrent
}
「SharePoint OnlineサイトURL」「SharePoint Onlineサイトのストレージ」「SharePoint Onlineサイトの使用済ストレージ」の出力

実行時間を出力する

こちらはチームの一覧を出力する事とはあまり関係ない処理ですが、リスト取得開始時に現在日時を取得し、リスト取得終了時にも現在日時を取得し画面表示しています。*3

これにより、コマンド実行からどのくらいかかったのかというのが体感ではなく実際の数字として分かり、次回同じコマンドを実行する際の目安にできます。
コマンド実行開始時

$startTime = Get-Date
Write-Host "========================
リストの取得を開始しました。開始時間: $startTime"


コマンド実行終了時

$endTime = Get-Date
$executionTime = New-TimeSpan -Start $startTime -End $endTime
Write-Host "リストの取得が終了しました。終了時間: $endTime
===============実行時間: $executionTime"

ファイル名に実行日時を含める

最後に、これもチームの一覧を出力する事とはあまり関係ない処理ですが、出力するファイル名に現在日時を含めることにより、ファイル名は常に一意になります。

これにより、同じコマンドを再度実行した際に、前回実行時のファイル名と重複することを避けることができます。

※ファイル名が重複するとファイルは上書きされます。

$output | Export-Csv -Path (".\M365グループリスト_" + (Get-Date -Format yyyyMMdd_HHmmss) + ".csv") -Encoding UTF8 -NoTypeInformation


終わりに

Teamsのチームを棚卸する際に、Microsoft 365の各管理センター(GUI)から出力できる標準的なリストを利用すると、複数のリストを往復して各リストがそれぞれ持っている値を見比べることになります。

チームメンバーは何人いるのか、所有者は誰なのか、チームの使用済みストレージはどのくらいなのか等、PowerShellコマンドを利用してほしい情報を一つのファイルに一覧化できれば、チームの棚卸や把握のスピードを格段に上げることができます。

*1:チームとして利用されているMicrosoft 365グループ

*2:単純にユーザーグループとしてのみ利用されているMicrosoft 365グループ

*3:この処理が無くても一覧は出力できます

執筆担当者プロフィール
Hiroko, Kimura

Hiroko, Kimura(日本ビジネスシステムズ株式会社)

Microsoft 365製品の提案~運用が担当領域、特にTeams/Teams Phone多めです。趣味は音楽とテレビと映画。趣味にしたいのは筋トレ(エンジニアには筋肉が必要)。

担当記事一覧