mirror of
https://github.com/admindroid-community/powershell-scripts.git
synced 2025-12-17 08:25:20 +00:00
Convert DL to M365 Groups
Convert DL to M365 Groups
This commit is contained in:
parent
36b5f8ae6a
commit
f8913aec89
230
Convert DL to M365 Groups/ConvertDLToM365Group.ps1
Normal file
230
Convert DL to M365 Groups/ConvertDLToM365Group.ps1
Normal file
@ -0,0 +1,230 @@
|
||||
<#
|
||||
=============================================================================================
|
||||
Name: Upgrade Distribution Lists to Microsoft 365 Groups Using PowerShell
|
||||
Description: This script converts distribution lists to Microsoft 365 groups
|
||||
Version: 1.0
|
||||
Website: o365reports.com
|
||||
Script by: O365Reports Team
|
||||
For detailed script execution: https://o365reports.com/2023/02/21/upgrade-distribution-lists-to-microsoft-365-groups-using-powershell/
|
||||
============================================================================================
|
||||
#>
|
||||
param (
|
||||
[string] $DistributionEmailAddress = $null,
|
||||
[string] $UserName = $null,
|
||||
[string] $Password = $null,
|
||||
[string] $InputFile = $null
|
||||
)
|
||||
#Connect Modules
|
||||
function Connect_ExchangeOnline
|
||||
{
|
||||
Write-Progress -Activity "Connecting exchange online.."
|
||||
$ExchangeOnlineModule = Get-Module ExchangeOnlineManagement -ListAvailable
|
||||
if($ExchangeOnlineModule -eq $null)
|
||||
{
|
||||
Write-host "Important: Exchange online module is unavailable. It is mandatory to have this module installed in the system to run the script successfully."
|
||||
$confirm = Read-Host Are you sure you want to install ExchangeOnline module? [Y] Yes [N] No
|
||||
if($confirm -match "[yY]")
|
||||
{
|
||||
Write-host "Installing exchange online module..."
|
||||
Install-Module -Name ExchangeOnlineManagement -Scope CurrentUser
|
||||
Write-host "Exchange online Module is installed in the machine successfully" -ForegroundColor Magenta
|
||||
}
|
||||
else
|
||||
{
|
||||
Write-host "Exiting. `nNote: Exchange online module must be available in your system to run the script"
|
||||
Exit
|
||||
}
|
||||
}
|
||||
Disconnect-ExchangeOnline -Confirm:$false
|
||||
try
|
||||
{
|
||||
if(($UserName -ne "") -and ($Password -ne ""))
|
||||
{
|
||||
$securedPassword = ConvertTo-SecureString -AsPlainText $Password -Force
|
||||
$credential = New-Object System.Management.Automation.PSCredential $UserName,$securedPassword
|
||||
Connect-ExchangeOnline -Credential $credential -ShowBanner:$false -ErrorAction SilentlyContinue # For Non-MFA account
|
||||
}
|
||||
else
|
||||
{
|
||||
Connect-ExchangeOnline -ShowBanner:$false -ErrorAction SilentlyContinue
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
Write-Host $_.Exception.message -ForegroundColor Red
|
||||
Exit
|
||||
}
|
||||
Write-Host "Exchange online connected" -ForegroundColor Green
|
||||
}
|
||||
#To create group
|
||||
function Create_M365Group
|
||||
{
|
||||
Write-Progress -Activity "Creating Microsoft 365 group...."
|
||||
$Params=@{}
|
||||
$Params= @{DisplayName =$DLGroup.DisplayName
|
||||
AccessType =$AccessType
|
||||
ManagedBy =$DLGroup.managedby
|
||||
RequireSenderAuthenticationEnabled =$DLGroup.RequireSenderAuthenticationEnabled
|
||||
}
|
||||
if($GroupMember -ne $null)
|
||||
{
|
||||
$Params.Add('Members',$GroupMember)
|
||||
}
|
||||
if($AccessType -eq 'Private')
|
||||
{
|
||||
$Params.Add('HiddenGroupMembershipEnabled',$DLGroup.HiddenGroupMembershipEnabled)
|
||||
}
|
||||
$script:NewM365Group = New-UnifiedGroup @Params
|
||||
if($NewM365Group -eq $null)
|
||||
{
|
||||
Write-Host $_.Exception.Message -ForegroundColor Red
|
||||
return
|
||||
}
|
||||
Write-Host "$($DLGroup.DisplayName) group created successfuly" -ForegroundColor Green
|
||||
$GetOwner = Compare-Object -ReferenceObject $DLGroup.managedby -DifferenceObject $NewM365Group.ManagedBy
|
||||
$GetOwner = $GetOwner |Where-Object{$_.SideIndicator -eq "=>"}
|
||||
$M365GroupOwner = $GetOwner.InputObject
|
||||
Remove-DistributionGroup -Identity $DLMail -Confirm:$false
|
||||
if($M365GroupOwner -ne $null)
|
||||
{
|
||||
Remove-UnifiedGroupLinks -Identity $NewM365Group.PrimarySmtpAddress -LinkType Owners -Links $M365GroupOwner -Confirm:$false -ErrorAction SilentlyContinue
|
||||
if($GroupMember -notcontains $M365GroupOwner)
|
||||
{
|
||||
Remove-UnifiedGroupLinks -Identity $NewM365Group.PrimarySmtpAddress -LinkType Members -Links $M365GroupOwner -Confirm:$false -ErrorAction SilentlyContinue
|
||||
}
|
||||
}
|
||||
While(1)
|
||||
{
|
||||
Write-Progress -Activity "Updating DL properties to Microsoft 365 group info..."
|
||||
Start-Sleep -Seconds 5
|
||||
Set-UnifiedGroup -Identity $NewM365Group.PrimarySmtpAddress -PrimarySmtpAddress $DLMail -ErrorAction SilentlyContinue -ErrorVariable DLGroupError
|
||||
if($DLGroupError -ne $null)
|
||||
{
|
||||
Write-Host "Removed existing Distribution List does not updated... Waiting for 5 seconds" -ForegroundColor Red
|
||||
Continue
|
||||
}
|
||||
Set-UnifiedGroup -Identity $DLMail -EmailAddresses @{Add = "X500:$($DLGroup.LegacyExchangeDN)"} -HiddenFromAddressListsEnabled $DLGroup.HiddenFromAddressListsEnabled -AcceptMessagesOnlyFromSendersOrMembers $DLGroup.AcceptMessagesOnlyFromSendersOrMembers -GrantSendOnBehalfTo $DLGroup.GrantSendOnBehalfTo -ModeratedBy $DLGroup.ModeratedBy -MailTip $DLGroup.MailTip -ErrorAction SilentlyContinue
|
||||
break
|
||||
}
|
||||
Write-Host "$($DLGroup.DisplayName) group successfully converted to Microsoft 365 group" -ForegroundColor Green
|
||||
Update_NewM365GroupInfo
|
||||
}
|
||||
#Update the group info
|
||||
function Update_NewM365GroupInfo
|
||||
{
|
||||
$confirm = Read-Host Are you sure you want to update the Microsoft 365 group info? [Y] Yes [N] No
|
||||
if($confirm -match "[yY]")
|
||||
{
|
||||
Write-Progress -Activity "Updating Microsoft 365 group info..."
|
||||
$GroupName = Read-Host "Enter the Microsoft 365 group name"
|
||||
if($GroupName -ne "")
|
||||
{
|
||||
Set-UnifiedGroup -Identity $DLMail -DisplayName "$GroupName" -ErrorAction SilentlyContinue -ErrorVariable NameError
|
||||
if($NameError -ne $null)
|
||||
{
|
||||
Write-Host $NameError.Exception[1] -ForegroundColor Yellow
|
||||
}
|
||||
else
|
||||
{
|
||||
Write-Host "Group name updated successfully" -ForegroundColor Green
|
||||
}
|
||||
}
|
||||
$GroupMailAddress = Read-Host "Enter the Microsoft 365 group mail address"
|
||||
if($GroupMailAddress -ne "")
|
||||
{
|
||||
Set-UnifiedGroup -Identity $DLMail -PrimarySmtpAddress "$GroupMailAddress" -ErrorAction SilentlyContinue -ErrorVariable EmailError
|
||||
if($EmailError -ne $null)
|
||||
{
|
||||
Write-Host $EmailError.Exception[1] -ForegroundColor Yellow
|
||||
}
|
||||
else
|
||||
{
|
||||
Write-Host "Group mail address updated successfully" -ForegroundColor Green
|
||||
}
|
||||
}
|
||||
$GroupAccessType = Read-Host "Do you want to change your group access type to(Private or Public)"
|
||||
if($GroupAccessType -ne "")
|
||||
{
|
||||
Set-UnifiedGroup -Identity $DLMail -AccessType "$GroupAccessType" -ErrorAction SilentlyContinue -ErrorVariable AccessTypeError
|
||||
if($AccessTypeError -ne $null)
|
||||
{
|
||||
Write-Host $AccessTypeError.Exception[1] -ForegroundColor Yellow
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
function CloseConnection
|
||||
{
|
||||
Disconnect-ExchangeOnline -Confirm:$false
|
||||
Exit
|
||||
}
|
||||
|
||||
#Connect exchange module
|
||||
Connect_ExchangeOnline
|
||||
#Check if parameter passed or not
|
||||
if($DistributionEmailAddress -ne "")
|
||||
{
|
||||
$GetEmailAddress = $DistributionEmailAddress.Split(",")
|
||||
}
|
||||
elseif($InputFile -ne "")
|
||||
{
|
||||
try
|
||||
{
|
||||
$InputFileInfo = Import-Csv -Header "DLMail","AccessType" -path $InputFile
|
||||
$GetEmailAddress = $InputFileInfo.DLMail
|
||||
}
|
||||
catch
|
||||
{
|
||||
Write-Host "File not found" -ForegroundColor Red
|
||||
CloseConnection
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$GetEmailAddress = Read-Host "Please enter distrbution mail you want to convert to Microsoft 365 group"
|
||||
if($GetEmailAddress -ne "")
|
||||
{
|
||||
$GetEmailAddress = $GetEmailAddress.Split(",")
|
||||
}
|
||||
else
|
||||
{
|
||||
Write-Host "You didn't provide any distribution mail" -ForegroundColor Red
|
||||
CloseConnection
|
||||
}
|
||||
}
|
||||
$GetEligibleDLGroup = (Get-EligibleDistributionGroupForMigration).PrimarySmtpAddress
|
||||
Foreach($DLMail in $GetEmailAddress)
|
||||
{
|
||||
$DLGroup = Get-DistributionGroup| Where-Object{$_.PrimarySmtpAddress -eq $DLMail}
|
||||
if($DLGroup -ne $null)
|
||||
{
|
||||
if($GetEligibleDLGroup -notcontains $DLMail)
|
||||
{
|
||||
Write-Host "$($DLGroup.DisplayName) is not eligible for convert to Microsoft 365 group" -ForegroundColor Red
|
||||
continue
|
||||
}
|
||||
$GroupMember = (Get-DistributionGroupMember -Identity $DLMail).Name
|
||||
Write-Host "`n$($DLGroup.DisplayName) group conversion process started..." -ForegroundColor Magenta
|
||||
# Get access type from InputFile
|
||||
if($InputFile -ne "")
|
||||
{
|
||||
$AccessType = $InputFileInfo| Where-Object{$_.DLMail -eq "$DLMail"}
|
||||
$AccessType = $AccessType.AccessType
|
||||
}
|
||||
else
|
||||
{
|
||||
$AccessType = Read-Host "Access Type (Private or Public)"
|
||||
}
|
||||
if(($AccessType -ne 'Private') -and ($AccessType -ne 'Public'))
|
||||
{
|
||||
$AccessType = "Private"
|
||||
Write-Host "Access type is wrong. So we can take access type of the group is private." -ForegroundColor Red
|
||||
}
|
||||
Create_M365Group
|
||||
}
|
||||
else
|
||||
{
|
||||
Write-Host "$DLMail is not found" -ForegroundColor Red
|
||||
}
|
||||
}
|
||||
CloseConnection
|
||||
Loading…
x
Reference in New Issue
Block a user