如何检查密码复杂性?

问题描述 投票:1回答:4

我正在使用PowerShell创建本地用户。我需要从键盘输入:用户名和密码。要获取密码,我可以使用以下其中一项:

$user_details = Get-Credential

要么

$pass = Read-Host -assecureString "Please enter your password"

在这两种情况下,我将获得加密密码变量System.Security.SecureString。在这两种情况下,当我尝试创建用户时,使用

New-LocalUser -Name $username -Password $pass

我收到一个错误,密码并不复杂。

New-LocalUser:无法更新密码。为新密码提供的值不符合域的长度,复杂性或历史记录要求。“

由于密码是加密的,(System.Security.SecureString)我无法知道密码的复杂性。如何强制用户键入符合复杂性规则的密码?

(使用未加密的密码对我来说不是一个好的解决方案)

更新:在几个与好的解决方案相关的答案,但不符合我的安全要求之后,我想改写一下:

如何检查已存储在对象中的密码复杂性:System.Security.SecureString(无解密)

powershell credentials password-encryption powershell-v5.0 windows-server-2016
4个回答
1
投票

除了TheIncorrigible1和KoryGill已经回答的内容以及包含错误消息之外,为新密码提供的值不符合域的长度,复杂性或历史记录要求,您可以包括对默认密码复杂性的测试。

如果你做了

Get-ADDefaultDomainPasswordPolicy

你会得到一个像这样的对象:

ComplexityEnabled           : True
DistinguishedName           : DC=yourdomain,DC=com
LockoutDuration             : 00:30:00
LockoutObservationWindow    : 00:30:00
LockoutThreshold            : 3
MaxPasswordAge              : 42.00:00:00
MinPasswordAge              : 1.00:00:00
MinPasswordLength           : 7
objectClass                 : {domainDNS}
objectGuid                  : 44e3c936-5c8f-40cd-af67-f846c184cc8c
PasswordHistoryCount        : 24
ReversibleEncryptionEnabled : False

在此之后,您可以在MinPasswordLength中重复使用密码的天数之后检查有趣的属性,例如PasswordHistoryCount中密码的最小长度。如果ComplexityEnabled为True,则密码还需要混合使用大写,小写,数字和非字母数字字符。

我找到了一篇关于你可能想读的here的优秀博客。


0
投票

解码密码/ securestring ...

请使用此处的答案:PowerShell - Decode System.Security.SecureString to readable password

然后根据您的需要检查密码复杂性,并让用户重新输入密码。


0
投票

通过在Powershell脚本中使用if语句,可以在移动到下一个命令之前验证用户输入。您可以通过以下方式获取所需的密码:

$Input = Read-Host "Please enter your password. `nPassword must meet complexity requirements: 
`nAt least one upper case English letter [A-Z]`nAt least one lower case English letter [a-z]`nAt least one digit [0-9]`nAt least one special character (!,@,#,%,^,&,$)`nMinimum 7 in length."

if(($input -cmatch '[a-z]') -and ($input -cmatch '[A-Z]') -and ($input -match '\d') -and ($input.length -ge 7) -and ($input -match '!|@|#|%|^|&|$'))
{
    Write-Output "$input is valid password"
}
else
{
    Write-Output "$input is Invalid password"
}

0
投票

使用Try-Catch是我处理此问题的最佳方式。 我读了密码,试图执行命令 捕获异常错误,并在密码错误的情况下再次请求密码

© www.soinside.com 2019 - 2024. All rights reserved.