Functions/Public/Remove-CT365Group.ps1
<# .SYNOPSIS This function removes Office 365 groups based on information provided in an Excel file. .DESCRIPTION The Remove-CT365Group function is used to remove Office 365 groups. The function imports data from an Excel file and uses it to remove the Office 365 groups. The Excel file should contain a list of groups with their display names and types. The function supports four types of groups: - 365Group - 365Distribution - 365MailEnabledSecurity - 365Security .PARAMETER FilePath The full path to the Excel file that contains information about the groups that should be removed. The file should contain a worksheet named 'Groups'. The 'Groups' worksheet should contain the display names and types of the groups. .PARAMETER UserPrincipalName The User Principal Name (UPN) of the account to connect to Exchange Online and Microsoft Graph. .EXAMPLE Remove-CT365Group -FilePath "C:\Path\to\file.xlsx" -UserPrincipalName "admin@contoso.com" This example removes the Office 365 groups listed in the 'Groups' worksheet of the 'file.xlsx' file, using the 'admin@contoso.com' UPN to connect to Exchange Online and Microsoft Graph. .NOTES This function requires modules ExchangeOnlineManagement, Microsoft.Graph.Groups, Microsoft.Graph.Users, PSFramework, and ImportExcel. #> function Remove-CT365Group { [CmdletBinding()] param ( [Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)] [ValidateScript({ # First, check if the file has a valid Excel extension (.xlsx) if (-not(([System.IO.Path]::GetExtension($psitem)) -match "\.(xlsx)$")) { throw "The file path '$PSitem' does not have a valid Excel format. Please make sure to specify a valid file with a .xlsx extension and try again." } # Then, check if the file exists if (-not([System.IO.File]::Exists($psitem))) { throw "The file path '$PSitem' does not lead to an existing file. Please verify the 'FilePath' parameter and ensure that it points to a valid file (folders are not allowed)." } # Return true if both conditions are met $true })] [string]$FilePath, [Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)] [string]$UserPrincipalName ) # Import the required modules $ModulesToImport = "ImportExcel", "Microsoft.Graph.Groups", "PSFramework", "ExchangeOnlineManagement", "Microsoft.Graph.Users" Import-Module $ModulesToImport # Connect to Exchange Online Connect-ExchangeOnline -UserPrincipalName $UserPrincipalName -ShowProgress $true # Connect to Microsoft Graph Connect-MgGraph -Scopes "Group.ReadWrite.All" # Import data from Excel $Groups = Import-Excel -Path $FilePath -WorksheetName Groups foreach ($Group in $Groups) { switch ($Group.Type) { "365Group" { try { Write-PSFMessage -Level Output -Message "Removing 365 Group: $($Group.DisplayName)" -Target $Group.DisplayName Get-UnifiedGroup -Identity $Group.DisplayName -ErrorAction Stop Remove-UnifiedGroup -Identity $Group.DisplayName -Confirm:$false Write-PSFMessage -Level Output -Message "Removed 365 Group: $($Group.DisplayName)" -Target $Group.DisplayName } catch { Write-PSFMessage -Level Warning -Message "365 Group $($Group.DisplayName) does not exist" -Target $Group.DisplayName -ErrorRecord $_ Continue } } "365Distribution" { try { Write-PSFMessage -Level Output "Removing 365 Distribution Group: $($Group.DisplayName)" -Target $Group.DisplayName Get-DistributionGroup -Identity $Group.DisplayName -ErrorAction Stop Remove-DistributionGroup -Identity $Group.DisplayName -Confirm:$false Write-PSFMessage -Level Output -Message "Removed Distribution Group: $($Group.DisplayName)" -Target $Group.DisplayName } catch { Write-PSFMessage -Level Warning -Message "Distribution Group $($Group.DisplayName) does not exist" -Target $Group.DisplayName -ErrorRecord $_ Continue } } "365MailEnabledSecurity" { try { Write-PSFMessage -Level Output -Message "Removing 365 Mail-Enabled Security Group: $($Group.DisplayName)" -Target $Group.DisplayName Get-DistributionGroup -Identity $Group.DisplayName -ErrorAction Stop Remove-DistributionGroup -Identity $Group.DisplayName -Confirm:$false Write-PSFMessage -Level Output -Message "Removed Mail-Enabled Security Group $($Group.DisplayName)" -Target $Group.DisplayName } catch { Write-PSFMessage -Level Warning -Message "Mail-Enabled Security Group $($Group.DisplayName) does not exist" -Target $Group.DisplayName -ErrorRecord $_ Continue } } "365Security" { Write-PSFMessage -Level Output -Message "Removing 365 Security Group $($Group.DisplayName)" -Target $Group.DisplayName $existingGroup = Get-MgGroup -Filter "DisplayName eq '$($Group.DisplayName)'" if ($existingGroup) { Remove-MgGroup -GroupId $existingGroup.Id -Confirm:$false Write-PSFMessage -Level Output -Message "Removed Security Group $($Group.DisplayName)" -Target $Group.DisplayName } else { Write-PSFMessage -Level Warning -Message "Security Group $($Group.DisplayName) does not exist" -Target $Group.DisplayName } } default { Write-PSFMessage -Level Warning -Message "Invalid group type for $($Group.DisplayName)" -Target $Group.DisplayName } } } # Disconnect Exchange Online and Microsoft Graph sessions Disconnect-ExchangeOnline -Confirm:$false Disconnect-MgGraph } |