Private/Identity/Resolve-UserIdentity.ps1

function Resolve-UserIdentity {
    <#
    .SYNOPSIS
        Resolves user identities between GUIDs and user principal names (UPNs)

    .DESCRIPTION
        This function takes either a GUID or UPN and returns the corresponding user details
        including display name, GUID, and UPN for better readability in reports.

    .PARAMETER UserIdOrUpn
        The user identifier - either a GUID or user principal name (UPN)

    .EXAMPLE
        Resolve-UserIdentity -UserIdOrUpn "john.doe@contoso.com"

    .EXAMPLE
        Resolve-UserIdentity -UserIdOrUpn "846eca8a-95ce-4d54-a45c-37b5fea0e3a8"
    #>

    [CmdletBinding()]
    [OutputType([PSCustomObject])]
    param (
        [Parameter(Mandatory = $true)]
        [string]$UserIdOrUpn
    )

    # Check if input is likely a GUID
    $guidPattern = "^[0-9a-fA-F]{8}-([0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}$"
    $isGuid = $UserIdOrUpn -match $guidPattern

    try {
        # Query Microsoft Graph for user details
        if ($isGuid) {
            # If we have a GUID, query directly by ID
            $user = Get-MgUser -UserId $UserIdOrUpn -ErrorAction Stop
        }
        else {
            # If we have a UPN or other identifier, filter by userPrincipalName (case-insensitive)
            $filter = "userPrincipalName eq '$UserIdOrUpn'"
            $user = Get-MgUser -Filter $filter -ErrorAction Stop

            # If not found by UPN, try searching by display name
            if (-not $user) {
                $filter = "displayName eq '$UserIdOrUpn'"
                $user = Get-MgUser -Filter $filter -ErrorAction Stop
            }

            # If still not found, try a more flexible search approach
            if (-not $user) {
                $filter = "startswith(userPrincipalName,'$UserIdOrUpn') or startswith(mail,'$UserIdOrUpn')"
                $users = Get-MgUser -Filter $filter -Top 1 -ErrorAction Stop
                if ($users -and $users.Count -gt 0) {
                    $user = $users[0]
                }
            }
        }

        if ($user) {
            # Store both lowercase versions for case-insensitive comparisons later
            return [PSCustomObject]@{
                Id                = $user.Id
                IdLower           = $user.Id.ToLower()
                UserPrincipalName = $user.UserPrincipalName
                UpnLower          = $user.UserPrincipalName.ToLower()
                DisplayName       = $user.DisplayName
                JobTitle          = $user.JobTitle
                Department        = $user.Department
                UserType          = $user.UserType
                Success           = $true
            }
        }
        else {
            Write-Verbose "User not found: $UserIdOrUpn"
            return [PSCustomObject]@{
                Id                = $UserIdOrUpn
                IdLower           = $UserIdOrUpn.ToLower()
                UserPrincipalName = $UserIdOrUpn
                UpnLower          = $UserIdOrUpn.ToLower()
                DisplayName       = "Unknown User"
                UserType          = "Member" # Default to Member if user is not found
                Success           = $false
            }
        }
    }
    catch {
        Write-Verbose "Error resolving user identity: $($_.Exception.Message)"
        return [PSCustomObject]@{
            Id                = $UserIdOrUpn
            IdLower           = $UserIdOrUpn.ToLower()
            UserPrincipalName = $UserIdOrUpn
            UpnLower          = $UserIdOrUpn.ToLower()
            DisplayName       = "Unknown User"
            UserType          = "Member" # Default to Member on errors
            Success           = $false
            Error             = $_.Exception.Message
        }
    }
}