function New-Password { [cmdletBinding()] param ( [String] [ValidateRange(3,256)] [Parameter()] $Length = 12, [ValidateSet('Complex','Numbers','Specials','LowerCaseLetters','UpperCaseLetters')] [String[]] $type = 'Complex' ) $Specials = ( 33..45 ) + ( 58..64 ) + ( 91..95 ) $Numbers = ( 48..57 ) $UpperCaseLetters = 65..90 $LowerCaseLetters = 97.. 122 Switch ( $Type ) { 'Complex' { $Charset = $UpperCaseLetters + $LowerCaseLetters + $Numbers + $Specials; break } 'UpperCaseLetters' { $Charset += $UpperCaseLetters } 'LowerCaseLetters' { $Charset += $LowerCaseLetters } 'Numbers' { $Charset += $Numbers } 'Specials' { $Charset += $Specials } } Write-Verbose "$Charset" While ((( $UpperInserted + $LowerInserted + $SpecialsInserted + $NumbersInserted -lt 3 ) -and ( $type -eq 'Complex' )) -or (( $type -ne 'Complex' ) -and ( $UpperInserted + $LowerInserted + $SpecialsInserted + $NumbersInserted -lt 1 ))) { $UpperCount = 0 $LowerCount = 0 $SpecialsCount = 0 $numbersCount = 0 $UpperInserted = 0 $LowerInserted = 0 $SpecialsInserted = 0 $NumbersInserted = 0 [string]$Password = '' For ( $i=1; $i -le $Length; $i++ ) { $RandomChar = (Get-Random -InputObject $CharSet) Switch ( $RandomChar ) { { $RandomChar -in $UpperCaseLetters } { $UpperCount++; $UpperInserted = 1 } { $RandomChar -in $LowerCaseLetters } { $LowerCount++; $LowerInserted = 1 } { $RandomChar -in $Specials } { $SpecialsCount++; $SpecialsInserted = 1 } { $RandomChar -in $Numbers } { $NumbersCount++; $NumbersInserted = 1 } } [string]$Password += [char[]]$RandomChar } } $Password Write-Verbose "UpperCaseCount: $UpperCount" Write-Verbose "LowerCaseCount: $LowerCount" Write-Verbose "Specials: $SpecialsCount" Write-Verbose "Numbers: $numbersCount" }