【Teams】Teams Admin PowerShellで休眠チームを一括アーカイブするスクリプト

【Teams】Teams Admin PowerShellで休眠チームを一括アーカイブするスクリプト
🛡️ 超解決

Microsoft Teamsのチームが増え続けると、利用されなくなった休眠チームの管理が課題となります。休眠チームはストレージを消費し、検索性を低下させる原因にもなります。Teams Admin PowerShellを使えば、これらの休眠チームを効率的に特定し、一括でアーカイブすることが可能です。この記事では、休眠チームを特定してアーカイブする具体的なPowerShellスクリプトとその使い方を解説します。これにより、Teams環境の整理と管理負担の軽減を実現できます。

Teams環境をクリーンに保つことは、運用効率の向上に直結します。しかし、手動で休眠チームを特定し、一つずつアーカイブするのは非常に手間がかかります。特にチーム数が多い組織では、この作業は現実的ではありません。そこで、Teams Admin PowerShellを活用した自動化が有効な手段となります。このスクリプトを利用することで、一定期間アクティビティのないチームを自動的に検出し、アーカイブ処理を実行できます。これにより、管理者の負担を大幅に削減し、Teams環境の健全性を維持することが可能になります。

本記事では、休眠チームを定義する基準(最終アクティビティからの日数)の設定方法から、スクリプトの実行に必要なTeams PowerShellモジュールの準備、そして実際に休眠チームをアーカイブするスクリプトの解説までを網羅しています。管理者権限があれば、誰でもこのスクリプトを導入・実行できます。Teamsの運用管理を効率化したい方は、ぜひ最後までご覧ください。

【要点】Teams Admin PowerShellで休眠チームを一括アーカイブする

  • Teams PowerShellモジュールのインストールと接続: Teams環境に接続するための準備を行います。
  • 休眠チームの特定基準設定: 最終アクティビティから何日経過したチームを休眠とみなすかを定義します。
  • 休眠チームの検出とアーカイブ実行: 設定した基準に基づき休眠チームを検出し、一括でアーカイブ処理を実行します。

ADVERTISEMENT

休眠チームを定義する基準とTeams PowerShellの役割

Teams環境において「休眠チーム」とは、一般的に一定期間、メンバーによるアクティビティ(メッセージ送信、ファイル共有、会議参加など)がないチームを指します。この「一定期間」は組織のポリシーや運用方針によって自由に設定できます。例えば、90日、180日、あるいは365日といった期間が考えられます。休眠チームを放置すると、不要なライセンス消費、ストレージ容量の圧迫、情報検索の非効率化、セキュリティリスクの増大といった問題が生じます。これらを未然に防ぐために、定期的な棚卸しとアーカイブが不可欠です。

Teams Admin PowerShellは、Microsoft 365テナント内のTeams環境を管理するためのコマンドラインツールです。このモジュールを使用することで、GUI操作だけでは難しい、大量のチームに対する一括処理や、詳細な情報取得、複雑な設定変更などが可能になります。具体的には、チームの作成、削除、メンバー管理、チャネル管理、そして今回のように休眠チームの検出・アーカイブといった運用管理タスクを自動化するための強力な機能を提供します。PowerShellスクリプトを作成することで、これらの管理作業を定型化し、人的ミスを減らしながら、効率的にTeams環境を維持管理できるようになります。

お探しの解決策が見つからない場合は、こちらの「Teams/Outlookトラブル完全解決データベース」で他のエラー原因や解決策をチェックしてみてください。

Teams PowerShellモジュールの準備と接続

Teams Admin PowerShellスクリプトを実行するには、まずTeams PowerShellモジュールがローカルのコンピューターにインストールされている必要があります。また、Microsoft 365テナントへの接続も必要となります。管理者権限を持つアカウントで実行してください。

Teams PowerShellモジュールのインストール

Teams PowerShellモジュールがまだインストールされていない場合は、以下の手順でインストールします。管理者権限でPowerShellを開き、コマンドを実行してください。

  1. 管理者権限でPowerShellを開く
    スタートメニューから「PowerShell」を検索し、「管理者として実行」を選択します。
  2. Teams PowerShellモジュールのインストール
    以下のコマンドを入力し、Enterキーを押します。
    Install-Module -Name MicrosoftTeams -Force

    モジュールがダウンロードされ、インストールされます。途中で確認を求められた場合は「Y」または「A」を入力して続行してください。

ADVERTISEMENT

Teams PowerShellへの接続

モジュールのインストールが完了したら、Microsoft 365テナントに接続します。以下のコマンドを実行してください。

  1. Teams PowerShellへの接続コマンド実行
    以下のコマンドを入力し、Enterキーを押します。
    Connect-MicrosoftTeams

    サインイン画面が表示されるので、Teams管理センターへのアクセス権を持つ管理者アカウントの資格情報(メールアドレスとパスワード)を入力してサインインしてください。

接続が成功すると、テナント名などの情報が表示されます。これにより、PowerShellからTeams環境の管理コマンドを実行できるようになります。

休眠チームを特定し一括アーカイブするスクリプト

ここでは、休眠チームを特定し、一括でアーカイブを実行するPowerShellスクリプトを紹介します。このスクリプトは、指定した期間アクティビティがないチームを抽出し、アーカイブ処理を行います。スクリプトを実行する前に、環境に合わせてパラメータを調整してください。

スクリプトの解説とパラメータ設定

以下のスクリプトは、Teams Admin PowerShellを使用して休眠チームを検出・アーカイブします。スクリプトの冒頭にあるパラメータを、ご自身の環境に合わせて変更してください。

$DaysInactive: 休眠とみなす期間(日数)を指定します。例えば、90日以上アクティビティがないチームを休眠とみなす場合は「90」と設定します。

$ArchiveTeams: このパラメータを「$true」に設定すると、実際に休眠チームのアーカイブ処理が実行されます。テスト段階では「$false」に設定し、アーカイブ対象となるチームを確認することをお勧めします。アーカイブ処理を実行する前に、必ず「$true」に変更してください。

$ExcludeTeams: 特定のチームをアーカイブ対象から除外したい場合に、チームID(GUID)を配列で指定します。これは、重要なチームや、一時的にアクティブでないがアーカイブしたくないチームがある場合に役立ちます。

休眠チーム検出・アーカイブスクリプト本体

管理者権限で開いたPowerShellに、以下のスクリプトをコピー&ペーストして実行してください。


#===========================================================================
# PowerShell Script to Archive Dormant Teams
#===========================================================================

# --- Parameters ---
# Specify the number of days to consider a team as inactive
$DaysInactive = 180

# Set to $true to actually archive the teams, set to $false for a dry run (simulation)
$ArchiveTeams = $false

# Specify Team IDs (GUIDs) to exclude from archiving
# Example: $ExcludeTeams = @("a1b2c3d4-e5f6-7890-1234-567890abcdef", "f0e9d8c7-b6a5-4321-0987-654321fedcba")
$ExcludeTeams = @()

# --- Script Logic ---

Write-Host "Starting dormant Teams identification process..."
Write-Host "Inactive period set to: $DaysInactive days"

# Get all teams in the tenant
try {
    $AllTeams = Get-Team -ErrorAction Stop
    Write-Host "Successfully retrieved $($AllTeams.Count) teams."
} catch {
    Write-Error "Failed to retrieve teams. Ensure you are connected to Microsoft Teams and have the necessary permissions. Error: $($_.Exception.Message)"
    exit
}

$DormantTeams = @()
$CurrentDate = Get-Date

foreach ($Team in $AllTeams) {
    # Skip if the team is already archived (IsArchived property is not directly available via Get-Team, need to infer or check other properties if available)
    # For simplicity, this script archives active teams that are dormant.
    # A more robust solution might involve checking a custom property or metadata if implemented.

    # Get team's last activity date. This is often based on the last modified date of the group.
    # Note: The 'LastModifiedDateTime' might not always reflect direct user activity but group changes.
    # For more precise activity, you might need to query audit logs or specific SharePoint/Planner activities, which is more complex.
    # Using the Group's LastModifiedDateTime as a proxy for now.
    $TeamGroup = Get-AzureADGroup -Filter "id eq '$($Team.GroupId)'" -ErrorAction SilentlyContinue

    if ($TeamGroup) {
        $LastModified = $TeamGroup.LastModifiedDateTime

        if ($LastModified -ne $null) {
            $DaysSinceLastModified = ($CurrentDate - $LastModified).TotalDays

            # Check if the team is in the exclude list
            $IsExcluded = $false
            foreach ($ExcludeID in $ExcludeTeams) {
                if ($Team.GroupId -eq $ExcludeID) {
                    $IsExcluded = $true
                    break
                }
            }

            if (-not $IsExcluded -and $DaysSinceLastModified -gt $DaysInactive) {
                $DormantTeams += [PSCustomObject]@{ 
                    TeamName = $Team.DisplayName
                    GroupId = $Team.GroupId
                    LastModified = $LastModified.ToString("yyyy-MM-dd HH:mm:ss")
                    DaysInactive = [math]::Floor($DaysSinceLastModified)
                }
            }
        } else {
            Write-Warning "Could not retrieve LastModifiedDateTime for team '$($Team.DisplayName)' (GroupID: $($Team.GroupId)). Skipping."
        }
    } else {
        Write-Warning "Could not retrieve Azure AD group information for team '$($Team.DisplayName)' (GroupID: $($Team.GroupId)). Skipping."
    }
}

if ($DormantTeams.Count -eq 0) {
    Write-Host "No dormant teams found based on the specified criteria."
} else {
    Write-Host "Found $($DormantTeams.Count) dormant teams."
    $DormantTeams | Format-Table -AutoSize

    if ($ArchiveTeams -eq $true) {
        Write-Host "Archiving process is enabled. Proceeding with archiving..."
        foreach ($DormantTeam in $DormantTeams) {
            Write-Host "Archiving team: '$($DormantTeam.TeamName)' (GroupID: $($DormantTeam.GroupId))..."
            try {
                Archive-Team -GroupId $DormantTeam.GroupId -ErrorAction Stop
                Write-Host "Successfully archived team '$($DormantTeam.TeamName)'."
            } catch {
                Write-Error "Failed to archive team '$($DormantTeam.TeamName)' (GroupID: $($DormantTeam.GroupId)). Error: $($_.Exception.Message)"
            }
        }
        Write-Host "Dormant Teams archiving process completed."
    } else {
        Write-Host "Dry run mode is enabled ($ArchiveTeams). No teams were archived. Set `$ArchiveTeams = `$true to enable archiving."
    }
}

Write-Host "Script finished."

# Disconnect-MicrosoftTeams # Optional: uncomment to disconnect after script execution

スクリプトの実行手順

スクリプトを準備したら、以下の手順で実行します。

  1. PowerShellを開く
    管理者権限でPowerShellを開きます。
  2. Teamsに接続する
    前述の「Teams PowerShellへの接続」手順を実行し、Microsoft 365テナントに接続します。
  3. スクリプトを貼り付けて実行
    上記のスクリプト全体をコピーし、PowerShellウィンドウに貼り付けてEnterキーを押します。

スクリプトはまず、指定された期間($DaysInactive)アクティビティのないチームを検出します。テスト実行($ArchiveTeams = $false)では、検出されたチームの一覧が表示されます。内容を確認し、問題がなければスクリプトの「$ArchiveTeams = $false」を「$ArchiveTeams = $true」に変更して再度実行してください。これにより、検出された休眠チームが実際にアーカイブされます。

アーカイブの解除(復元)方法

誤ってアーカイブしてしまったチームや、アーカイブ後に再度利用する必要が生じたチームは、Teams管理センターから復元できます。以下の手順で行います。

  1. Teams管理センターにサインイン
    Microsoft 365の管理者アカウントでTeams管理センター(admin.teams.microsoft.com)にサインインします。
  2. 「Teams」メニューを選択
    左側のメニューから「Teams」を選択します。
  3. アーカイブ済みチームの表示
    チーム一覧画面の上部にあるフィルターオプションや、「アーカイブ済みチーム」といった表示オプションを探して、アーカイブ済みのチームを表示させます。
  4. チームの復元
    復元したいチームを選択し、「復元」または「アクティブ化」といったボタンをクリックして実行します。

復元には数分かかる場合があります。復元後、チームは通常のチームと同様に利用可能になります。

スクリプト実行時の注意点とトラブルシューティング

このスクリプトは強力な管理ツールですが、実行にあたってはいくつかの注意点があります。また、予期せぬ問題が発生した場合の対処法も理解しておくことが重要です。

実行権限とライセンス

このスクリプトを実行するには、Teams管理センターへのアクセス権を持つ管理者アカウントが必要です。具体的には、Teamsサービス管理者、グローバル管理者、またはそれに準ずる権限を持つアカウントを使用してください。また、対象となるチームのメンバーがMicrosoft 365ライセンスを割り当てられているかどうかも、アーカイブ後の利用に影響する可能性があります。

アクティビティの定義の限界

スクリプトで使用している「最終アクティビティ」の基準は、主にAzure ADグループの「LastModifiedDateTime」を基にしています。これは、チームの表示名変更、メンバー追加・削除、設定変更などのグループレベルの変更を反映しますが、必ずしもユーザーが直接送信したメッセージやファイル共有などの「チーム内での活動」を正確に捉えるものではありません。より厳密なアクティビティ検出が必要な場合は、Microsoft Graph APIや監査ログAPIなどを利用した、より複雑なスクリプト開発が必要になります。

除外リストの活用

重要なチームや、一時的に利用されていないが今後も継続利用する予定のあるチームは、アーカイブ対象から除外することが重要です。スクリプト内の `$ExcludeTeams` パラメータに、除外したいチームのグループID(GUID)を配列形式で指定することで、誤ってアーカイブされるのを防ぐことができます。チームのグループIDは、Teams管理センターやPowerShellの `Get-Team` コマンドレットで確認できます。

ドライランの重要性

スクリプトを実行する際は、必ず最初に `$ArchiveTeams = $false` の状態で実行し、ドライラン(シミュレーション)を行ってください。これにより、実際にアーカイブされるチームのリストを確認できます。表示されたリストが意図したものであることを確認してから、`$ArchiveTeams = $true` に変更して本実行に移行してください。これにより、誤ったチームをアーカイブしてしまうリスクを大幅に低減できます。

エラー発生時の確認事項

スクリプト実行中にエラーが発生した場合、以下の点を確認してください。

  • Teams PowerShellモジュールが最新か: `Update-Module -Name MicrosoftTeams` コマンドで最新版に更新してみてください。
  • 管理者権限で実行しているか: PowerShellを「管理者として実行」しているか確認してください。
  • テナントへの接続は確立されているか: `Connect-MicrosoftTeams` コマンドで再接続を試みてください。
  • 除外リストのチームIDは正しいか: `$ExcludeTeams` に指定したGUIDが正しい形式であるか確認してください。
  • 対象チームのプロビジョニング状況: 新しく作成されたチームや、最近変更されたチームの場合、情報が反映されるまでに時間がかかることがあります。

エラーメッセージを注意深く読み、問題の特定に役立ててください。詳細なエラーについては、Microsoftの公式ドキュメントを参照することも有効です。

新しいTeams (v2) と従来Teamsでの違い

Teams Admin PowerShellの基本的なコマンドレットは、新しいTeams (v2) クライアントと従来Teamsの間で、機能面での大きな違いはありません。`Get-Team` や `Archive-Team` といったコマンドレットは、どちらのクライアント環境でも同様に動作します。TeamsのUIや一部の機能が新しくなっても、バックエンドの管理機能やAPIは継続して利用できるため、このスクリプトも影響なく使用できます。ただし、将来的なモジュールのアップデートや、特定の新しい機能に対応するためには、常に最新バージョンのMicrosoft Teams PowerShellモジュールを使用することが推奨されます。

Mac版・モバイル版・Web版での違い

Teams Admin PowerShellは、コマンドラインインターフェース(CLI)ツールであり、特定のOSに依存して動作するものではありません。そのため、Windowsだけでなく、macOSやLinux上でもPowerShell Core(または互換性のあるシェル)とMicrosoft Teams PowerShellモジュールをインストールすれば、同様のスクリプトを実行することが可能です。しかし、一般的に管理者はWindows環境でPowerShellを使用することが多いため、本記事ではWindows版を基準に解説しました。モバイル版TeamsアプリやWeb版Teamsからは、直接PowerShellスクリプトを実行することはできません。

まとめ

本記事では、Microsoft Teamsの休眠チームを一括でアーカイブするためのTeams Admin PowerShellスクリプトとその使い方を解説しました。このスクリプトを利用することで、不要なチームの管理負担を軽減し、Teams環境を常に整理された状態に保つことができます。ドライラン機能や除外リストを活用し、安全かつ効率的に運用してください。今後は、このスクリプトを定期実行するタスクをスケジュール設定することで、自動的な休眠チーム管理体制を構築することも可能です。

👥
Teams/Outlookトラブル完全解決データベース サインイン、接続エラー、メール送受信の不具合など、特有のトラブル解決策を網羅。困った時の逆引きに活用してください。

ADVERTISEMENT

この記事の監修者
🌐

超解決 リモートワーク研究班

Microsoft 365の導入・保守を専門とするエンジニアグループ。通信障害やサインイン不具合など、ビジネスインフラのトラブル対応に精通しています。