안녕하세요!
오늘은 M365 관리 업무 중 번거로운 작업 중 하나인 **'다수 계정 일괄 삭제'**를 자동화하는 PowerShell 스크립트를 공유합니다.

엑셀이나 메모장에 정리된 UPN(User Principal Name) 목록을 읽어와서 한 번에 처리하고, 진행 현황까지 실시간으로 확인할 수 있는 로직입니다.


🛠️ 스크립트 특징

  1. MS Graph 모듈 기반: 곧 지원 중단될 MSOnline 대신 최신 Microsoft Graph SDK를 사용합니다.
  2. 진행 현황 표시: 총 몇 건 중 몇 번째 작업이 진행 중인지 Write-Host로 시각화합니다.
  3. 예외 처리: 특정 계정에서 오류가 발생해도 멈추지 않고 다음 단계로 넘어갑니다.
  4. 빈 줄 무시: 텍스트 파일 내 불필요한 공백이나 빈 줄을 필터링합니다.

아래 PowerShell 스크립트를 사용하면 Microsoft Graph 모듈이 설치되어 있어야 하니 아래 첨부 링크를 참고하여 모듈 먼저 설치해 주시기 바랍니다.

 

https://learn.microsoft.com/ko-kr/microsoft-365/enterprise/connect-to-microsoft-365-powershell?view=o365-worldwide#step-1-install-the-required-software

💡 사용 시 주의사항

  • 권한: 스크립트 실행 시 전역 관리자 또는 사용자 관리자 권한이 있는 계정으로 로그인해야 합니다.
  • Soft Delete: 이 스크립트로 삭제된 계정은 M365 관리 센터의 '삭제된 사용자' 항목에 30일간 보관됩니다. (영구 삭제가 필요한 경우 별도의 옵션이 필요합니다.)
  • 파일 형식: .txt 파일 안에 이메일 주소 형태의 UPN을 한 줄당 하나씩 입력해 주세요.
# 1. Microsoft Graph 연결 (권한 확인)
Connect-MgGraph -Scopes "User.ReadWrite.All"

# 2. UPN 정보가 포함된 파일 경로 (사용자 환경에 맞춰 수정)
$filePath = "C:\M365_Admin\delete_list.txt"

# 파일 체크
if (-not (Test-Path $filePath)) {
    Write-Host "[Error] 파일을 찾을 수 없습니다: $filePath" -ForegroundColor Red
    return
}

# 3. 데이터 로드 및 초기화
$upnList = Get-Content $filePath | Where-Object { $_ -ne "" }
$totalCount = $upnList.Count
$currentCount = 0

Write-Host "`n--- M365 계정 삭제 작업 시작 (총 $totalCount 건) ---" -ForegroundColor Cyan -Object

# 4. 일괄 처리 루프
foreach ($upn in $upnList) {
    $currentCount++
    try {
        # 유저 존재 확인 및 삭제 실행
        $user = Get-MgUser -UserId $upn -ErrorAction Stop
        Remove-MgUser -UserId $upn
        
        Write-Host "[$currentCount/$totalCount] 성공: $upn" -ForegroundColor Green
    }
    catch {
        Write-Host "[$currentCount/$totalCount] 실패: $upn (사유: $($_.Exception.Message))" -ForegroundColor Red
    }
}

Write-Host "`n--- 모든 작업이 종료되었습니다 ---" -ForegroundColor Cyan
Disconnect-MgGraph

 

 

위 코드를 실행 시키면 아래와 같은 과정을 거치게 됩니다


 

관리자 권한이 있는 계정으로 입력합니다.

 

 

2차 인증이 설정되어 있을 경우 2차 인증을 진행합니다.

 

 

계정에 Microsoft Graph 권한을 부여하는 과정이므로 '조직 대신 동의'를 클릭 후 하단의 수락 버튼을 클릭합니다.

 

정상적으로 스크립트가 실행되는 것을 확인할 수 있습니다.

 

 

 

포스팅이 도움이 되셨다면 공감과 댓글 부탁드립니다! 추가로 자동화가 필요한 로직이 있다면 언제든 말씀해 주세요. :)