Jak migrować grupy dystrybucyjne do Microsoft 365

Wszystkie skrzynki pocztowe są migrowane do Exchange Online. Jednak grupy dystrybucyjne nadal działają lokalnie i chcemy przenieść je na platformę Microsoft 365, aby zarządzać nimi bezpośrednio w Exchange Online. W tym artykule dowiesz się, jak przeprowadzić migrację grup dystrybucyjnych do Microsoft 365.

Przeprowadź migrację lokalnych grup dystrybucyjnych do Microsoft 365

Po migracji wszystkich skrzynek pocztowych do Exchange Online na platformie Microsoft 365 chcesz zarządzać grupami dystrybucyjnymi w chmurze.

W lokalnym programie Exchange ani w programie Exchange Online nie ma opcji migracji lokalnych grup dystrybucyjnych do programu Exchange Online. Jedynym sposobem, aby to zrobić, jest ręczne odtworzenie DG lub zautomatyzowanie tego za pomocą programu PowerShell.

Jeśli masz tylko kilka dyrekcji generalnych, dobrym podejściem jest ręczne. Jeśli jednak masz wiele dyrekcji generalnych, zajmie to dużo czasu, a najlepszą opcją jest użycie programu PowerShell.

Ważny:Wykonaj te kroki tylko wtedy, gdy masz wszystkie skrzynki pocztowe na platformie Microsoft 365 i nie ma już więcej skrzynek pocztowych w lokalnym programie Exchange. Jeśli masz lokalne skrzynki pocztowe w środowisku hybrydowym programu Exchange, należy utworzyć lokalne grupy dystrybucyjne.

Krok 1. Eksportuj lokalne grupy dystrybucyjne

Pierwszym krokiem jest wyeksportowanie wszystkich grup dystrybucyjnych do pliku CSV.

Skrypt PowerShell wyeksportuje następujące typy grup DG:

POWIĄZANY:Wyłącz wiadomość powitalną dla grup Microsoft 365

  • Grupa dystrybucyjna
  • Grupa bezpieczeństwa
  • Lista pokoi (otrzymujesz ją tylko za pomocą programu PowerShell)

Oto jak dyrekcje generalne wyglądają w lokalnym centrum administracyjnym Exchange. Ponownie lista pokoi nie pojawia się tutaj.

Pobierz skrypt PowerShell Export-DGs.ps1 i umieść go w nimC:skryptyfalcówka. Skrypt wyeksportuje plik CSV doC:tempfalcówka. Jeśli nie maszTempfolderze, utwórz go.

# 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 ";"

Uruchom skrypt w Exchange Management Shell, aby wyeksportować wszystkie lokalne DG do pliku CSV.

C:Scripts.Export-DGs.ps1

Krok 2. Edytuj plik CSV lokalnych grup dystrybucyjnych

Otwórz plik CSVDGs.csvWC:temp.

Ta część jest niezwykle ważna, ponieważ plik CSV będzie tym, przez co będzie przechodził skrypt w kolejnych krokach. Jeśli więc nie ustawisz wszystkich poprawnych wartości właściwości, pojawią się błędy.

Więc nie spiesz się i wypełnij wszystko poprawnie. Upewnij się, że plik CSV jest wC:tempi ma nazwęDGs.csv

Oto przykład, dlaczego może pojawić się błąd podczas importowania DG:

Administrator może być właścicielem grupy, a jeśli nie masz konta Microsoft 365 o tej nazwie, nie doda go jako właściciela. Dlatego powinieneś dodać użytkownika jako właściciela w pliku CSV dla każdej grupy dystrybucyjnej. Załóżmy, że grupa dystrybucyjna jest własnością administratora. Wpisz w tych polach nazwę administratora Microsoft 365.

Możesz pozostawić właściciela grupy pustym, ale w następnym kroku zobaczysz błąd, gdy zaimportuje DG i ustawi konto administratora, na którym uruchamiany jest skrypt, jako domyślne.

Krok 3. Importuj grupy dystrybucyjne w Microsoft 365

Jedynym sposobem na utworzenie grup dystrybucyjnych i zachowanie oryginalnych grup dystrybucyjnych jest dodanie dla nich innej nazwy. Zmienimy to na późniejszym etapie.

Ważne jest, aby utworzyć grupy dystrybucyjne i ukryć je przed globalną listą adresową (GAL), tak aby te dyrekcje generalne nie były widoczne w organizacji dla użytkowników. Gdy już wszystko zostanie sprawdzone, w ostatnim kroku udostępnisz to użytkownikom.

DodamyC-prefiks dla każdej tworzonej przez nas Grupy Dystrybucyjnej. W ten sposób możemy łatwo zidentyfikować grupy lub w razie potrzeby je posortować. TheCoznaczaChmura.

Pobierz skrypt PowerShell Import-DGs.ps1 i umieść go w nimC:skryptyfalcówka.

# 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
        }
    }
}

Uruchom PowerShell jako administrator i połącz się z Exchange Online PowerShell.

Connect-ExchangeOnline

Uruchom skrypt w programie Exchange Online PowerShell, aby utworzyć grupy DG z pliku CSV z rozszerzeniemC-prefiks w Exchange Online – Microsoft 365.

C:Scripts.Import-DGs.ps1

Zaloguj się doCentrum administracyjne Exchange. Sprawdź, czyC-Grupy dystrybucyjne zostały pomyślnie utworzone w plikuLista dystrybucyjnai wZabezpieczenia obsługujące pocztę.

Kliknij naDGi wybierzOgólny. Sprawdź, czy wartości zostały pomyślnie ustawione.

KliknijCzłonkowiei sprawdź, czy właściciele DG zostali pomyślnie dodani.

KliknijUstawieniai sprawdź, czy opcja Ukryj tę grupę na globalnej liście adresów jest włączona.

Krok 4. Dodaj członków do grup dystrybucyjnych

Pobierz skrypt PowerShell Add-MembersDGs.ps1 i umieść go w nimC:skryptyfalcówka.

# 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
        }
    }
}

Uruchom skrypt w programie Exchange Online PowerShell, aby dodać członków z pliku CSV do grup DG z prefiksemC-w Exchange Online – Microsoft 365.

C:Scripts.Add-MembersDGs.ps1

Kliknij DG i kliknijCzłonkowie. Sprawdź, czy elementy członkowskie pojawiają się w plikuC-Grupa Dystrybucyjna.

Krok 5. Przenieś DG do oddzielnej jednostki organizacyjnej

Możesz pominąć ten krok, jeśli nie masz środowiska hybrydowego Exchange. Ale najprawdopodobniej masz uruchomioną usługę Microsoft Entra Connect Sync, która synchronizuje dane lokalne z platformą Microsoft 365.

Jeśli grupy dystrybucyjne znajdują się w różnych jednostkach organizacyjnych, przenieś je wszystkie do nowej jednostki organizacyjnej, korzystając z poniższego skryptu. Ułatwi to zarządzanie, jeśli w następnym kroku wyłączysz synchronizację jednostki organizacyjnej z Microsoft Entra ID.

Zmianalinia 6do jednostki organizacyjnej, do której chcesz przenieść także dyrekcje generalne.

Pobierz skrypt Move-DGs.ps1 PowerShell i umieść goC:skryptyfalcówka.

# 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
}

Uruchom skrypt w programie PowerShell (lokalnie), aby przenieść grupy DG doDGJednostka organizacyjna w Active Directory.

C:Scripts.Move-DGs.ps1

Gdy już to zrobisz, otwórzUżytkownicy i komputery usługi Active Directoryi sprawdź, czy dyrekcje generalne pojawiają się w jednostce organizacyjnejDG.

Krok 6. Cofnij synchronizację lokalnych grup dystrybucyjnych

Zaloguj się do serwera Microsoft Entra Connect Sync. Następnie uruchomPołączenie z usługą Azure ADnarzędzie.

OdznaczDGJednostka organizacyjna (OU) ze wszystkimi grupami dystrybucyjnymi, aby nie była już synchronizowana z Microsoft 365.

Jeśli przeniesiesz jednostki DG do jednostki organizacyjnej, która została już odznaczona przed synchronizacją z Microsoft 365, musisz wymusić synchronizację Microsoft Entra Connect lub odczekać maksymalnie 30 minut, zanim synchronizacja zostanie uruchomiona automatycznie.

Start-ADSyncSyncCycle -PolicyType Delta

Poczekaj dziesięć minut i sprawdź, czy wszystkie oryginalne lokalne grupy dystrybucyjne nie pojawiają się już na platformie Microsoft 365. Pojawią się tylko chmury dystrybucyjne. Jest to bardzo ważne, zanim przejdziesz do następnego kroku.

Krok 7. Sfinalizuj grupy dystrybucyjne

Możesz teraz pomyślnie uruchomić poniższy skrypt, który usunie plikC-prefiks z chmurowych grup dystrybucyjnych idodaj podstawowy adres SMTP i wszystkie adresy dodatkowedo grup dystrybucyjnych w chmurze. Ustawi także wartość ukrytą na liście adresów w DG pobraną z pliku CSV.

Pobierz skrypt PowerShell Finalize-DGs.ps1 i umieść go w nimC:skryptyfalcówka.

# 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
    }
}

Uruchom skrypt w programie Exchange Online PowerShell, aby usunąć plikC-prefiks ze wszystkich dyrekcji generalnych i zaimportuj wszystkie adresy e-mail.

C:Scripts.Finalize-DGs.ps1

Sprawdź w centrum administracyjnym programu Exchange (Microsoft 365), czy wszystkie grupy dystrybucyjne są wyświetlane poprawnie bezC-prefiks.

Sprawdź, czy adresy e-mail zostały pomyślnie dodane do grupy dystrybucyjnej.

Sprawdź, czy wartość Ukryj tę grupę z globalnej listy adresów została poprawnie pobrana z pliku CSV i ustawiona w grupie dystrybucyjnej.

Krok 8. Przetestuj przepływ poczty do Grup dystrybucyjnych

Wyślij wiadomości e-mail do kilku utworzonych grup dystrybucyjnych i sprawdź, czy wiadomość e-mail została pomyślnie dostarczona do odbiorców w grupie.

To wszystko!

Wniosek

Nauczyłeś się, jak migrować grupy dystrybucyjne do Microsoft 365. Jedynym sposobem, aby to zrobić, jest ręczne odtworzenie ich w centrum administracyjnym Microsoft 365 lub za pomocą skryptów PowerShell. Nie ma innej metody.

Czy podobał Ci się ten artykuł? Możesz także chcieć Eksportuj członków grupy dystrybucyjnej Microsoft 365 do pliku CSV za pomocą programu PowerShell. Nie zapomnij nas obserwować i udostępnić ten artykuł.

Related Posts