PowerShell を使用してランダムな文字列を生成する

Marion Paul Kenneth Mendoza 2023年6月20日
  1. Get-Random でランダムな文字列を生成する
  2. GeneratePassword() 関数でランダムなパスワードを生成する
PowerShell を使用してランダムな文字列を生成する

通常、Active Directory を管理する場合、一括ユーザーをインポートして一時パスワードを提供するタスクが発生することがあります。 ただし、ユーザーごとに一意のパスワードを設定する必要がある場合は、ランダムな文字列を生成するスクリプトを作成しない限り、その作業は面倒です。

したがって、この記事では、PowerShell を使用してパスワードに使用できるランダムな文字列を生成する方法について説明します。

Get-Random でランダムな文字列を生成する

PowerShell には、Get-Random というネイティブ コマンドがあります。 Get-Random コマンドレットは、ランダムに選択された文字または数字を取得します。

オブジェクトのコレクションを Get-Random に送信すると、グループからランダムに選択された 1つ以上のオブジェクトが取得されます。

パスワードを作成するとき、Get-Random コマンドレットを 4 回呼び出すことができます。毎回異なる input パラメーター (特殊文字、数字、大文字、小文字) を使用して、結果の文字列を連結し、別の Get を使用してそれらをシャッフルします。 -Random 呼び出します。

コード例:

$TokenSet = @{
        U = [Char[]]'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
        L = [Char[]]'abcdefghijklmnopqrstuvwxyz'
        N = [Char[]]'0123456789'
        S = [Char[]]'!"#$%&''()*+,-./:;<=>?@[\]^_`{|}~'
    }

$Upper = Get-Random -Count 5 -InputObject $TokenSet.U
$Lower = Get-Random -Count 5 -InputObject $TokenSet.L
$Number = Get-Random -Count 5 -InputObject $TokenSet.N
$Special = Get-Random -Count 5 -InputObject $TokenSet.S

$StringSet = $Upper + $Lower + $Number + $Special

(Get-Random -Count 15 -InputObject $StringSet) -join ''

出力:

9ZimEXDW*@xo?12

上記の出力は、毎回異なる文字列を生成するはずです。 ただし、前のスニペットからわかるように、コマンドレットを複数回使用する必要があるため、スクリプト ブロックが長くなり、処理時間がミリ秒単位で遅くなります。

この記事の次のセクションでは、上記の機能を数行のコードで実現する方法について説明します。

GeneratePassword() 関数でランダムなパスワードを生成する

パスワードに使用する文字列のみを作成する場合は、[System.Web.Security] から GeneratePassword() を使用することを検討できます。 関数を使用する前に、まず以下のコードを使用して System.Web ライブラリをロードする必要があります。

[Reflection.Assembly]::LoadWithPartialName("System.Web")

ロードしたら、GeneratePassword() 関数を実行してパスワードをランダムに生成できます。

コード例:

[System.Web.Security.Membership]::GeneratePassword(15,2)

出力:

QQjj*LJ:e=YZ)Fo

上記のコード スニペットからわかるように、GeneratePassword() 関数は 2つの引数を受け入れます。

  1. 最初の引数は、パスワードに必要な合計文字数を表す整数値を取ります。
  2. 2 番目の引数は、パスワードの特殊文字の数を表す整数値を取ります。

ただし、このコードは、生成されるパスワードに少なくとも 1つの数字が含まれることを保証するものではありません。 少なくとも数字が含まれていることを確認するには、以下のスニペットを実行します。

コード例:

do {
   $pwd = [System.Web.Security.Membership]::GeneratePassword(15,2)
} until ($pwd -match '\d')

$pwd

出力:

Y4UkK4)G+lannRd
Marion Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn

関連記事 - PowerShell String