2016-05-16 88 views
2

我有以下PowerShell腳本,它創建一個15位數的隨機字符串,用作Active Directory密碼。PowerShell - 密碼生成器 - 如何始終在字符串中包含數字?

麻煩的是,這在大多數情況下都很有效,但在某些情況下它並不使用數字或符號。我只收到15封信。因此,它不能用作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" 

我該如何修改腳本始終至少有一個隨機數或符號?

謝謝。

回答

5

你可以調用Get-Random cmdlet的三次,每次用不同的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) 

並保證,它包含至少一個隨機數(你已經指定符號數):

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

至於建議的jisaak,沒有100%保證Membership.GeneratePassword Method生成的密碼符合AD 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代表大寫,小寫,數字和符號。 如果用小寫(ulns)返回的字符串 威力包含有關字符集的任何字符的供應,如果在大寫(ULNS)返回的字符串提供 至少包含有關字符 集中的一個字符。
  • Exclude參數允許您排除可能會出現的特定字符 導致混淆,如字母數字O和數字0(零)。

實例:

要創建的8個字符的長度可能包含任何大寫字符,小寫字符和數字的口令:

Create-Password 8 uln 

要與長度創建密碼包含至少一個大寫字符,一個小寫字符,一個數字和一個符號且不包含字符的12個字符OLIoli01:

Create-Password 12 ULNS "OLIoli01" 

有關最新版本Create-Password,請參閱:https://powersnippets.com/create-password/

+0

爲什麼你靜態定義'A-Z'?只要做一個循環,通過ASCII範圍 –

+0

我同意,我可以做一些像'U = 65..90 | %{[Char] $ _}'但我想我沒有這樣做,因爲這些符號不合適,我希望它是一致的。 – iRon

相關問題