M365の配布グループ・365グループをPowerShellで一括更新(準備編)
私が勤めている会社では月に2回、年に24回人事発令があります。
そのうち、年に2回ほどは大規模な異動。件数が少なければ管理ポータルでの作業で十分ですが、多くなるとやっぱり大変・・・。Microsoft365(M365)管理ポータルでの作業に6時間以上取られることもありました。
しかも、件数が多くなるほどミスが発生していて、後日発覚することがありました。ダブルチェックしても、チームとしてみると作業時間は倍になったうえ、それでもミスを完全に無くすまでには至りません。
そこで現在はエクセルに人事情報を入力し、PowerShellで一括更新できるようにしました。これによって時間短縮はもちろん、入力内容を一覧で確認できるのでミスも激減しました。ダブルチェックするのも簡単です。
また、事前情報があれば発令前から作業を開始することができるので、発令から反映までの時間がさらに短縮できます。基本的に人事発令があった当日中にM365に反映させなくてはいけないので、PowerShellを使うようになって人事発令による残業時間が大幅に減りました。
流れ
PowerShellで現在のユーザー・配布グループ・365グループを取得し、作業用のエクセルデータを生成 ※当記事にてコード配布
エクセルデータに更新情報を入力(タイプミスを防ぐためコピペで入力)
PowerShellでエクセルデータの内容を一括更新 ※別記事となります。
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_バックアップデータ"
}
if (Test-Path $CurrentFolder"\人事異動_ErrorLog_*.txt"){
Move-Item $CurrentFolder"\人事異動_ErrorLog_*.txt" $CurrentFolder"\99_バックアップデータ"
}
if (Test-Path $CurrentFolder"\人事異動_SuccessLog_*.txt"){
Move-Item $CurrentFolder"\人事異動_SuccessLog_*.txt" $CurrentFolder"\99_バックアップデータ"
}
# 認証情報を入力
$Credential = Get-Credential
# MsolServiceからライセンス付与された全ユーザー名を取得
Connect-MsolService -Credential $credential
$AllUser = Get-MsolUser -All | Where-Object {$_.isLicensed -eq $true} | Select-Object DisplayName
# ExchangeOnlineから全配布リスト・全365グループを取得
Connect-ExchangeOnline -Credential $credential
$AllDistributionGroup = Get-DistributionGroup -ResultSize Unlimited | Select-Object DisplayName
$AllUnifiedGroup = Get-UnifiedGroup -ResultSize Unlimited | Select-Object DisplayName
# Excelを操作する為の宣言
$excel = New-Object -ComObject Excel.Application
# 起動したExcelを表示しない
$excel.Visible = $False
# ワークブックを作成
$book = $excel.Workbooks.Add()
# ワークシートを番号で指定し、接続する
$sheet = $excel.Worksheets.Item(1)
# 指定したセルに文字列を入力し、装飾する
$sheet.Cells.Item(1, 1) = "※入力ミスがあるとエラーになるため、右側の各一覧からコピペしてください。"
$sheet.Cells.Item(1, 1).font.color = 0x0000ff
$sheet.Cells.Item(2, 1) = "ユーザー名"
$sheet.range("A2:E2").interior.color = 0xC0C0C0
$sheet.range("A2:E2").HorizontalAlignment = -4108
$sheet.Cells.Item(2, 2) = "追加する配布グループ"
$sheet.Cells.Item(2, 3) = "追加する365グループ"
$sheet.Cells.Item(2, 4) = "削除する配布グループ"
$sheet.Cells.Item(2, 5) = "削除する365グループ"
$sheet.Cells.Item(2, 7) = "ユーザー名一覧"
$sheet.Cells.Item(2, 8) = "配布グループ一覧"
$sheet.Cells.Item(2, 9) = "365グループ一覧"
$sheet.range("G2:I2").font.color = 0xffffff
$sheet.range("G2:I2").interior.color = 0x666666
$sheet.range("G2:I2").HorizontalAlignment = -4108
# 列幅を調整する
$sheet.Range("A1:E1","G1:I1").columnwidth = 20
$sheet.Columns.item(6).columnwidth = 2
# 最新情報を入力
for ($i = 0; $i -lt $AllUser.count; $i++) {
$sheet.Cells.Item($i+3, 7).value = $AllUser[$i].DisplayName
}
for ($i = 0; $i -lt $AllDistributionGroup.count; $i++) {
$sheet.Cells.Item($i+3, 8).value = $AllDistributionGroup[$i].DisplayName
}
for ($i = 0; $i -lt $AllUnifiedGroup.count; $i++) {
$sheet.Cells.Item($i+3, 9).value = $AllUnifiedGroup[$i].DisplayName
}
# 名前をつけて保存
$book.SaveAs("$CurrentFolder\人事異動_$(Get-Date -Format "yyyyMMdd_HHmmss").xlsx")
# Excelを閉じる
$excel.Quit()
# プロセスを解放する
$excel = $null
[GC]::Collect()
# 接続を切断
Disconnect-ExchangeOnline -Confirm:$false
※ 本コードを利用する場合は必ず以下の免責事項をご確認ください。
※ 必要なモジュールは以下を参考に適宜インストールしてください。
解説
上記コードをメモ帳等のテキストエディタにコピペして、拡張子「.ps1」で保存してください。
定期定期に発生する業務なので、前回分エクセルデータ、ログファイルをバックアップフォルダに自動的に格納しています。
ExchangeOnlineにログインし、全ユーザー名・全配布グループ・全365グループを取得します。そのデータをエクセルデータに記載しています。タイプミスがあると正しく反映されないので、人事異動情報はコピペで入力することを想定しています。
正常に終了すると、以下のエクセルデータが生成されます。
おわり
「準備編」はここまでです。「更新編」は以下から。