読者です 読者をやめる 読者になる 読者になる

備考欄に感想を書くタイプのエンジニア

それで出世が遅れ(ry

PowerShell によるパスワードの生成に char 型を使ってみる

ちょっと Active Directory でユーザーを自動的に作成する際に予めランダムかつある程度の複雑性があるパスワードを設定しておきたいなということで、これを生成する方法が必要になりました。それで、私はゆとり PowerShell-er なのでまず検索してみますと powershell.com にこんなスクリプトがありました。

    function Get-RandomPassword {
        param(
            $length = 10,
            $characters = 'abcdefghkmnprstuvwxyzABCDEFGHKLMNPRSTUVWXYZ123456789!"§\$%&/()=?*+#_'
            )
    
        $random = 1..$length | ForEach-Object { Get-Random -Maximum $characters.length }
         # output random pwd
         $private:ofs=""
         [String]$characters[$random]
    } 

文字列の生成方法としては、予め候補となる文字記号数字を $characters に格納し、$length で文字数を指定して Get-Randam でそれらの情報を利用して文字列をランダムに生成している感じで特別変わったことはしてない感じです。不足があれば記号とか増やしてあげるといいです。

次はこちら。これは Windows Server 2012 Automation with PowerShell Cookbook の Chapter 2, Creating AD Users に書かれていたスクリプトです。上述のスクリプトに対してこちらのスクリプトの書き方がちょっとおもしろいというか、理屈を考えれば何ら不思議のない書き方なのですが、あんまり見たことがない書き方かなということでこちらが本題(?)です。

function Get-RandomPass{
    $newPass = ''
    1..10 | ForEach-Object {
    $newPass += [char](Get-Random -Minimum 48 -Maximum 122)
    }
    return $newPass
}

$newPass の部分を見ると [char](Get-random -Minimun 48 -Maximum 122) という部分があります。ここで何をしているかというと Get-Random-Minimum および -Maximum パラメータで指定した範囲内でランダムに取得された int 型の値を10進法の ASCII コードとして扱うべく [char] で char 型に変換した結果として文字を取得しています。

上のスクリプトで指定している最小値および最大値から判断する限り、以下の文字の中からランダムに文字列を生成することが意図されていると考えられますが、この理屈から言うと ASCII 33 (min) - 126 (max) までが範囲として最大となり、最も多くの記号を利用することになります1。ASCII 32 まで含むとスペースを含むことになりますね。

$characters = 
'0123456789:;<=>?@ABCDEFHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz'

どちらの方法がどうだとかいうことではありませんが、fizzbuzz にもいろいろな書き方があるような感じで「へぇ」ぐらいに受け取ってもらえれば。