見出し画像

M365の退職者アカウントをPowerShellで一括処理(更新編)

退職者アカウント一括処理の更新編です。
準備編は下記をご確認ください。

準備編で作成したエクセルファイルに退職者を入力し終えたら、下記のコードを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

# MsolServiceに接続
Connect-MsolService -Credential $credential
# 全ユーザー名を取得
$AllUser = Get-MsolUser -All | Where-Object {$_.isLicensed -eq $true} | Select-Object DisplayName
# ExchangeOnlineに接続
Connect-ExchangeOnline -Credential $credential

# ログを格納する配列を作成
$Success_array = @()
$Error_array = @()

for ($i = 3; $i -lt $lastrow+1 ; $i++) {
    # 対象となるユーザー名を取得
    $Member = $sheet.Cells.Item($i, 1).Text
    # 対象となるユーザーの存在確認
    if(-not($AllUser.DisplayName -contains $Member)){
        $Error_Log = [string]($i-1) +" ユーザー名 "+ $Member + " は存在しません。"
        Write-Host $Error_Log
        $Error_array += $Error_Log
    }else{
        # 対象者のサインインアカウント名 (UPN) を取得
        $upn = (Get-User -Identity $Member).UserPrincipalName
        # 対象者のサインインを禁止
        Set-MsolUser -UserPrincipalName $upn -BlockCredential $True
        $Success = [string]($i)+" " + $Member +" のサインインを禁止にしました。"
        Write-Host $Success
        $Success_array += $Success

        # 対象者の識別名(DN)を取得する。
        $dn = (Get-User -Identity $Member).DistinguishedName
        # 対象者を含む配布グループを取得する。
        $Get_DistributionGroup = @(Get-DistributionGroup -Filter "members -eq '$dn'" | Select-Object DisplayName)
        # 配布グループから削除する
        for ($j = 0; $j -lt $Get_DistributionGroup.count ; $j++){
            $Remove_DistributionGroup = $Get_DistributionGroup[$j].DisplayName
            Remove-DistributionGroupMember -Identity $Remove_DistributionGroup -Member $Member -Confirm:$false
            $Success = [string]($i)+" " + $Member +" を配布グループの " +$Remove_DistributionGroup +" から削除しました。"
            Write-Host $Success
            $Success_array += $Success
        }

        # 対象者を含む365グループを取得する。
        $Get_UnifiedGroup = @(Get-UnifiedGroup -Filter "members -eq '$dn'" | Select-Object DisplayName)
        # 365グループから削除する
        for ($j = 0; $j -lt $Get_UnifiedGroup.count ; $j++){
            $Remove_UnifiedGroup = $Get_UnifiedGroup[$j].DisplayName
            # 対象グループの所有者を取得する
            $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_UnifiedGroup -LinkType Members -Links $Member -Confirm:$false
            $Success = [string]($i)+" " + $Member +" を365グループの " +$Remove_UnifiedGroup +" のメンバーから削除しました。"
            Write-Host $Success
            $Success_array += $Success
        }
    }
}

# ログ(配列)を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

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

おまけ

気になる、けどちょっと怖い

いいなと思ったら応援しよう!