2016-05-16 19 views
2

次のPowerShellスクリプトでは、15桁のランダムな文字列を作成し、Active Directoryのパスワードとして使用します。PowerShell - パスワードジェネレータ - 文字列に常に数値を含めるにはどうすればいいですか?

この問題はほとんどの場合非常に効果的ですが、場合によっては数字や記号を使用しないこともあります。私はちょうど15文字を手に入れる。これは、少なくとも1つの番号または記号を含む必要があるため、Active Directoryのパスワードとしては使用できません。

$punc = 46..46 
$digits = 48..57 
$letters = 65..90 + 97..122 
$YouShallNotPass = get-random -count 15 ` 
-input ($punc + $digits + $letters) | 
% -begin { $aa = $null } ` 
-process {$aa += [char]$_} ` 
-end {$aa} 

Write-Host "Password is $YouShallNotPass" 

スクリプトには、少なくとも1つの乱数または記号が常に含まれるように修正するにはどうすればよいですか?

ありがとうございます。

答えて

5

あなたはGet-Randomコマンドレットを3回呼び出すことができ、異なるinputパラメータ(punc、数字や文字)を持つたびに、結果の文字列をCONCAT、別のGet-Random呼び出しを使用してそれらをシャッフル:

(Get-Random -Count 15 -InputObject ([char[]]$yourPassword)) -join '' 

しかし、なぜあなたは車輪を再発明したいですか?次GeneratePassword機能の使用を検討してください:

[Reflection.Assembly]::LoadWithPartialName("System.Web") 
[System.Web.Security.Membership]::GeneratePassword(15,2) 

そして確実にするために、それは少なくとも一つの乱数(すでにシンボルの数を指定します)含まれていますjisaakによって示唆されるように

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

パーフェクト!ありがとうございました。 – haze1434

+0

'[System.Web.Security]'は私のマシンにありません。私は何をしますか?また、 'LoadWithPartialName'は推奨されません。代わりに '[System.Reflection.Assembly] :: Load()'を使用してください –

4

をなしています100%はMembership.GeneratePassword MethodAD complexity requirementsを満たすパスワードを生成することを保証します。

私はホイールを再発明する理由です:

Function MakeUp-String([Int]$Size = 8, [Char[]]$CharSets = "ULNS", [Char[]]$Exclude) { 
    $Chars = @(); $TokenSet = @() 
    If (!$TokenSets) {$Global:TokenSets = @{ 
     U = [Char[]]'ABCDEFGHIJKLMNOPQRSTUVWXYZ'        #Upper case 
     L = [Char[]]'abcdefghijklmnopqrstuvwxyz'        #Lower case 
     N = [Char[]]''            #Numerals 
     S = [Char[]]'!"#$%&''()*+,-./:;<=>[email protected][\]^_`{|}~'       #Symbols 
    }} 
    $CharSets | ForEach { 
     $Tokens = $TokenSets."$_" | ForEach {If ($Exclude -cNotContains $_) {$_}} 
     If ($Tokens) { 
      $TokensSet += $Tokens 
      If ($_ -cle [Char]"Z") {$Chars += $Tokens | Get-Random}    #Character sets defined in upper case are mandatory 
     } 
    } 
    While ($Chars.Count -lt $Size) {$Chars += $TokensSet | Get-Random} 
    ($Chars | Sort-Object {Get-Random}) -Join ""        #Mix the (mandatory) characters and output string 
}; Set-Alias Create-Password MakeUp-String -Description "Generate a random string (password)" 

用途:

  • Sizeパラメータは、パスワードの長さを定義します。
  • CharSetsパラメータは大文字、小文字、数字や記号の文字ULNSスタンド複雑さを定義します。 は大文字(ULNまたはS)返される文字列で指定した場合、小文字(ulnまたはsかもしれないが関係文字セット内の文字のいずれかを含む返される文字列で指定した場合ます は、関係する文字の文字のうちの少なくとも1つを含む。 。
  • Excludeパラメータを使用すると、特定の文字を除外できます。 は、英数字Oと数字0(ゼロ)のような混乱につながります。

例:

任意の大文字、小文字と数字が含まれているかもしれない8文字の長さのパスワードを作成するには、次の長さのパスワードを作成するには

Create-Password 8 uln 

1つの小文字、1つの数字、1つの記号が含まれ、OLIoli01:

という文字は含まれていない
Create-Password 12 ULNS "OLIoli01" 
最新 Create-Passwordバージョンについては

、以下を参照してくださいhttps://powersnippets.com/create-password/

+0

なぜ 'A-Z'を静的に定義していますか? ASCIIの範囲を通過するループを実行してください –

+0

私は同意します。私は 'U = 65..90 | %{[Char] $ _} 'しかし、私はシンボルが順不同であり、一貫性を持たせたいので、これをしなかったと思います。 – iRon

関連する問題