見出し画像

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」で保存してください。

  1. エクセルファイルの存在確認、入力データ確認を行い、なければ終了します。

  2. 入力データにタイプミスがないかを確認するため、ExchangeOnlineにログインし、全ユーザー名・全配布グループ・全365グループを取得します。

  3. 入力内容をそれぞれ確認し、正しくM365に登録されている内容であれば追加・削除の処理を実行します。

  4. 実行した内容に合わせてログファイルを生成します。人事異動_ErrorLog〜.txtはエラーが発生した場合のみ生成します。こちらに記載されている項目はM365に反映されていないので、入力内容を修正して再実行を行う必要があります。

おまけ

微笑んでくれた、と勝手な解釈。

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