PowerShell を使用してランダムな文字列を生成する方法
-
PowerShell でランダムな文字列を生成するために
Get-RandomCmdlet を使用する -
PowerShell でランダムなパスワードを生成するために
GeneratePassword()関数を使用する -
PowerShell でランダムな文字列を生成するために
New-GuidCmdlet を使用する -
PowerShell で文字セットと
Get-RandomCmdlet を使用してランダムな文字列を生成する - 結論
Active Directory を管理する際、一意の一時パスワードを持つ大量のユーザーをインポートするなどのタスクは困難な場合があります。幸いなことに、PowerShell はこれらのタスクを簡素化するためにランダムな文字列を生成する効果的な解決策を提供しています。
この記事では、PowerShell でこれを達成するためのさまざまな方法を探ります。
PowerShell でランダムな文字列を生成するために Get-Random Cmdlet を使用する
PowerShell には Get-Random というネイティブコマンドがあり、ランダムな文字や数字を選択します。Get-Random コマンドにアイテムの配列を提供すると、そのコレクションから 1つ以上のオブジェクトがランダムに選ばれます。
パスワードを作成する際には、異なる input パラメーター(特殊文字、数字、大文字、そして小文字)を持つ Get-Random cmdlet を 4 回呼び出し、結果の文字列を連結して、別の Get-Random 呼び出しを使用してシャッフルします。
以下の例では、$TokenSet というハッシュテーブルを定義して、大文字(U)、小文字(L)、数字(N)、特殊文字(S)の文字セットを保存します。このコード行 $variablename = Get-Random -Count 5 -InputObject $TokenSet.U は、文字セット(U、L、N、S)から 5 文字をランダムに選択し、変数($Upper、$Lower、$Number、$Special)に格納します。
次に、各セットからランダムに選択された文字を組み合わせて $StringSet という単一の文字セットを作ります。最後に、$StringSet から 15 文字のランダムな文字列を生成し、それらを結合して最終的なパスワードを形成します。
コード例:
$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
上記のコードは毎回異なる文字列を生成します。ただし、Get-Random cmdlet への複数回の呼び出しが含まれているため、スクリプトが長くなり、処理時間が遅くなる可能性があります。
次のセクションでは、わずか数行のコードで同じ機能を実現する方法について説明します。
PowerShell でランダムなパスワードを生成するために GeneratePassword() 関数を使用する
パスワード特有の文字列を作成する必要がある場合は、[System.Web.Security] 名前空間から GeneratePassword() 関数を使用できます。この関数を使用するには、最初に System.Web ライブラリを読み込む必要があります。
[Reflection.Assembly]::LoadWithPartialName("System.Web")
読み込まれたら、GeneratePassword() 関数を実行して、ランダムにパスワードを生成できます。
以下のコードでは、[System.Web.Security.Membership] 名前空間を使用して GeneratePassword() 関数にアクセスします。
コード例:
[System.Web.Security.Membership]::GeneratePassword(15, 2)
出力:
QQjj*LJ:e=YZ)Fo
上記の例のコードから分かるように、GeneratePassword() 関数は 2つの引数を受け取ります。
-
最初の引数は、パスワードに必要な合計文字数を表す整数値を受け取ります。
-
2 番目の引数は、パスワードに必要な特殊文字の数を表す整数値を受け取ります。
ただし、このコードでは、パスワードに少なくとも 1つの数字が含まれることが保証されません。少なくとも 1つの数字が存在することを確保するためには、次のコードを使用できます。
コード例:
do {
$pwd = [System.Web.Security.Membership]::GeneratePassword(15, 2)
} until ($pwd -match '\d')
$pwd
まず、do キーワードを使用してループを作成し、少なくとも 1つの数字を含むパスワードを生成します。次に、2つの特殊文字を含む 15 文字のランダムパスワードを生成するために、このコード行 [System.Web.Security.Membership]::GeneratePassword(15, 2) を使用し、結果を $pwd 変数に格納します。
生成されたパスワードが少なくとも 1つの数字を含むまで、ループは繰り返されます。
出力:
Y4UkK4)G+lannRd
わずか数行のコードで、上記の出力は毎回異なる文字列を生成し、生成された文字列に少なくとも 1つの数字が含まれることを確保します。
PowerShell でランダムな文字列を生成するために New-Guid Cmdlet を使用する
PowerShell はランダムな GUID(Globally Unique Identifier)を生成するために New-Guid cmdlet を提供しています。これらの GUID をパスワードを含むさまざまな目的でランダムな文字列として使用することができます。
次の例では、[System.Guid]::NewGuid() を使用してランダムな GUID(Globally Unique Identifier)を生成し、生成された GUID を文字列表現に変換して $randomString 変数に格納します。
コード例:
$randomString = [System.Guid]::NewGuid().ToString()
$randomString
出力:
de5881dc-a546-43da-9b89-0bae712406b1
出力はランダムな文字列を生成します。
PowerShell で文字セットと Get-Random Cmdlet を使用してランダムな文字列を生成する
カスタム文字セットを定義し、Get-Random cmdlet を使用してランダムな文字列を生成することもできます。この方法では、ランダムな文字列に使用される文字セットをより制御できます。
例を示します。
コード例:
$length = 10
$characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'.ToCharArray()
$randomString = -join ($characters | Get-Random -Count $length)
$randomString
まず、ランダムな文字列の希望の長さを定義し、それを変数 $length に格納します。
次に、ランダムな文字列が生成される文字($characters)を文字の配列として定義します。.ToCharArray() メソッドは、文字列をその個々の文字の配列に変換します。
次に、指定された長さの文字列($randomString)を作成し、文字配列からランダムに選択した文字を結合して最終的なランダムな文字列を形成します。最後に、生成されたランダムな文字列を出力します。
出力:
9lQSruF40i
出力は $characters 内の文字を選択してランダムな文字列を生成します。
結論
この記事では、パスワードのユニークな管理やその他のタスクに対応するための PowerShell でのランダムな文字列を生成するためのさまざまな方法を提供します。
Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.
LinkedIn