2016-05-16 43 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