新年早々、社内システムのログインパスワードを忘れてしまい、危うくロックアウトされるところでした。
それ自体は何とかなりましたが、あと数か月もするとパスワード更新時期になります。新しいパスワード考えるの面倒だな。。。
ということで本題。PowerShellでパスワードを生成するスクリプトを作ってみました。
パスワード生成といえば乱数生成
必要な桁数分、任意の文字を発生させればいいですね。PowerShellで乱数を発生させるコマンドレットはGet-Random
になります。
Get-Random
はプログラム言語によくあるrand()
関数とかと違って、整数を返してくれるので便利。黙って起動すれば0から2,147,483,647までのいずれかの整数が返ってきます。
(*'-') >> Get-Random
1674970342
生成範囲は-Minimum
パラメーターと-Maximum
パラメーターを使って任意に設定することができます。たとえば8から16までの任意の数を生成したければ。。。
(*'-') >> Get-Random -Minimum 8 -Maximum 16
13
といった按配。
更に-InputObject
パラメーターを使うことで指定した値のリストから選択して返してくれる。自分で変換しなくていい!
(*'-') >> Get-Random -InputObject "Pen","Apple","Pineapple"
Pen
らくちん!
foreachループを使ったパスワード生成
というわけで8桁から16桁までの英小文字または数字を組み合わせた任意の文字列を生成するコードはこちら。
$passwd=""
foreach ($n in 1..$(Get-Random -min 8 -max 16)) {
$passwd=$passwd+$(Get-Random -input 0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z)
}
$passwd
パラメーター名は省略形を使っています。
Countパラメータを使ったパスワード生成
-Count
パラメーターを使うとワンライナーで生成できます。
(*'-') >> Write-Host (Write-Host -NoNewLine -Separator "" (Get-Random -Count (Get-Random -min 8 -max 16) -input 0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z))
tubleg8fc30zra
ただし出力が縦に並んでしまうので、Write-Host
コマンドレットの-NoNewLine
パラメータと-Separator
パラメータを使って1行に整形した後、もう一度Write-Host
コマンドレットで行末を改行しています。ちょっとカッコ悪いですね。
…と思ったら-Join
演算子を使って解決できました。stknohgさん、ご指摘ありがとうございました。
(*'-') >> -Join (Get-Random -Count (Get-Random -min 8 -max 16) -input 0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z)
uzcfkhxd8qsj
いずれにしてもどちらかのコードを$profile
あたりに関数定義しておけばいいでしょう。
問題はパスワード更新の時期までこのことを覚えているかどうかだな。。。(´Д`*)
注)-Countパラメータは-Inputパラメータで指定した以上の数を出力することができません。繰り返し回数が多い場合はforeachでループさせましょう。