【问题标题】:Is there any way to check if password is compliant for a standard user account as per gpo settings via powershell有没有办法通过powershell根据gpo设置检查密码是否符合标准用户帐户
【发布时间】:2021-02-11 14:36:22
【问题描述】:

我担心的是我无法将用户的密码存储在任何地方。用户输入密码后,我想验证它是否符合该机器上的密码策略设置。

  • 我遇到了 net 命令来检索相关信息,但 net 不适用于标准用户。

  • 标准用户无法在该计算机上创建另一个用户帐户 - 因此,我无法使用该帐户创建另一个具有相同密码的用户来检查密码合规性。

  • 还尝试使用相同的密码更改标准用户的密码,目的是如果它不合规,我会收到密码不合规错误。但它会弄乱密码历史记录。

有什么方法可以让我通过 powershell 简单地检查密码是否符合标准用户而不执行任何写入操作?

【问题讨论】:

    标签: windows powershell passwords gpo non-admin


    【解决方案1】:

    也许这个实用功能可以帮助你:

    function Test-PasswordForDomain {
        [CmdletBinding()]
        Param (
            [Parameter(Mandatory = $true, Position = 0)]
            [string]$Password,
            
            [Parameter(Mandatory = $false)]
            [string]$AccountSamAccountName = $null,
            
            [Parameter(Mandatory = $false)]
            [string]$AccountDisplayName = $null
        )
        # [Microsoft.ActiveDirectory.Management.ADEntity]
        $PasswordPolicy = Get-ADDefaultDomainPasswordPolicy -ErrorAction SilentlyContinue
    
        If ($Password.Length -lt $PasswordPolicy.MinPasswordLength) {
            Write-Verbose "Password '$Password' is too short. Minimal length is $($PasswordPolicy.MinPasswordLength)"
            return $false
        }
        if (($AccountSamAccountName) -and ($Password -match "$AccountSamAccountName")) {
            Write-Verbose "The password '$Password' includes the users SamAccountName"
            return $false
        }
        if ($AccountDisplayName) {
            # if ANY PART of the display name that is split by the characters below, the password should fail the complexity rules.
            $tokens = $AccountDisplayName.Split(",.-,_ #`t")
            foreach ($token in $tokens) {
                if (($token) -and ($Password -match "$token")) {
                    Write-Verbose "The password '$Password' includes (part of) the users DisplayName"
                    return $false
                }
            }
        }
        if ($PasswordPolicy.ComplexityEnabled -eq $true) {
            # check for presence of 
            # - Uppercase: A through Z, with diacritic marks, Greek and Cyrillic characters
            if ($Password -cnotmatch "[A-Z\p{Lu}\s]") {
                Write-Verbose "The password '$Password' is missing Uppercase characters"
                return $false
            }
            # - Lowercase: a through z, sharp-s, with diacritic marks, Greek and Cyrillic characters
            if ($Password -cnotmatch "[a-z\p{Ll}\s]") {
                Write-Verbose "The password '$Password' is missing Lowercase characters"
                return $false
            }
            # - Base 10 digits (0 through 9)
            if ($Password -notmatch "[\d]") {
                Write-Verbose "The password '$Password' is missing digits (0-9)"
                return $false
            }
            # - Nonalphanumeric characters: ~!@#$%^&*_-+=`|\(){}[]:;”‘<>,.?/
            if ($Password -notmatch "[^\w]") {
                Write-Verbose "The password '$Password' is missing Nonalphanumeric characters: ~!@#$%^&*_-+=`|\(){}[]:;`"'<>,.?/"
                return $false
            }
        }
    
        return $true
    }
    

    【讨论】:

    • 谢谢西奥!我如何处理涉及历史的规则,例如用户不能重复最后 3 个密码?我试着在网上搜索。看起来没有公开的 api。
    • @NeetuSoni 我还没有找到任何东西来检查密码是否已被使用以及是否可以再次使用。此功能用于检查密码复杂性本身。是否允许重复使用是“反复试验”
    • 至于How do I handle rules where history is involved e.g. user can't repeat last 3 passwords。您是在使用 Theo 的有用答案时说,还是从 ADDS 本身说的?如果是后者,那么同上西奥所说的。为什么,因为在 ADDS 中,密码存储为散列,而不是纯文本,因此必须获取并转储所有散列并进行处理。但是,如果是前者,只需捕获数组中的条目,然后在每次尝试时检查。
    • @postanote 我使用的不是 Azure Active Directory,而是本地用户帐户。但是西奥的建议给了我一个关于可能解决方案的提示。密码历史是唯一未知的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多