M365の配布グループ・365グループをPowerShellで一括更新(更新編)
M365の人事異動対応は、件数が少なければ管理ポータルでの作業で十分ですが、多くなると大変・・・。
準備編で生成したExcelファイルに人事情報を入力し、PowerShellでMicrosoft365(M365)へ一括更新することにより、時間短縮とミス軽減となります。準備編は下記をご覧ください。
PowerShell
# スクリプトファイルがある場所のパスを取得
$CurrentFolder = Split-Path $MyInvocation.MyCommand.Path -Parent
# Excelを操作する為の宣言
$excel = New-Object -ComObject Excel.Application
# 起動したExcelを表示しない
$excel.Visible = $false
# Excelファイルのフルパスを取得
$excelFile = (Get-ChildItem $CurrentFolder"\人事異動_*.xlsx").FullName
# もしExcelファイルが存在していたら開く。なければ終了。
if (-not ([string]::IsNullOrEmpty($excelFile))){
$book = $excel.Workbooks.Open($excelFile, 0, $true)
}else{
Write-Host "エクセルファイルが存在しないため実行できません。"`r`n
exit
}
# エクセルファイルのデータを取得
$sheet = $book.Worksheets.Item("Sheet1")
# 最終行の行数取得
$lastrow = $sheet.Range("A1").End([Microsoft.Office.Interop.Excel.XlDirection]::xlDown.value__).Row
if ($lastrow -eq 2){
Write-Host "入力データがないため実行できません。"`r`n
exit
}
# 認証情報を入力
$Credential = Get-Credential
# ExchangeOnlineから全ユーザー名・全配布グループ・全365グループを取得
Connect-MsolService -Credential $credential
$AllUser = Get-MsolUser -All | Where-Object {$_.isLicensed -eq $true} | Select-Object DisplayName
Connect-ExchangeOnline -Credential $credential
$AllDistributionGroup = Get-DistributionGroup -ResultSize Unlimited | Select-Object DisplayName
$AllUnifiedGroup = Get-UnifiedGroup -ResultSize Unlimited | Select-Object DisplayName
# ログを格納する配列を作成
$Success_array = @()
$Error_array = @()
for ($i = 3; $i -lt $lastrow+1 ; $i++) {
# Excelから対象となるユーザー名を取得
$Member = $sheet.Cells.Item($i, 1).Text
# 対象となるユーザーの存在確認
if(-not(($AllUser.DisplayName -contains $Member) -or ($AllDistributionGroup.DisplayName -contains $Member))){
$Error_Log = [string]($i-1) + $Member + " は存在しません。"
Write-Host $Error_Log
$Error_array += $Error_Log
}else{
# # 配布グループに追加する
# 追加する配布グループを取得
$Add_ML_Group = $sheet.Cells.Item($i, 2).Text
if( -not ([string]::IsNullOrEmpty($Add_ML_Group))){
# 対象となる配布グループの存在確認
if($AllDistributionGroup.DisplayName -contains $Add_ML_Group){
# 対象となる配布グループに登録されているメンバーを取得
$array = Get-DistributionGroupMember -Identity $Add_ML_Group -ResultSize Unlimited | Select-Object DisplayName
# 登録されていなければ追加。登録されていたらスキップ
if( -not ($array.DisplayName -contains $Member)){
Add-DistributionGroupMember -Identity $Add_ML_Group -Member $Member
$Success = [string]($i)+" " + $Member +" を配布グループ " +$Add_ML_Group +" に追加しました。"
Write-Host $Success
$Success_array += $Success
}else{
$Success = [string]($i)+" " + $Member +" はすでに配布グループ " +$Add_ML_Group +" に登録されています。"
Write-Host $Success
$Success_array += $Success
}
}else{
$Errer = [string]($i) +" 配布グループ "+ $Add_ML_Group + " は存在しません。"
Write-Host $Errer
$Error_array += $Errer
}
}
# # 365グループに追加する
# 追加する365グループを取得
$Add_365_Group = $sheet.Cells.Item($i, 3).Text
if( -not ([string]::IsNullOrEmpty($Add_365_Group))){
# 対象となる365グループの存在確認
if($AllUnifiedGroup.DisplayName -contains $Add_365_Group){
# 対象となる365グループに登録されているメンバーを取得
$array = Get-UnifiedGroupLinks -Identity $Add_365_Group -LinkType Members -ResultSize Unlimited | Select-Object DisplayName
# 登録されていなければ追加。登録されていたらスキップ
if( -not ($array.DisplayName -contains $Member)){
Add-UnifiedGroupLinks -Identity $Add_365_Group -LinkType Members -Links $Member
$Success = [string]($i)+" " + $Member +" を365グループ " +$Add_365_Group +" に追加しました。"
Write-Host $Success
$Success_array += $Success
}else{
$Success = [string]($i)+" " + $Member +" はすでに365グループ " +$Add_365_Group +" に登録されています。"
Write-Host $Success
$Success_array += $Success
}
}else{
$Errer = [string]($i) +" 365グループ "+ $Add_365_Group + " は存在しません。"
Write-Host $Errer
$Error_array += $Errer
}
}
# # 配布グループから削除する
# 削除する配布グループを取得
$Remove_ML_Group = $sheet.Cells.Item($i, 4).Text
if( -not ([string]::IsNullOrEmpty($Remove_ML_Group))){
# 対象となる配布グループの存在確認
if($AllDistributionGroup.DisplayName -contains $Remove_ML_Group){
# 対象となる配布グループに登録されているメンバーを取得
$array = Get-DistributionGroupMember -Identity $Remove_ML_Group -ResultSize Unlimited | Select-Object DisplayName
# 登録されていれば削除。登録されていなけばスキップ
if($array.DisplayName -contains $Member){
Remove-DistributionGroupMember -Identity $Remove_ML_Group -Member $Member -Confirm:$false
$Success = [string]($i)+" " + $Member +" を配布グループ " +$Remove_ML_Group +" から削除しました。"
Write-Host $Success
$Success_array += $Success
}else{
$Success = [string]($i)+" " + $Member +" は配布グループ " +$Remove_ML_Group +" に登録されていません。"
Write-Host $Success
$Success_array += $Success
}
}else{
$Errer = [string]($i) +" 配布グループ "+ $Remove_ML_Group + " は存在しません。"
Write-Host $Errer
$Error_array += $Errer
}
}
# # 365グループから削除する
# 削除する365グループを取得
$Remove_365_Group = $sheet.Cells.Item($i, 5).Text
if( -not ([string]::IsNullOrEmpty($Remove_365_Group))){
# 対象となる365グループの存在確認
if($AllUnifiedGroup.DisplayName -contains $Remove_365_Group){
# 対象となる365グループに登録されているメンバーを取得
$array = Get-UnifiedGroupLinks -Identity $Remove_365_Group -LinkType Members -ResultSize Unlimited | Select-Object DisplayName
# 登録されていれば削除。
if($array.DisplayName -contains $Member){
# 対象グループの所有者を取得する
$array = Get-UnifiedGroupLinks -Identity $Remove_UnifiedGroup -LinkType owner -ResultSize Unlimited | Select-Object DisplayName
# 対象が所有者になっている場合は、所有者から外す
if($array.DisplayName -contains $Member){
# Remove-UnifiedGroupLinks -Identity $Remove_UnifiedGroup -LinkType owner -Links $Member -Confirm:$false
$Success = [string]($i)+" " + $Member +" を365グループの " +$Remove_UnifiedGroup +" の所有者から削除しました。"
Write-Host $Success
$Success_array += $Success
}
Remove-UnifiedGroupLinks -Identity $Remove_365_Group -LinkType Members -Links $Member -Confirm:$false
$Success = [string]($i)+" " + $Member +" を365グループ " +$Remove_365_Group +" から削除しました。"
Write-Host $Success
$Success_array += $Success
}else{
$Success = [string]($i)+" " + $Member +" は365グループ " +$Remove_365_Group +" に登録されていません。"
Write-Host $Success
$Success_array += $Success
}
}else{
$Errer = [string]($i) +" 365グループ "+ $Remove_365_Group + " は存在しません。"
Write-Host $Errer
$Error_array += $Errer
}
}
}
}
# ログ(配列)をCSV出力
if ($Error_array.count -gt 0 ){
$Error_array | Out-File -FilePath $CurrentFolder\人事異動_ErrorLog_$(Get-Date -Format "yyyyMMdd_HHmmss").txt
}
if ($Success_array.count -gt 0 ){
$Success_array | Out-File -FilePath $CurrentFolder\人事異動_SuccessLog_$(Get-Date -Format "yyyyMMdd_HHmmss").txt
}
# Excelを閉じる
$excel.Quit()
# プロセスを解放する
$excel = $null
[GC]::Collect()
# 接続を切断
Disconnect-ExchangeOnline -Confirm:$false
※ 本コードを利用する場合は必ず以下の免責事項をご確認ください。
※ 必要なモジュールは適宜インストールしてください。
解説
上記コードをメモ帳等のテキストエディタにコピペして、拡張子「.ps1」で保存してください。
エクセルファイルの存在確認、入力データ確認を行い、なければ終了します。
入力データにタイプミスがないかを確認するため、ExchangeOnlineにログインし、全ユーザー名・全配布グループ・全365グループを取得します。
入力内容をそれぞれ確認し、正しくM365に登録されている内容であれば追加・削除の処理を実行します。
実行した内容に合わせてログファイルを生成します。人事異動_ErrorLog〜.txtはエラーが発生した場合のみ生成します。こちらに記載されている項目はM365に反映されていないので、入力内容を修正して再実行を行う必要があります。