반응형

테넌트를 이사해야 하는 경우나 여러 이유에 의해서 개체 제거 보다는 도메인 제거만 원하는 시나리오가 발생할 있습니다. 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

Get-MsolUser

 

Excel 필터링하여 Custom 도메인만 필터링

UserPrincipalName

 

텍스트 나누기 Concatenate 함수를 이용하여 onmicrosoft.com UPN 목록 생성

Concatenate

 

아래와 같은 형태로 CSV 파일 저장

NEWUPN List

 

기본적으로 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

 

아래와 같이 결과 확인

Result

 

II. Mailbox의 SecondSMTPaddress 제거

아래와 같이 사서함의 Secondary Address 대한 제거를 진행합니다.

Alias

 

사서함의 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

 

결과 확인

Remove Addresses

 

관리 페이지에서도 제거된 것을 확인

 

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

 

되도록 개체를 제거하지 않는 상태로 도메인을 제거하는 방법에 대해서 다뤄 보았습니다.

이 이외에도 다른 종류의 개체가 있다면, 유사한 접근법으로 진행할 수 있습니다.

반응형

+ Recent posts