配布グループを Microsoft 365 に移行する方法

すべてのメールボックスが Exchange Online に移行されます。ただし、配布グループはまだオンプレミスにあるため、Microsoft 365 に移動して Exchange Online で直接管理したいと考えています。この記事では、配布グループを Microsoft 365 に移行する方法について説明します。

すべてのメールボックスが Microsoft 365 の Exchange Online に移行されたら、クラウドで配布グループを管理する必要があります。

Exchange オンプレミスまたは Exchange Online には、オンプレミスの配布グループを Exchange Online に移行するオプションはありません。これを行う唯一の方法は、DG を手動で再作成するか、PowerShell で自動化することです。

DG が 2 つしかない場合は、手動で行うのが良い方法です。ただし、DG が多数ある場合は時間がかかるため、PowerShell を使用するのが最善の選択肢です。

重要:Microsoft 365 にすべてのメールボックスがあり、オンプレミスの Exchange にそれ以上のメールボックスがない場合にのみ、次の手順を実行してください。 Exchange ハイブリッド環境のオンプレミスにメールボックスがある限り、オンプレミスで配布グループを作成する必要があります。

ステップ 1. オンプレミスの配布グループをエクスポートする

最初の手順では、すべての配布グループを CSV ファイルにエクスポートします。

PowerShell スクリプトは、次の DG グループ タイプをエクスポートします。

関連している:Microsoft 365 グループのウェルカム メッセージを無効にする

  • 配布グループ
  • セキュリティグループ
  • ルーム リスト (これは PowerShell を使用してのみ取得できます)

オンプレミスの Exchange 管理センターで DG がどのように表示されるかを次に示します。ここでもルームリストは表示されません。

Export-DGs.ps1 PowerShell スクリプトをダウンロードして、次の場所に配置します。C:スクリプトフォルダ。スクリプトは CSV ファイルをC:温度フォルダ。お持ちでない場合は、温度フォルダーを作成します。

# V1.1
# Export-DGs.ps1
# https://www.alitajran.com/migrate-distribution-groups-to-microsoft-365/

# CSV file export path
$Csvfile = "C:tempDGs.csv"

# Get all distribution groups
$Groups = Get-DistributionGroup -ResultSize Unlimited

# Count the total number of distribution groups
$totalGroups = $Groups.Count
$currentGroupIndex = 0

# Initialize a List to store the data
$Report = [System.Collections.Generic.List[Object]]::new()

# Loop through distribution groups
foreach ($Group in $Groups) {
    $currentGroupIndex++
    $GroupDN = $Group.DistinguishedName

    # Check ManagedBy and get the primary SMTP address of managers
    $managersList = $null
    if ($group.ManagedBy) {
        $managers = foreach ($managerDN in $group.ManagedBy) {
            $recipient = Get-Recipient -Identity $managerDN -ErrorAction SilentlyContinue
            if ($recipient) {
                $recipient.PrimarySmtpAddress
            }
        }
        $managersList = $managers -join ','
    }

    # Update progress bar
    $progressParams = @{
        Activity        = "Processing Distribution Groups"
        Status          = "Processing Group $currentGroupIndex of $totalGroups"
        PercentComplete = ($currentGroupIndex / $totalGroups) * 100
    }

    Write-Progress @progressParams

    # Get required attributes directly within the output object
    $ReportLine = [PSCustomObject]@{
        DisplayName                            = $Group.DisplayName
        Name                                   = $Group.Name
        PrimarySmtpAddress                     = $Group.PrimarySmtpAddress
        EmailAddresses                         = ($Group.EmailAddresses -join ',')
        Domain                                 = $Group.PrimarySmtpAddress.ToString().Split("@")[1]
        Alias                                  = $Group.Alias
        GroupType                              = $Group.GroupType
        RecipientTypeDetails                   = $Group.RecipientTypeDetails
        Members                                = (Get-DistributionGroupMember $GroupDN -ResultSize Unlimited).Name -join ','
        MembersPrimarySmtpAddress              = (Get-DistributionGroupMember $GroupDN -ResultSize Unlimited).PrimarySmtpAddress -join ','
        ManagedBy                              = $managersList
        HiddenFromAddressLists                 = $Group.HiddenFromAddressListsEnabled
        MemberJoinRestriction                  = $Group.MemberJoinRestriction
        MemberDepartRestriction                = $Group.MemberDepartRestriction
        RequireSenderAuthenticationEnabled     = $Group.RequireSenderAuthenticationEnabled
        AcceptMessagesOnlyFrom                 = ($Group.AcceptMessagesOnlyFrom.Name -join ',')
        AcceptMessagesOnlyFromDLMembers        = ($Group.AcceptMessagesOnlyFromDLMembers -join ',')
        AcceptMessagesOnlyFromSendersOrMembers = ($Group.AcceptMessagesOnlyFromSendersOrMembers -join ',')
        ModeratedBy                            = ($Group.ModeratedBy -join ',')
        BypassModerationFromSendersOrMembers   = ($Group.BypassModerationFromSendersOrMembers -join ',')
        ModerationEnabled                      = $Group.ModerationEnabled
        SendModerationNotifications            = $Group.SendModerationNotifications
        GrantSendOnBehalfTo                    = ($Group.GrantSendOnBehalfTo.Name -join ',')
        Notes                                  = (Get-Group $GroupDN).Notes
    }
    $Report.Add($ReportLine)
}

# Clear progress bar
Write-Progress -Activity "Processing Distribution Groups" -Completed

# Sort the output by DisplayName and export to CSV file
$Report | Sort-Object DisplayName | Export-CSV -Path $Csvfile -NoTypeInformation -Encoding UTF8 #-Delimiter ";"

Exchange 管理シェルでスクリプトを実行して、すべてのオンプレミス DG を CSV ファイルにエクスポートします。

C:Scripts.Export-DGs.ps1

手順 2. オンプレミスの配布グループの CSV ファイルを編集する

CSVファイルを開くDGs.csvC:温度.

CSV ファイルは次の手順のスクリプトが実行するものであるため、この部分は非常に重要です。したがって、プロパティに正しい値をすべて設定していない場合は、エラーが発生します。

したがって、時間をかけてすべてを正確に入力してください。 CSV ファイルが次の場所にあることを確認します。C:温度そして名前が付いていますDGs.csv

DG をインポートするときにエラーが表示される理由の例を次に示します。

管理者はグループの所有者になることができますが、その名前の Microsoft 365 アカウントを持っていない場合、そのアカウントは所有者として追加されません。したがって、配布グループごとに CSV ファイルにユーザーを所有者として追加する必要があります。配布グループが管理者によって所有されているとします。これらのフィールドに Microsoft 365 管理者名を入力します。

グループ所有者を空のままにすることもできますが、DG をインポートし、スクリプトを実行している管理者アカウントをデフォルトとして設定する次のステップでエラーが表示されます。

手順 3. Microsoft 365 に配布グループをインポートする

配布グループを作成し、元の配布グループを保持する唯一の方法は、グループに別の名前を追加することです。これは後の段階で変更します。

これらの DG がユーザーの組織に表示されないように、配布グループを作成し、グローバル アドレス一覧 (GAL) から非表示にしておくことが重要です。すべてがチェックされたら、最後のステップでユーザーに表示できるようにします。

を追加します。C-作成するすべての配布グループのプレフィックス。こうすることで、グループを簡単に識別したり、必要に応じて並べ替えたりすることができます。のCを表します.

Import-DGs.ps1 PowerShell スクリプトをダウンロードして、次の場所に配置します。C:スクリプトフォルダ。

# V1.1
# Import-DGs.ps1
# https://www.alitajran.com/migrate-distribution-groups-to-microsoft-365/

# Path to the CSV file containing distribution group data
$Csvfile = "C:tempDGs.csv"

# Import CSV file
$GroupsData = Import-Csv -Path $Csvfile

# Connect Exchange Online
Connect-ExchangeOnline

# Iterate through each row of the CSV file
foreach ($GroupData in $GroupsData) {
    # Check if the distribution group already exists
    $ExistingGroup = Get-DistributionGroup -Identity ("C-" + $GroupData.DisplayName) -ErrorAction SilentlyContinue

    if ($ExistingGroup) {
        Write-Host "Distribution group $($ExistingGroup.DisplayName) already exists." -ForegroundColor Yellow
    }
    else {
        if ($GroupData.RecipientTypeDetails -eq "MailUniversalSecurityGroup") {
            # Construct parameters for New-DistributionGroup cmdlet
            $NewGroupParams = @{
                DisplayName        = "C-" + $GroupData.DisplayName
                Name               = "C-" + $GroupData.Name
                Alias              = "C-" + $GroupData.Alias
                PrimarySMTPAddress = "C-" + $GroupData.PrimarySmtpAddress
                Type               = "Security"
            }

            # Create a new distribution group
            $NewGroup = New-DistributionGroup @NewGroupParams

            # Construct parameters for Set-DistributionGroup cmdlet
            $SetGroupParams = @{
                Identity                           = $NewGroup.DisplayName
                HiddenFromAddressListsEnabled      = $True
                MemberJoinRestriction              = $GroupData.MemberJoinRestriction
                MemberDepartRestriction            = $GroupData.MemberDepartRestriction
                RequireSenderAuthenticationEnabled = [System.Convert]::ToBoolean($GroupData.RequireSenderAuthenticationEnabled)
                Description                        = if (-not [string]::IsNullOrWhiteSpace($GroupData.Notes)) { $GroupData.Notes } else { $null }
                ManagedBy                          = $GroupData.ManagedBy -split ','
            }

            # Set additional properties
            Set-DistributionGroup @SetGroupParams

            # Display success message
            Write-Host "Distribution group $($NewGroup.DisplayName) created successfully." -ForegroundColor Green
        }
        elseif ($GroupData.RecipientTypeDetails -eq "MailUniversalDistributionGroup") {
            # Construct parameters for New-DistributionGroup cmdlet
            $NewGroupParams = @{
                DisplayName        = "C-" + $GroupData.DisplayName
                Name               = "C-" + $GroupData.Name
                Alias              = "C-" + $GroupData.Alias
                PrimarySMTPAddress = "C-" + $GroupData.PrimarySmtpAddress
            }

            # Create a new distribution group
            $NewGroup = New-DistributionGroup @NewGroupParams

            # Construct parameters for Set-DistributionGroup cmdlet
            $SetGroupParams = @{
                Identity                           = $NewGroup.DisplayName
                HiddenFromAddressListsEnabled      = $True
                MemberJoinRestriction              = $GroupData.MemberJoinRestriction
                MemberDepartRestriction            = $GroupData.MemberDepartRestriction
                RequireSenderAuthenticationEnabled = [System.Convert]::ToBoolean($GroupData.RequireSenderAuthenticationEnabled)
                Description                        = if (-not [string]::IsNullOrWhiteSpace($GroupData.Notes)) { $GroupData.Notes } else { $null }
                ManagedBy                          = $GroupData.ManagedBy -split ','
            }

            # Set additional properties
            Set-DistributionGroup @SetGroupParams

            # Display success message
            Write-Host "Distribution group $($NewGroup.DisplayName) created successfully." -ForegroundColor Green
        }
        elseif ($GroupData.RecipientTypeDetails -eq "RoomList") {
            # Construct parameters for New-DistributionGroup cmdlet
            $NewGroupParams = @{
                DisplayName        = "C-" + $GroupData.DisplayName
                Name               = "C-" + $GroupData.Name
                Alias              = "C-" + $GroupData.Alias
                PrimarySMTPAddress = "C-" + $GroupData.PrimarySmtpAddress
                Roomlist           = $True
            }

            # Create a new distribution group
            $NewGroup = New-DistributionGroup @NewGroupParams

            # Construct parameters for Set-DistributionGroup cmdlet
            $SetGroupParams = @{
                Identity                           = $NewGroup.DisplayName
                HiddenFromAddressListsEnabled      = $True
                MemberJoinRestriction              = $GroupData.MemberJoinRestriction
                MemberDepartRestriction            = $GroupData.MemberDepartRestriction
                RequireSenderAuthenticationEnabled = [System.Convert]::ToBoolean($GroupData.RequireSenderAuthenticationEnabled)
                Description                        = if (-not [string]::IsNullOrWhiteSpace($GroupData.Notes)) { $GroupData.Notes } else { $null }
                ManagedBy                          = $GroupData.ManagedBy -split ','
            }

            # Set additional properties
            Set-DistributionGroup @SetGroupParams

            # Display success message
            Write-Host "Distribution group $($NewGroup.DisplayName) created successfully." -ForegroundColor Green
        }
    }
}

PowerShell を管理者として実行し、Exchange Online PowerShell に接続します。

Connect-ExchangeOnline

Exchange Online PowerShell でスクリプトを実行して、CSV ファイルから DG を作成します。C-Exchange Online – Microsoft 365 のプレフィックス。

C:Scripts.Import-DGs.ps1

にサインインしますExchange 管理センター。ことを確認します。C-配布グループは正常に作成されます。配布リストそしてでメール対応のセキュリティ.

をクリックしてくださいDGそして選択します一般的な。値が正常に設定されていることを確認します。

をクリックしてくださいメンバーDG 所有者が正常に追加されたことを確認します。

をクリックしてください設定そして、[グローバル アドレス一覧からこのグループを非表示にする] 値が有効になっていることを確認します。

手順 4. 配布グループにメンバーを追加する

Add-MembersDGs.ps1 PowerShell スクリプトをダウンロードして、次の場所に配置します。C:スクリプトフォルダ。

# V1.0
# Add-MembersDGs.ps1
# https://www.alitajran.com/migrate-distribution-groups-to-microsoft-365/

# Path to the CSV file containing distribution group data
$Csvfile = "C:tempDGs.csv"

# Import CSV file
$GroupsData = Import-Csv -Path $Csvfile

# Iterate through each row of the CSV file
foreach ($GroupData in $GroupsData) {
    # Check if the distribution group already exists
    $ExistingGroup = Get-DistributionGroup -Identity ("C-" + $GroupData.DisplayName) -ErrorAction SilentlyContinue

    if ($null -eq $ExistingGroup) {
        Write-Host "Distribution group $($GroupData.DisplayName) does not exist." -ForegroundColor Yellow
    }
    else {
        # Check if MemberPrimarySmtpAddress is provided and not empty
        if (-not [string]::IsNullOrEmpty($GroupData.MembersPrimarySmtpAddress)) {
            # Split the member email addresses if there are multiple addresses
            $Members = $GroupData.MembersPrimarySmtpAddress -split ","
            foreach ($Member in $Members) {
                # Trim whitespace from each member's email address
                $Member = $Member.Trim()

                Write-Host "Attempting to add member $Member to $($ExistingGroup.DisplayName)." -ForegroundColor Cyan
                
                # Add member to the distribution group
                try {
                    Add-DistributionGroupMember -Identity $ExistingGroup.PrimarySmtpAddress -Member $Member -BypassSecurityGroupManagerCheck -ErrorAction Stop
                    Write-Host "Member $Member added to $($ExistingGroup.DisplayName)." -ForegroundColor Green
                }
                catch {
                    Write-Host "Failed to add member $Member to $($ExistingGroup.DisplayName). $_" -ForegroundColor Red
                }
            }
        }
        else {
            Write-Host "No member provided for $($ExistingGroup.DisplayName)." -ForegroundColor Yellow
        }
    }
}

Exchange Online PowerShell でスクリプトを実行して、CSV ファイルのメンバーをプレフィックス付きの DG に追加します。C-Exchange Online – Microsoft 365 で。

C:Scripts.Add-MembersDGs.ps1

DG をクリックし、メンバー。メンバーがC-流通グループ。

ステップ 5. DG を別の OU に移動する

Exchange ハイブリッド環境がない場合は、この手順をスキップできます。ただし、ほとんどの場合、Microsoft Entra Connect Sync が実行されており、オンプレミスと Microsoft 365 の間で同期されています。

配布グループが異なる OU にある場合は、以下のスクリプトを使用して、それらをすべて新しい OU に移動します。これにより、次の手順で OU の Microsoft Entra ID への同期を無効にするときに管理が容易になります。

変化6行目DG も移動する OU に移動します。

Move-DGs.ps1 PowerShell スクリプトをダウンロードして、次の場所に配置します。C:スクリプトフォルダ。

# V1.0
# Move-DGs.ps1
# https://www.alitajran.com/migrate-distribution-groups-to-microsoft-365/

# Specify distinguished name (DN) of target OU
$TargetOU = "OU=DG,OU=Groups,OU=Company,DC=exoip,DC=local"

# Get all distribution groups
$DistributionGroups = Get-DistributionGroup -ResultSize Unlimited

# Go through each distribution group
foreach ($DistributionGroup in $DistributionGroups) {
    # Move distribution group to target OU
    Move-ADObject -Identity $DistributionGroup.DistinguishedName -TargetPath $TargetOU -Confirm:$false
    Write-Host "Distribution group $($DistributionGroup.DisplayName) moved to $TargetOU." -ForegroundColor Green
}

PowerShell (オンプレミス) でスクリプトを実行して、DG をDGActive Directory の組織単位。

C:Scripts.Move-DGs.ps1

完了したら、開きますActive Directory ユーザーとコンピュータDG が OU に表示されることを確認します。DG.

手順 6. オンプレミス配布グループの同期を解除する

Microsoft Entra Connect 同期サーバーにサインインします。次に、Azure AD コネクト道具。

チェックを外しますDG組織単位 (OU) とすべての配布グループ。これにより、Microsoft 365 と同期されなくなります。

Microsoft 365 との同期がすでにオフになっている OU に DG を移動する場合は、Microsoft Entra Connect を強制的に同期するか、同期が自動的に実行されるまで最大 30 分間待つ必要があります。

Start-ADSyncSyncCycle -PolicyType Delta

10 分間待って、元のオンプレミスの配布グループがすべて Microsoft 365 に表示されなくなっているかどうかを確認します。クラウド配布グループのみが表示されます。これは、次のステップに進む前に非常に重要です。

ステップ 7. 配布グループを完成させる

これで、以下のスクリプトを正常に実行できるようになり、C-クラウド配布グループからのプレフィックスとプライマリ SMTP アドレスとすべてのセカンダリ アドレスを追加しますクラウド配布グループに。また、CSV ファイルから取得した DG にアドレス リストからの非表示を有効にする値も設定します。

Finalize-DGs.ps1 PowerShell スクリプトをダウンロードして、次の場所に配置します。C:スクリプトフォルダ。

# V1.0
# Finalize-DGs.ps1
# https://www.alitajran.com/migrate-distribution-groups-to-microsoft-365/

# Path to the CSV file containing distribution group data
$Csvfile = "C:tempDGs.csv"

# Import CSV file
$GroupsData = Import-Csv -Path $Csvfile

# Iterate through each row of the CSV file
foreach ($GroupData in $GroupsData) {
    # Check if the distribution group already exists
    $ExistingGroup = Get-DistributionGroup -Identity ("C-" + $GroupData.DisplayName) -ErrorAction SilentlyContinue

    if ($ExistingGroup) {
        Write-Host "Distribution group $($ExistingGroup.DisplayName) exists. Proceed." -ForegroundColor Green

        # Construct parameters for Set-DistributionGroup cmdlet
        $SetGroupParams = @{
            Identity                      = $ExistingGroup.DisplayName
            DisplayName                   = $GroupData.DisplayName.Replace("C-", "")
            Name                          = $GroupData.Name.Replace("C-", "")
            Alias                         = $GroupData.Alias.Replace("C-", "")
            EmailAddresses                = ($GroupData.EmailAddresses -split ',')
            HiddenFromAddressListsEnabled = [System.Convert]::ToBoolean($GroupData.HiddenFromAddressLists)
        }
        try {
            # Set additional properties
            Set-DistributionGroup @SetGroupParams -ErrorAction Stop

            # Display success message
            Write-Host "Distribution group $($ExistingGroup.DisplayName) updated successfully to $($GroupData.DisplayName)." -ForegroundColor Green
        }

        catch {
            Write-Host "Error updating distribution group $($ExistingGroup.DisplayName): $_" -ForegroundColor Red
        }
    }
    else {
        Write-Host "Distribution group C-$($GroupData.DisplayName) does not exist. Skipping update." -ForegroundColor Red
    }
}

Exchange Online PowerShell でスクリプトを実行して、C-すべての DG からプレフィックスを取得し、すべての電子メール アドレスをインポートします。

C:Scripts.Finalize-DGs.ps1

Exchange 管理センター (Microsoft 365) で、すべての配布グループが正しく表示されていることを確認します。C-接頭辞。

電子メール アドレスが配布グループに正常に追加されたことを確認します。

[グローバル アドレス一覧からこのグループを非表示にする] の値が CSV ファイルから正しく取得され、配布グループに設定されていることを確認します。

手順 8. 配布グループへのメール フローをテストする

作成したいくつかの配布グループに電子メールを送信し、電子メールがグループ内の受信者に正常に配信されることを確認します。

それでおしまい!

結論

配布グループを Microsoft 365 に移行する方法を学習しました。これを行う唯一の方法は、Microsoft 365 管理センターで配布グループを手動で再作成するか、PowerShell スクリプトを使用することです。他に方法はありません。

この記事は気に入りましたか? PowerShell を使用して Microsoft 365 配布グループのメンバーを CSV にエクスポートすることもお勧めします。ぜひフォローしてこの記事をシェアしてください。

Related Posts