Microsoft 365. Remove Domain
테넌트를 이사해야 하는 경우나 여러 이유에 의해서 개체 제거 보다는 도메인 제거만 원하는 시나리오가 발생할 수 있습니다. Admin Center에서 자동으로 제거되면 좋겠지만, 여러가지 이유에서 제거되지 않는 경우가 많습니다. Azure AD Sync는 Disable 했다는 가정하에 아래와 같이 Powershell 명령어로 제거하는 과정을 진행하였습니다.
I. UPN 변경
아래의 명령어로 사용자의 UPN을 CSV로 내보내기
Get-MsolUser -All |Select-Object UserPrincipalName|Export-Csv -Path C:\csv\contoso.csv -NoTypeInformation -Encoding UTF8
Excel로 필터링하여 Custom 도메인만 필터링
텍스트 나누기 및 Concatenate 함수를 이용하여 onmicrosoft.com 의 새 UPN 목록 생성
아래와 같은 형태로 CSV 파일 저장
기본적으로 UPN을 변경하는 명령어는 다음과 같습니다.
Set-MsolUserPrincipalName -UserPrincipalName "기존UPN" -NewUserPrincipalName "변경할UPN"
기술자료: Set-MsolUser (MSOnline) | Microsoft Learn
CSV 파일을 불러와서 Bulk 로 변경하려면 아래와 같이 Foreach-Object 구문을 활용할 수 있습니다.
Import-Csv -Path C:\csv\contoso_NewUPN.csv |ForEach-Object {Set-MsolUserPrincipalName -UserPrincipalName $_.UserPrincipalname -NewUserPrincipalName $_.NEWUPN}
Import-Csv (Microsoft.PowerShell.Utility) - PowerShell | Microsoft Learn
ForEach-Object (Microsoft.PowerShell.Core) - PowerShell | Microsoft Learn
만약 위의 Foreach-Object 의 반복 작업 결과를 CSV로 내보내고 싶다면, 다음과 같이 진행합니다.
#NEWUPN
#Baseline
#Import-Csv -Path C:\csv\contoso_NewUPN.csv |ForEach-Object {Set-MsolUserPrincipalName -UserPrincipalName $_.UserPrincipalname -NewUserPrincipalName $_.NEWUPN}
$results = @()
Import-Csv -Path C:\csv\contoso_NewUPN.csv | ForEach-Object {
try {
Set-MsolUserPrincipalName -UserPrincipalName $_.UserPrincipalname -NewUserPrincipalName $_.NEWUPN
$results += [PSCustomObject]@{
'OldUPN' = $_.UserPrincipalname
'NewUPN' = $_.NEWUPN
'Status' = 'Success'
}
}
catch {
$results += [PSCustomObject]@{
'OldUPN' = $_.UserPrincipalname
'NewUPN' = $_.NEWUPN
'Status' = 'Failed: ' + $_.Exception.Message
}
}
}
$results | Export-Csv -Path C:\csv\output_results.csv -NoTypeInformation
아래와 같이 결과 확인
II. Mailbox의 SecondSMTPaddress 제거
아래와 같이 사서함의 Secondary Address에 대한 제거를 진행합니다.
사서함의 Email 주소 제거는 Set-mailbox -Emailaddresses @{remove="smtp:~~"} 형태로 진행할 수 있습니다.
Set-Mailbox (ExchangePowerShell) | Microsoft Learn
아래와 같이 contoso.kr 이 포함되어 있는 경우 제거하는 스크립트 제작
$results = @()
# 사용자 계정의 Secondary email Address에서 contoso.kr 제거
Get-Mailbox -ResultSize Unlimited | ForEach-Object {
$addresses = $_.EmailAddresses.Clone()
$modified = $false
$removedAddresses = @()
# contoso.kr 이 포함된 주소 검색 및 제거
foreach ($address in $addresses) {
if ($address -like "smtp:*@contoso.kr") {
$_.EmailAddresses.Remove($address)
$removedAddresses += $address
$modified = $true
}
}
# 변경된 경우 업데이트 및 결과 배열에 저장
if ($modified) {
Set-Mailbox $_.Identity -EmailAddresses $_.EmailAddresses
$results += [PSCustomObject]@{
'UserPrincipalName' = $_.UserPrincipalName
'RemovedAddresses' = ($removedAddresses -join '; ')
}
}
}
# 결과를 CSV로 내보내기
$results | Export-Csv -Path C:\csv\address_removal_results.csv -NoTypeInformation
결과 확인
관리 페이지에서도 제거된 것을 확인
III.메일 그룹에서 Custom domain 제거
메일 그룹은 영문표기로는 Distribution Group이라고 부릅니다. 메일 그룹을 불러오는 명령어는 Get-DistributionGroup 입니다.
Get-DistributionGroup -ResultSize unlimited |Select-Object PrimarySMTPAddress,Alias,Identity |Export-Csv -Path c:\csv\DLList_contoso.csv -NoTypeInformation -Encoding UTF8
Custom Domain 기준으로 필터링
PrimarySmtpAddress를 Identity로 사용하고 NewSMTP를 새로운 PrimarySmtpAddress로 변경할 것입니다.
메일 그룹의 Primary SMTP를 변경하고, 그 결과를 CSV로 내보내는 스크립트
#Import-Csv -Path C:\csv\DLList_NEWSMTP.csv |ForEach-Object {Set-DistributionGroup -Identity $_.Primarysmtpaddress -PrimarySmtpAddress $_.NEWSMTP}
# 결과를 저장할 배열 초기화
$results = @()
Import-Csv -Path C:\csv\DLList_NEWSMTP.csv | ForEach-Object {
try {
# Distribution Group의 Primary SMTP 주소 업데이트
Set-DistributionGroup -Identity $_.Primarysmtpaddress -PrimarySmtpAddress $_.NEWSMTP
# 성공한 경우의 결과 기록
$results += [PSCustomObject]@{
'OriginalSMTP' = $_.Primarysmtpaddress
'NewSMTP' = $_.NEWSMTP
'Status' = 'Success'
'ErrorMessage' = $null
}
}
catch {
# 실패한 경우의 결과 기록
$results += [PSCustomObject]@{
'OriginalSMTP' = $_.Primarysmtpaddress
'NewSMTP' = $_.NEWSMTP
'Status' = 'Failed'
'ErrorMessage' = $_.Exception.Message
}
}
}
# 결과를 CSV 파일로 내보내기
$results | Export-Csv -Path C:\csv\DLList_UpdateResults.csv -NoTypeInformation
결과를 확인
메일 그룹에서 Custom Domain이 Secondary Address에 있는 경우 제거
# 결과를 저장할 배열 초기화
$results = @()
# 모든 Distribution Group 검색
Get-DistributionGroup -ResultSize Unlimited | ForEach-Object {
$addresses = $_.EmailAddresses.Clone()
$modified = $false
$removedAddresses = @()
# contoso.kr 이 포함된 주소 검색 및 제거
foreach ($address in $addresses) {
if ($address -like "smtp:*@contoso.kr") {
$_.EmailAddresses.Remove($address)
$removedAddresses += $address
$modified = $true
}
}
# 변경된 경우 메일 그룹 업데이트 및 결과 배열에 저장
if ($modified) {
Set-DistributionGroup $_.Identity -EmailAddresses $_.EmailAddresses
$results += [PSCustomObject]@{
'GroupIdentity' = $_.Identity
'RemovedAddresses' = ($removedAddresses -join '; ')
}
}
}
# 결과를 CSV 파일로 내보내기
$results | Export-Csv -Path C:\csv\DG_AddressRemovalResults.csv -NoTypeInformatio
결과 확인
IV.Mail User 개체에 Custom Domain 제거
아래의 명령어를 진행하여 체크합니다.
Get-recipient | where {$_.EmailAddresses -match "contoso.kr"} | fl Name, RecipientType, EmailAddresses
-> 대부분 MailUser인 것을 확인할 수 있습니다.
아래의 스크립트로 주소를 제거 합니다.
# 결과를 저장할 배열 초기화
$results = @()
# 모든 MailUser 검색
Get-MailUser -ResultSize Unlimited | ForEach-Object {
$addresses = $_.EmailAddresses.Clone()
$modified = $false
$removedAddresses = @()
# contoso.kr 이 포함된 주소 검색 및 제거
foreach ($address in $addresses) {
if ($address -like "smtp:*@contoso.kr") {
$_.EmailAddresses.Remove($address)
$removedAddresses += $address
$modified = $true
}
}
# 변경된 경우 MailUser 업데이트 및 결과 배열에 저장
if ($modified) {
Set-MailUser $_.Identity -EmailAddresses $_.EmailAddresses
$results += [PSCustomObject]@{
'MailUserIdentity' = $_.Identity
'RemovedAddresses' = ($removedAddresses -join '; ')
}
}
}
# 결과를 CSV 파일로 내보내기
$results | Export-Csv -Path C:\csv\MailUser_AddressRemovalResults.csv -NoTypeInformation
결과 확인
다시 한번 최종적으로 확인
V. 라이선스 없는 사용자 개체 제거
Get-MsolUser -DomainName contoso.kr | fl UserPrincipalName, *address*
도메인 제거 메뉴에서 아래와 같이 확인됩니다.
이 사용자 들은 관리센터에서 Change Domain을 시도합니다.
성공하면 다행이지만, 아래와 같이 오류가 나타날 수 있습니다. 라이선스가 없기 때문에 수정할 수 없다는 결론에 도달합니다.
이 사용자들은 삭제하여 잠시 휴지통에 넣는 것이 정신 건강상에 좋을 것 같습니다.
ChatGPT와 열심히 논의해본 결과.. Graph API를 통해서 제거가 가능하다고 나와 있습니다.
그런데 해당 스크립트를 제작하기가 어려웠습니다.
그래서 포기하고 아래와 같이 조회하여 확인
아래의 명령어로 제거
Get-MsolUser -DomainName contoso.kr|Remove-MsolUser -Force
도메인 제거를 진행합니다.
도메인을 제거한 뒤, 제거된 개체들을 조회합니다.
Get-MsolUser -ReturnDeletedUsers -DomainName contoso.kr
아래의 명령어로 복원할 수 있습니다.
Get-MsolUser -ReturnDeletedUsers -DomainName contoso.kr|Restore-MsolUser
되도록 개체를 제거하지 않는 상태로 도메인을 제거하는 방법에 대해서 다뤄 보았습니다.
이 이외에도 다른 종류의 개체가 있다면, 유사한 접근법으로 진행할 수 있습니다.