I have inherited some legacy vb6 code. It’s a tool which generates a local admin password for a windows pc. The password is supposed to contain only a limited set of characters. The tool works fine.. as long as it’s not run on chinese or russian PCs. There, it generates weird passwords that nobody can type in. Of course it has something to do with the current operating system culture. The Chr(CharCode) function returns some weird characters on those systems. Anyone has a clue on how to make this culture invariant? I only want the tool to generate passwords with standard ASCII characters.
Function generatePassword(PASSWORD_LENGTH)
Dim NUMLOWER, NUMUPPER, LOWERBOUND, UPPERBOUND, LOWERBOUND1, UPPERBOUND1, SYMLOWER, SYMUPPER
Dim newPassword, count, pwd
Dim pCheckComplex, pCheckComplexUp, pCheckComplexLow, pCheckComplexNum, pCheckComplexSym, pCheckAnswer
NUMLOWER = 48 ' 48 = 0
NUMUPPER = 57 ' 57 = 9
LOWERBOUND = 65 ' 65 = A
UPPERBOUND = 90 ' 90 = Z
LOWERBOUND1 = 97 ' 97 = a
UPPERBOUND1 = 122 ' 122 = z
SYMLOWER = 33 ' 33 = !
SYMUPPER = 46 ' 46 = .
pCheckComplexUp = 0 ' used later to check number of character types in password
pCheckComplexLow = 0 ' used later to check number of character types in password
pCheckComplexNum = 0 ' used later to check number of character types in password
pCheckComplexSym = 0 ' used later to check number of character types in password
' initialize the random number generator
Randomize
newPassword = ""
count = 0
Do Until count = PASSWORD_LENGTH
' generate a num between 2 and 10
' if num <= 2 create a symbol
If Int((10 - 2 + 1) * Rnd + 2) <= 2 Then
'pwd = Int( ( SYMUPPER - SYMLOWER + 1 ) * Rnd + SYMLOWER )
pwd = Int((UPPERBOUND1 - LOWERBOUND1 + 1) * Rnd + LOWERBOUND1)
' if num is between 3 and 5 create a lowercase
ElseIf Int((10 - 2 + 1) * Rnd + 2) > 2 And Int((10 - 2 + 1) * Rnd + 2) <= 5 Then
pwd = Int((UPPERBOUND1 - LOWERBOUND1 + 1) * Rnd + LOWERBOUND1)
' if num is 6 or 7 generate an uppercase
ElseIf Int((10 - 2 + 1) * Rnd + 2) > 5 And Int((10 - 2 + 1) * Rnd + 2) <= 7 Then
pwd = Int((UPPERBOUND - LOWERBOUND + 1) * Rnd + LOWERBOUND)
Else
pwd = Int((NUMUPPER - NUMLOWER + 1) * Rnd + NUMLOWER)
End If
If Chr(pwd) <> "l" And Chr(pwd) <> "I" Then
newPassword = newPassword + Chr(pwd)
count = count + 1
End If
'Check to make sure that a proper mix of characters has been created. If not discard the password.
If count = (PASSWORD_LENGTH) Then
For pCheckComplex = 1 To PASSWORD_LENGTH
'Check for uppercase
If Asc(Mid(newPassword, pCheckComplex, 1)) > 64 And Asc(Mid(newPassword, pCheckComplex, 1)) < 90 Then
pCheckComplexUp = 1
'Check for lowercase
ElseIf Asc(Mid(newPassword, pCheckComplex, 1)) > 96 And Asc(Mid(newPassword, pCheckComplex, 1)) < 123 Then
pCheckComplexLow = 1
'Check for numbers
ElseIf Asc(Mid(newPassword, pCheckComplex, 1)) > 47 And Asc(Mid(newPassword, pCheckComplex, 1)) < 58 Then
pCheckComplexNum = 1
'Check for symbols
ElseIf Asc(Mid(newPassword, pCheckComplex, 1)) > 32 And Asc(Mid(newPassword, pCheckComplex, 1)) < 47 Then
pCheckComplexSym = 1
End If
Next
'Add up the number of character sets. We require 3 or 4 for a complex password.
pCheckAnswer = pCheckComplexUp + pCheckComplexLow + pCheckComplexNum + pCheckComplexSym
If pCheckAnswer < 3 Then
newPassword = ""
count = 0
End If
End If
Loop
'The password is good so return it
generatePassword = newPassword
End Function
Deanna’s comment is correct. Just change
ChrtoChrWand changeAsctoAscW.ChrWaccepts Unicode code pointsChraccepts “ANSI” code points, and the meaning of a particular code point will be different depending on the system code page. For example on Chinese and Russian code pages.