見出し画像

M365の配布リストをPowerShellで書き出し、Pythonで階層構造の可視化(準備編)

組織の情報共有をメールで行っている場合、配布グループのメンバー・階層構造は常に正しい状態にしておかなくてはなりません。ただ、人の手で行う作業にはミスが付き物。もしミスがあっても早期発見できるようにしたいものです。

定期的にPowerShellでMicrosoft365(M365)に接続して配布グループを書き出し、それをチェックするようにしたとします。ところが、この方法で確認できるのは存在する配布グループとそのメンバーで、階層構造まで把握するのは困難です。

そこで、配布グループをエクセルファイルに書き出した後、階層構造がわかりやすい形に加工します。本来ならすべてPowerShellで行いたいところですが、(私にとっては)複雑な処理なので加工はPythonを使います。

まず、PowerShellでM365から配布グループを書き出し、エクセルファイルを作成するところまでを行います。

PowerShell

※ 必要なモジュールは適宜インストールしてください。

# スクリプトファイルがある場所のパスを取得
$CurrentFolder = Split-Path $MyInvocation.MyCommand.Path -Parent

# 「99_バックアップデータ」がなければ作成
if (-not(Test-Path $CurrentFolder"\99_バックアップデータ")){
    New-Item $CurrentFolder"\99_バックアップデータ" -ItemType Directory
}

# 前回のデータがあればバックアップに移動
if (Test-Path $CurrentFolder"\配布グループ一覧_*.xlsx"){
    Move-Item $CurrentFolder"\配布グループ一覧_*.xlsx" $CurrentFolder"\99_バックアップデータ"
}

# Excelを操作する為の宣言
$excel = New-Object -ComObject Excel.Application
# 起動したExcelを表示しない
$excel.Visible = $False
# ワークブックを作成
$book = $excel.Workbooks.Add()
# ワークシートを番号で指定し、接続する
$sheet = $book.Worksheets.Item(1)

# 指定したセルに文字列を入力し、装飾する
$sheet.Cells.Item(1, 1) = "ML_2"
$sheet.Cells.Item(1, 2) = "ML_1"

# 列幅を自動調整する
$sheet.Range("A1:E1").columnwidth = 20

# 認証情報を入力してログインする
$Credential = Get-Credential

Connect-ExchangeOnline -Credential $credential
$AllDistributionGroup = Get-DistributionGroup -ResultSize Unlimited | Select-Object DisplayName

# 最新情報を入力
$LastLow = 2
for ($i=0; $i -lt $AllDistributionGroup.count; $i++) {
    if(-not ([string]::IsNullOrEmpty($AllDistributionGroup[$i].DisplayName))){
        $array = @(Get-DistributionGroupMember -Identity $AllDistributionGroup[$i].DisplayName -ResultSize Unlimited | Select-Object DisplayName)
        for ($j = 0; $j -lt $array.count; $j++) {
            $sheet.Cells.Item($LastLow, 1).value = $AllDistributionGroup[$i].DisplayName
            $sheet.Cells.Item($LastLow, 2).value = $array[$j].DisplayName
            $LastLow += 1
        }
    }
}

# 名前をつけて保存
$book.SaveAs("$CurrentFolder\配布グループ一覧_$(Get-Date -Format "yyyyMMdd_HHmmss").xlsx")
# Excelを閉じる
$excel.Quit()
# プロセスを解放する
$excel = $null
[GC]::Collect()

# 接続を切断
Disconnect-ExchangeOnline -Confirm:$false

※ 本コードを利用する場合は必ず以下の免責事項をご確認ください。

おわり

今回はここまでです。Pythonでの加工編は以下から。

おまけ

どんな世界が見えているんだろう。


この記事が気に入ったらサポートをしてみませんか?