CarlD Posted May 2, 2017 Posted May 2, 2017 (edited) I'm a command-line kind of guy, and I write scripts primarily for myself. Since many websites nowadays require strong passwords, I thought I'd write a simple password generator in AutoIt. I know that AutoIt mavens have written more elaborate pw generators; I offer mine for what it's worth. The compiled script, GenPass.exe, can be downloaded here. See below for Help text and source. Enjoy! Updates: 2017-05-06: Default password changed to variable length of 13-22 characters; argument "1" no longer supported When compiled as GenPW.exe, password is sent directly to the clipboard, no message box unless password generation fails. 2017-05-05: Correction to bypass password generation if argument is ?|H|h 2017-05-03: Added special argument 1 to generate a password of variable length (10-18 characters) including two (2) separator characters 2017-05-02: Added option /S to set a (persistent) randomization seed Help: GenPass.exe|GenPW.exe -- CLD rev. 2017-05-06 Generate a strong password and save it to the Windows clipboard Note: GenPW.exe has the same functionality as GenPass.exe, but sends the generated password directly to the clipboard. No message box is displayed (unless password generation fails). "Strong" means that the password contains random combinations of alphnumeric characters, including at least one uppercase letter (A-N,P-Z), one lowercase letter (a-k,m-z), and one number (0-9). (Generated passwords do not use uppercase O or lowercase l as these characters are easily confused with the numbers 0 and 1.) The length of the password is up to you (see Usage, below), but needless to say, the longer, the stronger. By default, GenPass generates a strong password of between 13 and 22 characters that includes two of the following separator characters: $%&()*+,-./:;@[]_. Alternatively, you can supply a command-line argument in which any number n from 1 to 9 stands for a random sequence of alphanumeric characters of length n, and any other character stands for itself. Thus, you can include fixed words and other characters, such as separators, in the generated password. Spaces in the argument are converted to underscores. Here are some examples: Usage Sample output ----- ------------- GenPass MqU26A*6dS-53r8 GenPass 9 frdhPYDs9 GenPass 58 weoXYHKxDI1uQ GenPass 5.5 UfA6j.43VBB GenPass 3-4-3 0I0-6gq4-njc GenPass 5,3.7 I2FSR,tRZ.fjeIsFy GenPass 3)5(3 UMf)m8513(CBq GenPass 3[haha]3 yLa[haha]P3y GenPass Yes way5 Yes_way1BsUh Seed Option (/S) ---------------- Adding switch /S to the command-line argument causes GenPass to set a seed for the random generation of password characters. A bare /S sets a randomized seed which is written to disk in a file named GenPass.rnd; this seed is used for all subsequent launches of GenPass with the bare /S option. Alternatively, you can specify a seed (range -2^31 to 2^31-1) on the command line with /S [seed]. Here are some examples: GenPass /S GenPass /S 33.3333 GenPass 5,5,5 /S GenPass 5,5,5 /S 33.3333 Note that any subsequent launch of GenPass without the /S option will cause GenPass.rnd to be deleted. Source: expandcollapse popup#Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_Outfile=GenPass.exe #AutoIt3Wrapper_UseUpx=y #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** #cs GENPASS.AU3 -- AutoIt v3 CLD rev.2017-05-05 ------------------ Generate a strong password and save it to the clipboard >> Command GenPass ? for detailed help << ------------------------------------------------------- #ce #include <Clipboard.au3> #include <FileConstants.au3> #include <MsgBoxConstants.au3> #include <StringConstants.au3> AutoItSetOption("WinTitleMatchMode", -4) FileInstall ("d:\path\GenPass.htm", @ScriptDir & "\GenPass.htm", $FC_OVERWRITE) ; Template/Seed Local $sTemp = "" Local $bSeed = False, $fSeed=False If $CmdLine[0] Then $sTemp = $CmdLineRaw If $CmdLine[$CmdLine[0]] = "/s" Then $bSeed = True $sTemp = StringTrimRight($sTemp, 2) $sTemp = StringStripWS($sTemp, $STR_STRIPTRAILING) EndIf If $CmdLine[$CmdLine[0] - 1] = "/s" Then $bSeed = True $fSeed = $CmdLine[$CmdLine[0]] $sTemp = StringTrimRight($sTemp, 3 + StringLen($fSeed)) $sTemp = StringStripWS($sTemp, $STR_STRIPTRAILING) EndIf EndIf If Not $sTemp Then $sTemp = "8" If $sTemp = "1" Then $aSeps = StringSplit("#$%&()*+,-./:;@[]_", "") $sTemp = String(Random(3,6,1)) & $aSeps[Random(1,$aSeps[0],1)] & _ String(Random(2,4,1)) & $aSeps[Random(1,$aSeps[0],1)] & _ String(Random(3,6,1)) EndIf $sFn = @ScriptDir&"\GenPass.rnd" If $bSeed Then If Not $fSeed Then If Not FileExists($sFn) Then $fSeed = Random(-1.999^31,1.999^31,0) $h=FileOpen($sFn,2) If $h > -1 Then FileWrite($h,$fSeed) FileClose($h) Else Exit MsgBox($MB_ICONWARNING, @ScriptName, "Error opening " & $sFn) EndIf Else $h=FileOpen($sFn) If $h > -1 Then $fSeed=FileRead($h) FileClose($h) Else Exit MsgBox($MB_ICONWARNING, @ScriptName, "Error opening " & $sFn) EndIf EndIf EndIf SRandom($fSeed) Else If FileExists($sFn) Then FileDelete($sFn) EndIf ; Show help If StringInStr("?Hh", $sTemp) Then If WinExists("[REGEXPTITLE:GenPass.exe:.*]") Then WinActivate("[REGEXPTITLE:GenPass.exe:.*]") Else ShellExecute(@ScriptDir & "\GenPass.htm") EndIf Exit EndIf ; Main $sTemp = StringReplace($sTemp, " ", "_") $iC = 1 While $iC < 10001 $sPW = GenPW($sTemp) If $sPW Then ClipPut($sPW) If Not StringInStr (@ScriptName, "GenPW") Then _ MsgBox($MB_ICONINFORMATION, @ScriptName, $sPW & _ " saved to clipboard" & @CRLF & @CRLF & _ @ScriptName & " ? shows detailed help") Exit Else $iC += 1 EndIf WEnd Exit MsgBox($MB_ICONWARNING, @ScriptName, "Password generation failed!") ;------------------------------- Func GenPw($sTemplate) Local $aIn = StringSplit($sTemplate,"") Local $sOut = "" Local $sABC = _ "0123456789ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz0123456789" Local $aAB = StringSplit($sABC, "") Local $bUC = 0, $bLC = 0, $bNR = 0 For $i = 1 To $aIn[0] If Int($aIn[$i]) Then $iK = $aIn[$i] For $j = 1 To $iK $iR = Random(1, $aAB[0],1) Select Case StringInStr("0123456789", $aAB[$iR]) $bNR = 1 Case StringInStr("ABCDEFGHIJKLMNPQRSTUVWXYZ", _ $aAB[$iR], $STR_CASESENSE) $bUC = 1 Case StringInStr("abcdefghijklmnpqrstuvwxyz", _ $aAB[$iR], $STR_CASESENSE) $bLC = 1 EndSelect $sOut &= $aAB[$iR] Next Else $sOut &= $aIn[$i] EndIf Next If ($bUC And $bLC And $bNR) Then Return $sOut Else Return 0 EndIf EndFunc Edited May 6, 2017 by CarlD Update
spudw2k Posted May 2, 2017 Posted May 2, 2017 Looks pretty neat. My only criticism is that the password is randomized each time. It would be nice if there was a "seed" mode that could consistently generate the same password like a hashing function. I could see both methods being useful (consistent output and random) depending on the use case. Without downloading and running the exec, can you share the contents of the GenPass.html file? CarlD 1 Spoiler Things I've Made: Always On Top Tool ◊ AU History ◊ Deck of Cards ◊ HideIt ◊ ICU ◊ Icon Freezer ◊ Ipod Ejector ◊ Junos Configuration Explorer ◊ Link Downloader ◊ MD5 Folder Enumerator ◊ PassGen ◊ Ping Tool ◊ Quick NIC ◊ Read OCR ◊ RemoteIT ◊ SchTasksGui ◊ SpyCam ◊ System Scan Report Tool ◊ System UpTime ◊ Transparency Machine ◊ VMWare ESX Builder Misc Code Snippets: ADODB Example ◊ CheckHover ◊ Detect SafeMode ◊ DynEnumArray ◊ GetNetStatData ◊ HashArray ◊ IsBetweenDates ◊ Local Admins ◊ Make Choice ◊ Recursive File List ◊ Remove Sizebox Style ◊ Retrieve PNPDeviceID ◊ Retrieve SysListView32 Contents ◊ Set IE Homepage ◊ Tickle Expired Password ◊ Transpose Array Projects: Drive Space Usage GUI ◊ LEDkIT ◊ Plasma_kIt ◊ Scan Engine Builder ◊ SpeeDBurner ◊ SubnetCalc Cool Stuff: AutoItObject UDF ◊ Extract Icon From Proc ◊ GuiCtrlFontRotate ◊ Hex Edit Funcs ◊ Run binary ◊ Service_UDF
TheDcoder Posted May 2, 2017 Posted May 2, 2017 If you need a very good password management system, you should try KeePass. It contains everything you expect... if you need something extra, you can always look for plugins EasyCodeIt - A cross-platform AutoIt implementation - Fund the development! (GitHub will double your donations for a limited time) DcodingTheWeb Forum - Follow for updates and Join for discussion
CarlD Posted May 2, 2017 Author Posted May 2, 2017 3 hours ago, spudw2k said: Without downloading and running the exec, can you share the contents of the GenPass.html file? Sure, it's the Help text included in my OP. The idea of a "seed" option is an interesting one. Will look into it. Thanks for your comments.
CarlD Posted May 3, 2017 Author Posted May 3, 2017 (edited) Added a seed option (/S), in response to @spudw2k. Details are in the updated Help text, in the OP. Edited May 5, 2017 by CarlD
CarlD Posted May 3, 2017 Author Posted May 3, 2017 9 hours ago, TheDcoder said: If you need a very good password management system, you should try KeePass. It contains everything you expect... if you need something extra, you can always look for plugins Thanks for the tip. I've resisted password managers due to cultural/age reasons. As far as I'm concerned, the natural order of things is a monospace green screen font on a black background, and there is (or should be) no such thing as a password. In other words, my excuse is that I'm old. TheDcoder 1
TheDcoder Posted May 3, 2017 Posted May 3, 2017 2 hours ago, CarlD said: In other words, my excuse is that I'm old. That's a good one EasyCodeIt - A cross-platform AutoIt implementation - Fund the development! (GitHub will double your donations for a limited time) DcodingTheWeb Forum - Follow for updates and Join for discussion
CarlD Posted May 4, 2017 Author Posted May 4, 2017 (edited) Update: Special argument 1 generates a strong password of variable length (10-18 characters) that includes two separator characters #$%&()*+,-./:;@[]_ . See the updated Help text in the OP. Edited May 4, 2017 by CarlD
CarlD Posted May 6, 2017 Author Posted May 6, 2017 (edited) Update: Default password is now variable length 13-22 characters. Also, when compiled as GenPW.exe, password is sent directly to the clipboard, no message box unless password generation fails. Edited May 7, 2017 by CarlD
Trong Posted May 6, 2017 Posted May 6, 2017 Please, let's create a program like this: GUI Script: Global $nMsg, $hGUI = GUICreate("Password Generator", 456, 243, 192, 124) GUICtrlCreateLabel("Password Include:", 5, 5, 440, 17, 0x0200, 0x00100000) Global $sLowercase = GUICtrlCreateCheckbox("abcdefghijkmnopqrstuvwxyz", 8, 24, 209, 17, 0x0C00) Global $sUppercase = GUICtrlCreateCheckbox("ABCDEFGHIJKLMNPQRSTUVWXYZ", 8, 48, 217, 17, 0x0C00) Global $sNumber = GUICtrlCreateCheckbox("0123456789", 8, 72, 97, 17, 0x0C00) Global $sSymboy = GUICtrlCreateCheckbox("~!@#$%^*()_+", 8, 96, 97, 17, 0x0C00) Global $sOther = GUICtrlCreateCheckbox("Custom Char:", 8, 120, 92, 17, 0x0C00) Global $pOther = GUICtrlCreateInput("", 112, 120, 137, 21) GUICtrlCreateLabel("Password Leng:", 16, 152, 92, 17, 0x0200, 0x00100000) Global $pLenFrom = GUICtrlCreateInput("8", 112, 152, 49, 21) GUICtrlCreateLabel("to", 176, 152, 21, 17, 0x0200, 0x00100000) Global $pLenTo = GUICtrlCreateInput("8", 200, 152, 49, 21) GUICtrlCreateLabel("Password file:", 16, 184, 92, 17, 0x0200, 0x00100000) Global $pSaveFile = GUICtrlCreateInput(@ScriptDir & "\PasswordLib.txt", 112, 184, 257, 21) Global $iStatus = GUICtrlCreateLabel("TIP: Select your option and select path file to save your password!", 8, 216, 428, 17, 0x0200, 0x00100000) Global $bGenerator = GUICtrlCreateButton("Generator All && Save", 256, 32, 193, 145) Global $bSelectPath = GUICtrlCreateButton("...", 376, 184, 59, 25) GUISetState(@SW_SHOW) While 1 $nMsg = GUIGetMsg() Switch $nMsg Case -3 Exit EndSwitch WEnd Enjoy my work? Buy me a 🍻 or tip via ❤️ PayPal
CarlD Posted May 7, 2017 Author Posted May 7, 2017 7 hours ago, Trong said: Please, let's create a program like this: I've never done GUI scripting, so there would be a learning curve for me. If you'd like to use/improve my code above, feel free. And, of course, there are other GUI options, for example:
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now