PowerShell - 密码生成器 - 如何始终在字符串中包含数字?

haz*_*434 7 passwords powershell generator

我有以下PowerShell脚本,它创建一个15位的随机字符串,用作Active Directory密码.

问题是,这在大多数情况下都很有用,但在某些情况下它不使用数字或符号.我刚收到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"
Run Code Online (Sandbox Code Playgroud)

如何修改脚本以至少始终包含一个随机数字或符号?

谢谢.

Mar*_*ndl 17

您可以调用Get-Random cmdlet三次,每次使用不同的input参数(punc,digit和letters),连接结果字符串并使用另一个Get-Random调用对它们进行洗牌:

 (Get-Random -Count 15 -InputObject ([char[]]$yourPassword)) -join ''
Run Code Online (Sandbox Code Playgroud)

但是,你为什么要重新发明轮子?考虑使用以下GeneratePassword函数:

[Reflection.Assembly]::LoadWithPartialName("System.Web")
[System.Web.Security.Membership]::GeneratePassword(15,2)
Run Code Online (Sandbox Code Playgroud)

并且为了确保它至少包含一个随机数(您已经指定了符号数):

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

  • `[System.Web.Security]` 不在我的机器上。我该怎么办?此外,不推荐使用`LoadWithPartialName`。改用`[System.Reflection.Assembly]::Load()` (2认同)

iRo*_*Ron 10

正如jisaak所建议的那样,没有100%保证Membership.GeneratePassword方法生成满足AD复杂性要求的密码.

这就是我重新发明轮子的原因:

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[]]'0123456789'                                                #Numerals
        S = [Char[]]'!"#$%&''()*+,-./:;<=>?@[\]^_`{|}~'                         #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)"
Run Code Online (Sandbox Code Playgroud)

用法:

  • Size参数定义密码的长度.
  • CharSets参数定义的复杂性,其中的字符U, L,NS代表大写,小写,数字和符号.如果用小写提供的(u,l,ns)返回的字符串 可能包含任何字符的有关字符集,如果大写供应(U,L,NS)返回的字符串 包含有关字符集的字符的至少一个.
  • Exclude参数允许您排除可能导致混淆的特定字符,如字母数字O和数字0(零).

例子:

要创建长度为8个字符的密码,该密码可能包含任何大写字符,小写字符和数字:

Create-Password 8 uln
Run Code Online (Sandbox Code Playgroud)

要创建长度为12个字符的密码,该密码至少包含一个大写字符,一个小写字符,一个数字和一个符号,并且不包含字符OLIoli01:

Create-Password 12 ULNS "OLIoli01"
Run Code Online (Sandbox Code Playgroud)

有关最新Create-Password版本,请参阅:https://powersnippets.com/create-password/