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
※ 本コードを利用する場合は必ず以下の免責事項をご確認ください。