Create random passwords in Powershell

RandomPassword function can be used to create random passwords in PowerShell based environments. It accepts a password length and an optional pattern (full or partial). A random pattern will be created or added if not specified. You can use patterns to make sure that your passwords has a guaranteed password complexity.

Examples:

 
# 8-char password with a random pattern
RandomPassword -length 8
 
# 12-char with a partial start pattern "ULNS":
# one uppercase, one lowercase, one numeric, one specific
# the last six pattern classes will be generated in random
RandomPassword -length 12 -pattern "ULNS"
 
# 10-char with a full pattern "LLLLSUUUUN":
# four lowercase, one special, four uppercase and one numeric
RandomPassword -length 10 -pattern "LLLLSUUUUN"

 

#####
# RandomPassword: Create a random password
# with a specified length and optional pattern
 
function RandomPassword
{
    param (
        $length,
        $pattern # optional
    )
 
    # Define classes of character pools, there are four classes
    # by default: L - lowercase, U - uppercase, N - numeric,
    # S - special
    $pattern_class = @("L", "U", "N", "S")
 
    # Character pools for classes defined above
    $charpool = @{ 
        "L" = "abcdefghijklmnopqrstuvwxyz";
        "U" = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        "N" = "1234567890";
        "S" = "!#%&"
    }
 
    $rnd = New-Object System.Random
 
    # Introduce a random delay to avoid same random seed
    # during frequent calls
    Start-Sleep -milliseconds $rnd.Next(500) 
 
    # Create a random pattern if pattern is not defined or
    # fill the remaining if the pattern length is less than
    # password length
    if (!$pattern -or $pattern.length -lt $length) {
 
        if (!$pattern)
        {
            $pattern = ""
            $start = 0
        } else {
            $start = $pattern.length - 1
        }
 
        # Create a random pattern
        for ($i=$start; $i -lt $length; $i++)
        {
            $pattern += $pattern_class
        }
 
        # DEBUG: write-host "Random pattern : $pattern" 
     }
 
     $password = ""
 
     for ($i=0; $i -lt $length; $i++)
     {   
        $wpool = $charpool$pattern]      
        $password += $wpool    
     }                
 
     return $password
}
 
 
# Examples
 
# 8-char password with a random pattern
RandomPassword -length 8
 
# 12-char with a partial start pattern "ULNS":
# one uppercase, one lowercase, one numeric, one specific
# the last six pattern classes will be generated in random
RandomPassword -length 12 -pattern "ULNS"
 
# 10-char with a full pattern "LLLLSUUUUN":
# four lowercase, one special, four uppercase and one numeric
RandomPassword -length 10 -pattern "LLLLSUUUUN"