Private/Utilities/Clear-ModuleVersionConflicts.ps1

function Clear-ModuleVersionConflicts {
    <#
    .SYNOPSIS
        Removes conflicting Microsoft Graph module versions to prepare for clean loading.
     
    .DESCRIPTION
        Safely removes loaded Microsoft Graph modules that may cause version conflicts
        with PIM Activation requirements. This is a utility function to help resolve
        assembly loading conflicts.
     
    .EXAMPLE
        Clear-ModuleVersionConflicts
        Removes all loaded Microsoft Graph modules.
         
    .EXAMPLE
        Clear-ModuleVersionConflicts -ModuleNames @('Microsoft.Graph.Authentication', 'Microsoft.Graph.Users')
        Removes only specified modules.
     
    .NOTES
        This function is automatically available when PIMActivation module is imported.
        Use this if you encounter version conflict errors.
    #>

    [CmdletBinding(SupportsShouldProcess)]
    param(
        [Parameter()]
        [string[]]$ModuleNames = @('Microsoft.Graph.*', 'Az.*')
    )
    
    $removedModules = [System.Collections.ArrayList]::new()
    
    try {
        foreach ($pattern in $ModuleNames) {
            Write-Verbose "Checking for modules matching pattern: $pattern"
            $matchingModules = Get-Module -Name $pattern -ErrorAction SilentlyContinue
            
            foreach ($module in $matchingModules) {
                if ($PSCmdlet.ShouldProcess($module.Name, "Remove Module")) {
                    Write-Verbose "Removing module: $($module.Name) v$($module.Version)"
                    try {
                        Remove-Module -Name $module.Name -Force -ErrorAction Stop
                        $null = $removedModules.Add([PSCustomObject]@{
                            Name = $module.Name
                            Version = $module.Version
                            Status = 'Removed'
                        })
                    }
                    catch {
                        Write-Warning "Failed to remove module $($module.Name): $($_.Exception.Message)"
                        $null = $removedModules.Add([PSCustomObject]@{
                            Name = $module.Name
                            Version = $module.Version
                            Status = 'Failed'
                            Error = $_.Exception.Message
                        })
                    }
                }
            }
        }
        
        if ($removedModules.Count -gt 0) {
            Write-Host "✓ Removed $($removedModules.Count) module(s) to resolve version conflicts" -ForegroundColor Green
            $removedModules | Format-Table Name, Version, Status -AutoSize
            Write-Host "You can now safely import and use PIMActivation module" -ForegroundColor Cyan
        }
        else {
            Write-Host "✓ No conflicting modules found" -ForegroundColor Green
        }
        
        return $removedModules
    }
    catch {
        Write-Error "Error clearing module conflicts: $($_.Exception.Message)"
        throw
    }
}