Public/Get-UserProvisioningSamAccountName.ps1

function Get-UserProvisioningSamAccountName {
    [CmdletBinding()]
    param (
        [string] $givenName,
        [string] $sn
    )

    process {
        $givenName = $givenName.ToLower().Replace("æ", "ae").Replace("ø", "o").Replace("å", "a") -replace "[^a-z]", ""
        $sn = $sn.ToLower().Replace("æ", "ae").Replace("ø", "o").Replace("å", "a") -replace "[^a-z]", ""
        
        $sams = [ordered]@{}
        $Script:SamAccountNameGenerationPatterns | ForEach-Object {
            $s = $_
            $s = [regex]::Replace(
                $s,
                "{givenName:(\d+)}",
                { param($m) $givenName.Substring(0, [math]::Min($givenName.Length, [int]$m.Groups[1].Value)) }
            )

            $s = [regex]::Replace(
                $s,
                "{sn:(\d+)}",
                { param($m) $sn.Substring(0, [math]::Min($sn.Length, [int]$m.Groups[1].Value)) }
            )

            $s = $s.Replace("{random:2}", (Get-Random -Minimum 10 -Maximum 99).ToString()).Replace("{random:3}", (Get-Random -Minimum 100 -Maximum 999).ToString()).Replace("{random:4}", (Get-Random -Minimum 1000 -Maximum 9999).ToString()).Replace("{random:5}", (Get-Random -Minimum 10000 -Maximum 99999).ToString()).Replace("{random:6}", (Get-Random -Minimum 100000 -Maximum 999999).ToString()).Replace("{random:7}", (Get-Random -Minimum 1000000 -Maximum 9999999).ToString()).Replace("{random:8}", (Get-Random -Minimum 10000000 -Maximum 99999999).ToString()).Replace("{random:9}", (Get-Random -Minimum 100000000 -Maximum 999999999).ToString()).Replace("{random}", (Get-Random -Minimum 2 -Maximum 9).ToString()).Replace("{random:1}", (Get-Random -Minimum 2 -Maximum 9).ToString())

            $sams[$s] = $s
        }
        $sams.Values
    }
}