根据我在这里和互联网上的发现,我对在 PowerShell 中生成密码的看法:
#Requires -Version 4.0
[CmdletBinding(PositionalBinding=$false)]
param (
[Parameter(
Mandatory = $false,
HelpMessage = "Minimum password length"
)]
[ValidateRange(1,[int]::MaxValue)]
[int]$MinimumLength = 24,
[Parameter(
Mandatory = $false,
HelpMessage = "Maximum password length"
)]
[ValidateRange(1,[int]::MaxValue)]
[int]$MaximumLength = 42,
[Parameter(
Mandatory = $false,
HelpMessage = "Characters which can be used in the password"
)]
[ValidateNotNullOrEmpty()]
[string]$Characters = '1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM@#%*-_+:,.'
)
(1..(Get-Random -Minimum $MinimumLength -Maximum $MaximumLength) `
| %{ `
$Characters.GetEnumerator() | Get-Random `
}) -join ''
我更喜欢使用 System.Web,而不是引入依赖项,这可能会随着 .Net / .Net Core 版本而改变。
我的变体还允许随机密码长度(在指定范围内),相当简洁(除了非常冗长的参数部分,以强制执行一些验证并提供默认值)并允许字符重复(与问题中的代码相反,它从不重复相同的字符)。
我了解,这并不能保证密码中有数字。然而,这可以通过不同的方式来解决。例如。正如建议的那样,重复生成直到密码符合要求(包含一个数字)。我的看法是:
- 生成随机密码。
- 如果它不包含数字(或总是):
- 使用随机函数获取 1 个随机数字。
- 将其添加到随机密码中。
- 随机化结果的顺序(因此数字不一定总是在末尾)。
假设上述脚本将被命名为“Get-RandomPassword.ps1”,它可能如下所示:
$pass = .\Get-RandomPassword.ps1
$pass += (0..9 | Get-Random)
$pass = (($pass.GetEnumerator() | Get-Random -Count $pass.Length) -join '')
Write-Output $pass
这可以推广,使用任何字符类别强制执行:
$sets = @('abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', '0123456789', '()-_=+[{]};:''",<.>/?`~')
$pass = .\Get-RandomPassword.ps1 -Characters ($sets -join '')
foreach ($set in $sets) {
$pass += ($set.GetEnumerator() | Get-Random)
}
$pass = (($pass.GetEnumerator() | Get-Random -Count $pass.Length) -join '')
Write-Output $pass