On Error Resume Next
strDebug=1 'set to 0 to turn on Debugging statements
If strDebug=0 Then
wscript.echo "Debugging is ON"
End If
'Define the password seed strings
strSimple="ab*c@def!gh2ij3kl4m#n5op$6qr7st8u%v9w^x&y(z)"
strComplex="abc8defGHIJghijkl3mnoLMNpqr2st^&)uvwxyz9ABCDE4F7KO6PQRS*(TUVWXYZ!@#5$%_+-="
strInsane="abcd_+e-=fghi2jklmQR9Sn5opMNqrs3tuvIJw4x*(;yzABCD),>EFGH7K@#$%^L8OPTUVW./?XYZ!&'[]}{\|~`:"
If wscript.arguments.count >0 Then
if InStr(1,Wscript.arguments(0),"?",vbTextCompare)<>"0" Then
ShowHelp(1)
wscript.quit
end if
End If
strTitle="Random Password Generator"
If Wscript.arguments.count < 1 Then
strLength=InputBox("How long do you want the password to be?",strTitle,"7")
If strLength="" Then
Wscript.echo "No value entered or job cancelled."
wscript.quit
End If
Else
strLength=wscript.arguments(0)
End If
If Wscript.arguments.count < 2 Then
strSeed=InputBox("How complex do you want it to be?" & VBCRLF & "1 - simple" & VBCRLF & "2 - complex" & VBCRLF & "3 - insane" & VBCRLF & "4 - Help",strTitle,1)
Select Case strSeed
Case 1
strSeed=strSimple
Case 2
strSeed=strComplex
Case 3
strSeed=strInsane
Case 4
ShowHelp(0)
wscript.quit
Case Else
Wscript.echo "Invalid selection. Please try again."
Wscript.quit
End Select
Else
strSeed=Wscript.Arguments(1)
Select Case strSeed
Case 1
strSeed=strSimple
Case 2
strSeed=strComplex
Case 3
strSeed=strInsane
Case 4
ShowHelp(0)
wscript.quit
Case Else
Wscript.echo "Invalid selection. Please try again."
Wscript.quit
End Select
End If
If Wscript.Arguments.Count < 3 Then
askUnique=InputBox("Do you want all unique characters? Enter 0 for Yes and 1 for No",strTitle,"1")
Select Case askUnique
Case 1
strUnique=1
Case 0
strUnique=0
Case Else
wscript.echo "Invalid response or operation cancelled"
wscript.quit
End Select
Else
askUnique=Wscript.Arguments(2)
Select Case askUnique
Case 1
strUnique=1
Case 0
strUnique=0
Case Else
wscript.echo "Invalid response or operation cancelled"
wscript.quit
End Select
End If
If strDebug=0 Then
wscript.echo "strUnique is set to " & strUnique
End If
Wscript.Echo "Password is " & strPass(strLength,strSeed,strUnique,strDebug)
wscript.quit
Function GenIt(MFactor)
Randomize
GenIt=INT(RND()*MFactor)+1
end Function
Function StrPass(strLength,strSeed,strUnique,strDebug)
'strLength is how long a password to generate
'strSeed is the source string to characters to build the password from
strPass=""
If strDebug=0 Then
wscript.echo "Building a " & strLength & " character password from:" & VBCRLF & strSeed & VbCrLf
End If
MFactor=Len(strSeed)
For x=1 to strLength
strNum=GenIt(MFactor)
strNext=Mid(strSeed,strNum,1)
If strUnique=0 Then
If strDebug=0 Then
wscript.echo "Checking if " & strNext & " has already been used"
End If
strPass=strPass & ChkNext(strNext,strPass,strSeed,strDebug)
Else
strPass=strPass&strNext
End If
Next
End Function
Function ChkNext(strNext,strPass,strSeed,strDebug)
strTmp=strNext
MFactor=Len(strSeed)
If InStr(1,strPass,strNext,1) <>0 Then
If strDebug=0 Then
wscript.echo "Duplicate character"
End If
strNum=GenIt(MFactor)
If strDebug=0 Then
wscript.echo "New number is " & strNum
End If
strNext=Mid(strSeed,strNum,1)
If strDebug=0 Then
wscript.echo "New character to check is " & strNext
End If
strTmp=ChkNext(strNext,strPass,strSeed,strDebug)
End If
If strDebug=0 Then
wscript.echo "At end of function strTmp="&strTmp
End If
ChkNext=strTmp
If strDebug=0 Then
wscript.echo "ending ChkNext function"
End If
End Function
Sub ShowHelp(Detail)
msg=VBCRLF & "RANDPASS.VBS HELP --" & VBCRLF & " This script will generate a random password of X length. It will build the password from seed strings of increasing complexity." & VBCRLF & "1 - simple:" & VBCRLF & " " & strSimple & VBCRLF & "2 - complex:" & VBCRLF & " " & strComplex & VBCRLF & "3 - insane:" & VBCRLF & " " & strInsane & VBCRLF & VBCRLF & "The numbers 0 and 1 have been removed to avoid confusion with the letters O and L." & VbCrLf
If Detail=0 Then
wscript.echo msg
Else
msg=msg & VBCRLF & " Password_length should be a number between 4 and 127, although a limit of 14 is " & VBCRLF & "recommended for Win9x clients. Default is 7." & VBCRLF & " Complexity must be 1,2 or 3." & VBCLRF & " A uniqueness value of 0 will make each password character" & VBCRLF & "unique. A value of 1 [default] will allow repeated characters." & VBCRLF & " If you don't pass values at the command prompt, you will be prompted for each value." & VBCRLF & VBCRLF & "Usage: cscript //nologo RandPass.vbs [password_length]|[?] [complexity] [uniqueness]" & VBCRLF & "cscript randpass.vbs ? will display this help message." & VbCrLf
wscript.echo msg
end If
wscript.quit
End Sub