ADUserManagement.psm1

#Generate password using a specific number of words and numbers
function Get-XKCDPassword {

    Param(
    [int]$words = 2,
    [string]$delimiter = "",
    [ValidateSet("en","de")] 
    [string]$lang = "en",
    [switch]$FirstLetterUpperCase=$true  
    )
        
    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
    $password = ""
    $wordlist = @{
        de = "https://janikvonrotz.ch/wp-content/uploads/2017/08/wordlist.de_.txt"
        en = "https://janikvonrotz.ch/wp-content/uploads/2017/08/wordlist.en_.txt"
    }
    
    switch($words) {
        {$_ -ge 6 } { throw "Word parameter cannot be greater or equal 6." }
        5 { $range = (3,4) }
        4 { $range = (4,5) }
        3 { $range = (5,6) }
        2 { $range = (7,8) }
        {$_ -le 1 } { throw "Word parameter cannot be less or equal 1." }
    }

    $list = (((Invoke-WebRequest $wordlist[$lang]).Content -split "`n" | ForEach-Object{ 
        New-Object PSObject -Property @{
            Value = $_.ToLower()
            Length=$_.length
        }
    }) | Where-Object { ($_.Length -eq ($range[0] + 1)) -or ($_.Length -eq ($range[1] + 1)) })

    1..$words | ForEach-Object {
        $part =  (Get-Random $list).Value.Trim()

        if($FirstLetterUpperCase ) {
                $password += ((Get-Culture).TextInfo).ToTitleCase($part)
        } else {
            $password += $part
        }

        if($_ -lt $words){ 
            $password += $delimiter 
        }
    }
    $password = $password + (get-random -Maximum 99 -Minimum 1)

    return $password
}