複数のパスワードを一括生成するVBS

見出し


ランダム文字列のパスワードを簡単に一括生成して、クリップボードにコピーするようなVBSを作ってみました。
個人的に、複数のパスワードを大量に生成しなければならないケースがたびたびあったためです。

【8文字のパスワードを複数生成するスクリプト】

このスクリプトは、パスワード生成に関して以下の機能を持ちます。
●生成されたパスワードは、クリップボードにコピーされる
●生成するパスワードの数を指定できる
●数字・英小文字・英大文字が、それぞれ1つ以上含まれる
●紛らわしい文字を除外して、使用しない(0Oo 1Il 9gq UV)

Option Explicit

Dim objShell
Dim strCopy 'パスワード文字列を格納する変数
Dim num '生成するパスワードの数を格納する変数
Dim maxLetter : maxLetter = 20 '生成するパスワードの最大数
Dim i 'For文で使用するカウンター

num = 1 '生成するパスワード数の初期値
Do
	num = InputBox("何種類のパスワードを生成しますか?" & _
		vbNewLine &"(最大" & maxLetter & "。空白の場合は1として処理)", _
		WScript.ScriptName)
	If IsEmpty(num) Then
		WScript.Quit
	Elseif num = "" Then
		num = 1
	End If
Loop Until IsNumeric(num)

num = Int(num)
If num > maxLetter Then num = maxLetter '最大数を超える場合は、最大数にする。

For i = 1 To num
	'パスワード生成用プライベート関数 makePassword をnum回実行する。
	If i = 1 then '1つ目を生成するときは、そのまま出力する
		strCopy = makePassword
	Else '2つ目以降は、改行を加えて追記する
		strCopy = makePassword & vbNewLine & strCopy
	End If
Next

'クリップボードに格納する
Set objShell = CreateObject("WScript.Shell")
objShell.Exec("clip").StdIn.Write strCopy
Set objShell = Nothing

MsgBox "クリップボードに格納しました。" & vbCrLf & strCopy, , WScript.ScriptName
WScript.Quit

'----------------------------------------------------------------------------------
Private Function makePassword()
	Dim str 'パスワードに使用する文字
	Dim strMax 'strの配列の要素数
	
	'英大文字・小文字・数字で8文字のランダム文字列を生成する。
	'ただし、0Oo 1Il 9gq UVを除外した51種類から選択。
	str = Array("2","3","4","5","6","7","8", _
		"A","B","C","D","E","F","G","H",    "J","K","L","M", _
		"N",    "P","Q","R","S","T",        "W","X","Y","Z", _
		"a","b","c","d","e","f",    "h","i","j","k",    "m", _
		"n",    "p",    "r","s","t","u","v","w","x","y","z") 
        'パスワードに使用する文字で構成された配列
	strMax = Ubound(str)+1 
    '50+1=51 (vbsの配列は常に0スタートなので、0 to 50で配列の要素数は51)
	
	Const Mojisuu = 8 '生成するパスワードの文字数
	Dim rndstr '生成されたパスワード
	Dim rndnum '配列strの要素番号。0-50の間からランダムに選ばれる。
	Dim i 'For文で使用する変数

	For i = 1 To Mojisuu 'ランダム1文字生成を8回
		Randomize
		Wscript.sleep Int(10 * Rnd + 1) 
        'Forの時間間隔をランダム化させることにより、似通ったパスワードが生成されないようにする。
        
		Randomize
		rndnum = Int(Rnd() * strMax) '0-0.999 * 51 = 0-50.999 => 整数化 0-50
		rndstr = rndstr & str(rndnum)
	Next
	
	'正規表現で文字列をチェック(数字・英小文字・英大文字すべて含まれているか)
	Dim objRE1 : Dim objRE2 : Dim objRE3

	Set objRE1 = CreateObject("VBScript.RegExp")
	objRE1.Pattern = "\d" '数字を含む

	Set objRE2 = CreateObject("VBScript.RegExp")
	objRE2.Pattern = "[A-Z]" '英大文字を含む

	Set objRE3 = CreateObject("VBScript.RegExp")
	objRE3.Pattern = "[a-z]" '英小文字を含む

	If objRE1.Test(rndstr) And objRE2.Test(rndstr) And objRE3.Test(rndstr) Then
		makePassword = rndstr 'すべての条件にマッチしたら、生成された文字列を返す
	Else
		makePassword = makePassword() 'マッチしなければ、再帰的にパスワード生成を実施
	End If
End Function