PowerShellでパスワードの入力を受け付ける

PowerShellを使って作業しているエンジニア

Azure CLIのような汎用的なツールを使っていると、自分の用途に特化させたスクリプトにまとめたくなることが良くあります。

最近だと、私はPowerShellのスクリプトをよく書いていて、先述のAzure CLIの様々なユーティリティをスクリプトとしてまとめて、社内向けツールとして活用しています。

その作業の中で、ログインパスワードのような入力を受け付ける必要があり、少し調べて対応したのでメモとして残しておきます。

具体的には、よくあるこんな使い方を想定しているものです。

パスワード入力のイメージ
今回のスクリプトの用例

要するに、パスワードの入力を「*」でマスクして受け付けて、セキュアに扱おうというものです。

具体的には、こんなスクリプトを書いて利用しています。

function InputPassword($prompt) {
    $pass = (Read-Host $prompt -AsSecureString)
    $bpass = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pass)
    $spass = [System.Runtime.InteropServices.Marshal]::PtrToStringBSTR($bpass)
    return $spass
}

$account = (Read-Host "Input Account Name")
$pass = InputPassword "Input Password"

よく使うユーティリティなので、 InputPasswordという関数に処理をまとめていて、外部から入力プロンプトを指定できるようにしたうえで、この中でパスワード入力に必要な処理をすべてやるようにしています。

関数の中でやっている事は、Read-Hostに-AsSecureStringオプションを付けてセキュア文字列として入力させることと、そこからBSTRへの変換、さらにバイナリデータから後続の処理で使える文字列形式への変換を経ています。

PowerShellは対話型のシェルとしてはイマイチに感じていましたが、(VSCodeの強力なエディタ機能も相まって)スクリプト環境としては中々出来が良く、最近気に入って使っています。

(数年ぶり何度目かで聞いた話題で、まだ生きていたのかという気持ちになりましたが)VBScriptが廃止されるというニュースがありましたので、VBScriptが担っていたような分野でも広く普及してもらいたいものです。