SANS:
$length = 15 { If ($length -lt 4) { $length = 4 } #Password must be at least 4 characters long in order to satisfy complexity requirements. Do { $password = $null $hasupper = $false #Has uppercase letter character flag. $haslower = $false #Has lowercase letter character flag. $hasnumber = $false #Has number character flag. $hasnonalpha = $false #Has non-alphanumeric character flag. $isstrong = $false #Assume password is not strong until tested otherwise. For ($i = $length; $i -gt 0; $i--) { $x = get-random -min 33 -max 126 #Random ASCII number for valid range of password characters. #The range eliminates the space character, which causes problems in other scripts. If ($x -eq 34) { $x-- } #Eliminates double-quote. This is also how it is possible to get "!" in a password character. If ($x -eq 39) { $x-- } #Eliminates single-quote, causes problems in scripts. If ($x -eq 47) { $x-- } #Eliminates the forward slash, causes problems for net.exe. If ($x -eq 96) { $x-- } #Eliminates the backtick, causes problems for PowerShell. If ($x -eq 48 -or $x -eq 79) { $x++ } #Eliminates zero and capital O, which causes problems for humans. $password = $password + [System.Char] $x #Convert number to an ASCII character, append to password string. If ($x -ge 65 -And $x -le 90) { $hasupper = $true } If ($x -ge 97 -And $x -le 122) { $haslower = $true } If ($x -ge 48 -And $x -le 57) { $hasnumber = $true } If (($x -ge 33 -And $x -le 47) -Or ($x -ge 58 -And $x -le 64) -Or ($x -ge 91 -And $x -le 96) -Or ($x -ge 123 -And $x -le 126)) { $hasnonalpha = $true } If ($hasupper -And $haslower -And $hasnumber -And $hasnonalpha) { $isstrong = $true } } } While ($isstrong -eq $false) $password
Replaced with:
Length = 15 $PasswordCharCodes = {33..126}.invoke() #Exclude ",',/,`,O,0 34,39,47,96,48,79 | foreach {[void]$PasswordCharCodes.Remove($_)} $PasswordChars = [char[]]$PasswordCharCodes do { $NewPassWord = $(foreach ($i in 1..$length) { Get-Random -InputObject $PassWordChars }) -join '' } until ( ( $NewPassword -cmatch '[A-Z]' ) -and ( $NewPassWord -cmatch '[a-z]' ) -and ( $NewPassWord -imatch '[0-9]' ) -and ( $NewPassWord -imatch '[^A-Z0-9]' ) ) $NewPassword
Congrats! Code looks optimized now..
Btw you can check web version of ajax’ed password generator:
http://www.digitalette.com/md5-converter/
What do you think?