如何检查密码复杂性?
How can I check password complexity?
我正在使用 PowerShell 创建本地用户。我需要从键盘输入:用户名和密码。要获取密码,我可以使用以下方法之一:
$user_details = Get-Credential
或
$pass = Read-Host -assecureString "Please enter your password"
在这两种情况下,我都会得到加密的密码变量System.Security.SecureString
。在这两种情况下,当我尝试创建用户时,
New-LocalUser -Name $username -Password $pass
提示密码不复杂
New-LocalUser : Unable to update the password. The value provided for
the new password does not meet the length, complexity, or history
requirements of the domain."
由于密码是加密的,(System.Security.SecureString)我无从知晓密码的复杂程度。如何强制用户输入符合复杂性规则的密码?
(使用未加密的密码对我来说不是一个好的解决方案)
更新:
在回答了几个与好的解决方案相关但不符合我的安全要求的答案后,我想换句话说:
如何检查已存储在对象中的密码复杂性:
System.Security.SecureString(未解密)
解码 password/securestring...
使用此处的答案:PowerShell - Decode System.Security.SecureString to readable password
然后根据需要检查密码的复杂性,并给用户重新输入密码的机会。
除了 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,您可能想阅读。
通过在 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"
}
使用 Try-Catch 是我处理这个问题的最佳方式。
我读取了密码,尝试执行命令
捕获异常错误,如果密码错误,则重新请求密码
我正在使用 PowerShell 创建本地用户。我需要从键盘输入:用户名和密码。要获取密码,我可以使用以下方法之一:
$user_details = Get-Credential
或
$pass = Read-Host -assecureString "Please enter your password"
在这两种情况下,我都会得到加密的密码变量System.Security.SecureString
。在这两种情况下,当我尝试创建用户时,
New-LocalUser -Name $username -Password $pass
提示密码不复杂
New-LocalUser : Unable to update the password. The value provided for the new password does not meet the length, complexity, or history requirements of the domain."
由于密码是加密的,(System.Security.SecureString)我无从知晓密码的复杂程度。如何强制用户输入符合复杂性规则的密码?
(使用未加密的密码对我来说不是一个好的解决方案)
更新: 在回答了几个与好的解决方案相关但不符合我的安全要求的答案后,我想换句话说:
如何检查已存储在对象中的密码复杂性: System.Security.SecureString(未解密)
解码 password/securestring...
使用此处的答案:PowerShell - Decode System.Security.SecureString to readable password
然后根据需要检查密码的复杂性,并给用户重新输入密码的机会。
除了 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,您可能想阅读。
通过在 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"
}
使用 Try-Catch 是我处理这个问题的最佳方式。
我读取了密码,尝试执行命令
捕获异常错误,如果密码错误,则重新请求密码