Jakeluryhmien siirtäminen Microsoft 365:een

Kaikki postilaatikot on siirretty Exchange Onlineen. Jakeluryhmät ovat kuitenkin edelleen paikan päällä, ja haluamme siirtää ne Microsoft 365:een hallitaksemme niitä suoraan Exchange Onlinessa. Tässä artikkelissa opit siirtämään jakeluryhmiä Microsoft 365:een.

Siirrä paikalliset jakeluryhmät Microsoft 365:een

Kun kaikki postilaatikot on siirretty Exchange Onlineen Microsoft 365:ssä, haluat hallita jakeluryhmiä pilvessä.

Exchange on-premisesissa tai Exchange Onlinessa ei ole mahdollisuutta siirtää paikallisia jakeluryhmiä Exchange Onlineen. Ainoa tapa tehdä tämä on luoda pääosastot uudelleen manuaalisesti tai automatisoida se PowerShellillä.

Jos sinulla on vain pari pääosastoa, manuaalinen on hyvä lähestymistapa. Jos sinulla on kuitenkin useita pääosastoja, se vie paljon aikaasi, ja paras vaihtoehto on käyttää PowerShellia.

Tärkeää:Noudata näitä ohjeita vain, kun sinulla on kaikki postilaatikot Microsoft 365:ssä etkä enää postilaatikoita Exchange on-premisesissa. Niin kauan kuin sinulla on paikallisia postilaatikoita Exchange Hybrid -ympäristössä, sinun tulee luoda jakeluryhmiä paikallisesti.

Vaihe 1. Vie paikalliset jakeluryhmät

Ensimmäinen vaihe on viedä kaikki jakeluryhmät CSV-tiedostoon.

Suositeltu luettava:Kuinka luoda jakeluluettelo Gmailissa?

PowerShell-komentosarja vie seuraavat DG-ryhmätyypit:

  • Jakeluryhmä
  • Turvallisuusryhmä
  • Huoneluettelo (saat tämän vain PowerShellin avulla)

Tältä pääosastot näyttävät Exchangen hallintakeskuksessa tiloissa. Jälleen, huoneluettelo ei näy tässä.

Lataa Export-DGs.ps1 PowerShell-komentosarja ja aseta seC: scriptskansio. Komentosarja vie CSV-tiedoston tiedostoonC: tempkansio. Jos sinulla ei ole aTempkansio, luo sellainen.

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

Suorita komentosarja Exchange Management Shellissä viedäksesi kaikki paikalliset pääosastot CSV-tiedostoon.

C:Scripts.Export-DGs.ps1

Vaihe 2. Muokkaa paikallisten jakeluryhmien CSV-tiedostoa

Avaa CSV-tiedostoDGs.csvsisäänC: temp.

Tämä osa on erittäin tärkeä, koska seuraavien vaiheiden komentosarja käy läpi CSV-tiedoston. Joten jos et ole asettanut kaikkia oikeita arvoja ominaisuuksille, saat virheitä.

Varaa siis aikaa ja täytä kaikki oikein. Varmista, että CSV-tiedosto on sisälläC: tempja sillä on nimiDGs.csv

Tässä on esimerkki siitä, miksi virhe saattaa ilmetä, kun tuot pääosastoja:

Järjestelmänvalvoja voi olla ryhmän omistaja, ja jos sinulla ei ole Microsoft 365 -tiliä tällä nimellä, se ei lisää sitä omistajaksi. Joten sinun tulee lisätä käyttäjä omistajaksi jokaisen jakeluryhmän CSV-tiedostoon. Oletetaan, että järjestelmänvalvoja omistaa jakeluryhmän. Täytä Microsoft 365 -järjestelmänvalvojan nimi näihin kenttiin.

Voit jättää ryhmän omistajan tyhjäksi, mutta näet virheilmoituksen seuraavassa vaiheessa, kun se tuo pääosaston ja asettaa komentosarjaa suorittavan järjestelmänvalvojan tilin oletukseksi.

Vaihe 3. Tuo jakeluryhmät Microsoft 365:ssä

Ainoa tapa luoda jakeluryhmät ja säilyttää alkuperäiset jakeluryhmät on lisätä ryhmille eri nimi. Muutamme tämän myöhemmin.

On tärkeää luoda jakeluryhmät ja pitää ne piilossa Global Address List (GAL) -luettelosta, jotta nämä pääosastot eivät näy organisaatiossa käyttäjille. Kun kaikki on tarkistettu, teet sen näkyväksi käyttäjille viimeisessä vaiheessa.

LisäämmeC-etuliite jokaiselle luomallemme jakeluryhmälle. Näin voimme helposti tunnistaa ryhmät tai lajitella ne tarvittaessa. TheCtarkoittaaPilvi.

Lataa Import-DGs.ps1 PowerShell-komentosarja ja aseta seC: scriptskansio.

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

Suorita PowerShell järjestelmänvalvojana ja muodosta yhteys Exchange Online PowerShelliin.

Connect-ExchangeOnline

Suorita komentosarja Exchange Online PowerShellissä luodaksesi pääosastot CSV-tiedostostaC-etuliite Exchange Onlinessa – Microsoft 365.

C:Scripts.Import-DGs.ps1

Kirjaudu sisäänExchangen hallintakeskus. Varmista, ettäC-Jakeluryhmät on luotu onnistuneestiJakeluluetteloja sisäänSähköpostia tukeva suojaus.

Napsauta aDGja valitseKenraali. Varmista, että arvot on asetettu onnistuneesti.

Napsautajäsenetja varmista, että pääosaston omistajat on lisätty onnistuneesti.

NapsautaAsetuksetja varmista, että Piilota tämä ryhmä yleisestä osoiteluettelosta -arvo on käytössä.

Vaihe 4. Lisää jäseniä jakeluryhmiin

Lataa Add-MembersDGs.ps1 PowerShell-komentosarja ja aseta seC: scriptskansio.

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

Suorita komentosarja Exchange Online PowerShellissä lisätäksesi jäsenet CSV-tiedostosta pääosastoihin etuliitteelläC-Exchange Onlinessa – Microsoft 365.

C:Scripts.Add-MembersDGs.ps1

Napsauta pääosastoa ja napsautajäsenet. Varmista, että jäsenet näkyvätC-Jakeluryhmä.

Vaihe 5. Siirrä pääosastot erottamaan organisaatioyksiköt

Voit ohittaa tämän vaiheen, jos sinulla ei ole Exchange Hybrid -ympäristöä. Mutta todennäköisimmin sinulla on Microsoft Entra Connect Sync käynnissä ja synkronointi paikallisen ja Microsoft 365:n välillä.

Jos jakeluryhmät ovat eri organisaatioyksiköissä, siirrä ne kaikki uuteen organisaatioyksikköön alla olevan komentosarjan avulla. Tämä helpottaa hallintaa, kun poistat OU:n synkronoinnin Microsoft Entra ID:n kanssa käytöstä seuraavassa vaiheessa.

Muuttaarivi 6organisaatioon, johon haluat siirtää myös pääosastot.

Lataa Move-DGs.ps1 PowerShell-komentosarja ja aseta seC: scriptskansio.

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

Suorita komentosarja PowerShellissä (on-premises) siirtääksesi pääosastot kohteeseenDGOrganisaatioyksikkö Active Directoryssa.

C:Scripts.Move-DGs.ps1

Kun se on valmis, avaaActive Directory -käyttäjät ja -tietokoneetja varmistaa, että pääosastot näkyvät organisaatioyksikössäDG.

Vaihe 6. Poista paikallisten jakeluryhmien synkronointi

Kirjaudu sisään Microsoft Entra Connect Sync -palvelimeen. Aloita seuraavaksiAzure AD Connecttyökalu.

Poista valintaDGOrganisaatioyksikkö (OU) kaikkien jakeluryhmien kanssa, jotta sitä ei enää synkronoida Microsoft 365:een.

Jos siirrät pääosastot organisaatioyksikköön, jonka synkronointi Microsoft 365:een on jo poistettu, sinun on pakotettava synkronointi Microsoft Entra Connect tai odotettava enintään 30 minuuttia, ennen kuin synkronointi suoritetaan automaattisesti.

Start-ADSyncSyncCycle -PolicyType Delta

Odota kymmenen minuuttia ja tarkista, eivätkö kaikki alkuperäiset paikalliset jakeluryhmät enää näy Microsoft 365:ssä. Vain pilvipalvelun jakeluryhmät tulevat näkyviin. Tämä on erittäin tärkeää ennen kuin siirryt seuraavaan vaiheeseen.

Vaihe 7. Viimeistele jakeluryhmät

Voit nyt suorittaa alla olevan skriptin onnistuneesti, mikä poistaaC-etuliite pilven jakeluryhmistä jalisää ensisijainen SMTP-osoite ja kaikki toissijaiset osoitteetpilven jakeluryhmiin. Se asettaa myös CSV-tiedostosta otetun DG:n piilotetun osoiteluettelosta käytössä olevan arvon.

Lataa Finalize-DGs.ps1 PowerShell-komentosarja ja aseta seC: scriptskansio.

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

Suorita komentosarja Exchange Online PowerShellissä poistaaksesiC-etuliite kaikista pääosastoista ja tuo kaikki sähköpostiosoitteet.

C:Scripts.Finalize-DGs.ps1

Varmista Exchange-hallintakeskuksessa (Microsoft 365), että kaikki jakeluryhmät näkyvät oikein ilmanC-etuliite.

Tarkista, että sähköpostiosoitteet on lisätty onnistuneesti jakeluryhmään.

Varmista, että Piilota tämä ryhmä yleisestä osoiteluettelosta -arvo on otettu oikein CSV-tiedostosta ja asetettu jakeluryhmään.

Vaihe 8. Testaa postin kulku jakeluryhmiin

Lähetä sähköpostit muutamalle luomillesi jakeluryhmälle ja varmista, että sähköposti on toimitettu onnistuneesti ryhmän vastaanottajille.

siinä se!

Johtopäätös

Opit siirtämään jakeluryhmiä Microsoft 365:een. Ainoa tapa tehdä tämä on luoda ne uudelleen manuaalisesti Microsoft 365 -hallintakeskuksessa tai PowerShell-komentosarjoilla. Muuta menetelmää ei ole.

Piditkö tästä artikkelista? Saatat myös pitää Microsoft 365 -jakeluryhmän jäsenten viemisestä CSV-muotoon PowerShellin avulla. Älä unohda seurata meitä ja jakaa tätä artikkelia.

Related Posts