regex - Azure CLI\Powershell 如何排除要求

标签 regex azure powershell azure-cli azure-cli2

作为我上一个问题的延续 This one 。 我得到了这个代码作为答案,但现在我想如何排除一些要求

function Test-AdminPassword {
[CmdletBinding()]
Param(
    [Parameter(Position = 0, Mandatory=$true)]
    [string]$Password,

    [Parameter(Position = 1)]
    [int]$Requirements = 5
)
$result = 0

# test length between 12 and 24
if ($Password.Length -in 12..24) {
    $result++
}
# test uppercase
if (($Password -creplace '[^A-Z]', '').Length -ge 3) {
    $result++
}
# test lowercase
if (($Password -creplace '[^a-z]', '').Length -ge 3) {
    $result++
}
# test digits
if (($Password -replace '[^0-9]', '').Length -ge 3) {
    $result++
}
# test special characters
if (($Password -creplace '[^!@$#%^&*()_+\-=\[\]{};'':"\\|,.<>\/? ]', '').Length -ge 3) {
    $result++
}

# return $true if the password complies with at least $requirements
return ($result -ge $Requirements)
}

我现在的问题是如何编辑它,以便我可以排除特殊字符,因为在管理员用户名中只能使用小写字符

最佳答案

这是我之前的函数的完整重写。 这个使用了更多的参数供您使用,但它可以用于测试管理员用户名,也可以用于测试输入的密码。

function Test-AdminInput {
    [CmdletBinding(DefaultParameterSetName = "ByCase")]
    Param(
        [Parameter(Position = 0, Mandatory=$true)]
        [string]$NameOrPassword,

        # Instead of these default numbers, you can set them all to 0
        # if you like. That way, omitting them from the call will skip the test.
        [int]$MinLength = 12,
        [int]$MaxLength = 24,
        [int]$MinDigits = 3,
        [int]$MinSpecial = 3,

        [Parameter(ParameterSetName = "ByCase")]
        [int]$MinUpperCase = 3,
        [Parameter(ParameterSetName = "ByCase")]
        [int]$MinLowerCase = 3,
        [Parameter(ParameterSetName = "ByCaseRestrict")]
        [ValidateSet ("AllUpperCase","AllLowerCase","Any")]
        [string]$RestrictCase = "Any"
    )
    # test $MinLength
    if ($MinLength -gt 0 -and $NameOrPassword.Length -lt $MinLength) {
        Write-Warning "You need at least $MinLength characters"
        return $false
    }

    # test $MaxLength
    if ($MaxLength -gt 0 -and $NameOrPassword.Length -gt $MaxLength) {
        Write-Warning "You cannot use more than $MaxLength characters"
        return $false
    }

    # test Restricted casing
    if ($PSCmdlet.ParameterSetName -eq "ByCaseRestrict") {
        switch ($RestrictCase) {
            "AllUpperCase" { if ($NameOrPassword.ToUpperInvariant() -cne $NameOrPassword)  { 
                             Write-Warning "You must use upper-case characters only"; return $false } }
            "AllLowerCase" { if ($NameOrPassword.ToLowerInvariant() -cne $NameOrPassword)  { 
                             Write-Warning "You must use lower-case characters only"; return $false } }
        }
    }
    else {
        # test minimum uppercase
        if ($MinUpperCase -gt 0) {
            if (($NameOrPassword -creplace '[^A-Z]', '').Length -lt $MinUpperCase) { 
                Write-Warning "You must use at least $MinUpperCase upper-case characters" 
                return $false
            }
        }
        # test minimum lowercase
        if ($MinLowerCase -gt 0) {
            if (($NameOrPassword -creplace '[^a-z]', '').Length -lt $MinLowerCase) { 
                Write-Warning "You must use at least $MinLowerCase lower-case characters" 
                return $false
            }
        }
    }

    # test digits
    if ($MinDigits -gt 0) {
        if (($NameOrPassword -replace '[^0-9]', '').Length -lt $MinDigits) {
            Write-Warning "You must use at least $MinDigits digits (0-9)" 
            return $false
        }
    }
    # test special characters
    if ($MinSpecial -gt 0) {
        if (($NameOrPassword -creplace '[^!@$#%^&*()_+\-=\[\]{};'':"\\|,.<>\/? ]', '').Length -lt $MinSpecial) {
            Write-Warning "You must use at least $MinSpecial special characters (!@$#%^&*()_+-=[]{};'`":\|,.<>/? )" 
            return $false
        }
    }

    # If you get here, all tests succeeded
    return $true
}

为了测试密码,请像这样使用它:

do {
    $input = Read-Host -Prompt "Please insert an Admin Password (must have the 3 lower case characters, 3 upper case characters, 3 digits and 3 special characters)"
    $result = Test-AdminInput $input -MinLength 12 -MaxLength 24 -MinUpperCase 3 -MinLowerCase 3 -MinDigits 3 -MinSpecial 3
} until ($result)

为了测试用户名,请像这样使用它:

do {
    $input = Read-Host -Prompt "Please insert an Admin User name (must have only lower case characters, 3 digits)"
    $result = Test-AdminInput $input -MinLength 12 -MaxLength 24 -MinDigits 3 -RestrictCase AllLowerCase
} until ($result)

关于regex - Azure CLI\Powershell 如何排除要求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52857058/

相关文章:

regex - 使用 Regex 删除括号和其中的所有内容

java - Java 中的多重模式匹配

c# - 如何使用 Azure 存储队列发送 XML 文件?

powershell - Start-AzureRmAutomationRunbook 不接受 System.String 参数

regex - 删除匹配和上一行

c# - 正则表达式 : replace a string

c# - 从 MS CRM 插件(沙盒)向 Azure 服务总线发送自定义消息

python - 检测虚拟机中的云类型

xml - 将字典转换为正确格式的 xml?

powershell - 替换字符串中的管道字符