Skip to content

Improve password generation function #69

@NickolajA

Description

@NickolajA
function New-RandomPassword {
 # Creadit to https://arminreiter.com/2021/07/3-ways-to-generate-passwords-in-powershell/
    param (
        [Parameter(Mandatory)]
        [ValidateRange(4,[int]::MaxValue)]
        [int] $PasswordLength,
        [int] $upper = 1,
        [int] $lower = 1,
        [int] $numeric = 1,
        [int] $special = 1
    )
    if($upper + $lower + $numeric + $special -gt $PasswordLength) {
        throw "number of upper/lower/numeric/special char must be lower or equal to length"
    }

    $PasswordAllowedUpperCharacters = if (-not([string]::IsNullOrEmpty($env:PasswordAllowedUpperCharacters))) { $env:PasswordAllowedUpperCharacters } else { "ABCDEFGHIJKLMNOPQRSTUVWXYZ" }
    $PasswordAllowedLowerCharacters = if (-not([string]::IsNullOrEmpty($env:PasswordAllowedLowerCharacters))) { $env:PasswordAllowedLowerCharacters } else { "abcdefghijklmnopqrstuvwxyz" }
    $PasswordAllowedNumberCharacters = if (-not([string]::IsNullOrEmpty($env:PasswordAllowedNumberCharacters))) { $env:PasswordAllowedNumberCharacters } else { "123456789" }
    $PasswordAllowedSpecialCharacters = if (-not([string]::IsNullOrEmpty($env:PasswordAllowedSpecialCharacters))) { $env:PasswordAllowedSpecialCharacters } else { ".:;,-_!?$%*=+&<>@#()" }

    $charSet = ""
    if($upper -gt 0) { $charSet += $PasswordAllowedUpperCharacters }
    if($lower -gt 0) { $charSet += $PasswordAllowedLowerCharacters }
    if($numeric -gt 0) { $charSet += $PasswordAllowedNumberCharacters }
    if($special -gt 0) { $charSet += $PasswordAllowedSpecialCharacters }
    
    $charSet = $charSet.ToCharArray()
    $rng = New-Object System.Security.Cryptography.RNGCryptoServiceProvider
    $bytes = New-Object byte[]($PasswordLength)
    $rng.GetBytes($bytes)
 
    $result = New-Object char[]($PasswordLength)
    for ($i = 0 ; $i -lt $PasswordLength ; $i++) {
        $result[$i] = $charSet[$bytes[$i] % $charSet.Length]
    }
    $password = (-join $result)
    $valid = $true
    if($upper   -gt ($password.ToCharArray() | Where-Object {$_ -cin $PasswordAllowedUpperCharacters.ToCharArray() }).Count) { $valid = $false }
    if($lower   -gt ($password.ToCharArray() | Where-Object {$_ -cin $PasswordAllowedLowerCharacters.ToCharArray() }).Count) { $valid = $false }
    if($numeric -gt ($password.ToCharArray() | Where-Object {$_ -cin $PasswordAllowedNumberCharacters.ToCharArray() }).Count) { $valid = $false }
    if($special -gt ($password.ToCharArray() | Where-Object {$_ -cin $PasswordAllowedSpecialCharacters.ToCharArray() }).Count) { $valid = $false }
 
    if(!$valid) {
         $password = New-RandomPassword $PasswordLength $upper $lower $numeric $special
    }
    return $password
}

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions