Así que estoy tratando de hacer que una variable coincida con los requisitos de contraseña para hacer una máquina virtual en CLI azul

Para hacer esto debe tener 3 de los siguientes! mayúsculas, 1 minúscula 1 carácter especial o un número

Este es el código principal que estoy tratando de cambiar.

$AdminPassword = Read-Host -Prompt "Please insert a Admin Password (Password must have 3 of the following: 1 lower case character, 1 upper case character, 1 number and 1 special character)"

Este es el código que cambié pero no funciona correctamente

do 
    {
        $AdminPassword = Read-Host -Prompt "Please insert a Admin Password (Password must have the 3 of the following: 1 lower case character, 1 upper case character, 1 number and 1 special character)"
    }
    until($AdminPassword -Like "[A-Z][A-Z][A-Z][a-z][a-z][a-z][0-9][0-9][0-9][!@$#$%^&*()_+\-=\[\]{};'':"\\|,.<>\/? ][!@$#$%^&*()_+\-=\[\]{};'':"\\|,.<>\/? ][!@$#$%^&*()_+\-=\[\]{};'':"\\|,.<>\/? ]")
    Write Match

Con la línea de coincidencia de escritura sé cuando tiene éxito

El verdadero problema que tengo aquí es que quiero los 4 requisitos 3 veces, por lo que 3 mayúsculas, 3 minúsculas, etc. y también quiero tener los personajes especiales pero el # comenta todo el código que sigue así

Gracias de antemano por leer esto y publicar su respuesta !!!

0
Brynn 16 oct. 2018 a las 16:59

2 respuestas

La mejor respuesta

No estoy seguro de si esto se puede hacer con una sola expresión regular. Como alternativa, debajo de una pequeña función auxiliar para hacer las pruebas.

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)
}

do {
    $AdminPassword = 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)"
} until (Test-AdminPassword $AdminPassword)
3
Theo 17 oct. 2018 a las 09:37

Para los caracteres especiales, la expresión regular debe ser la del código siguiente.

Debe usar comillas simples para su expresión regular:

do
{
$s=Read-Host -Prompt "please enter a password"
}
until($s -like '[A-Z][A-Z][A-Z][a-z][a-z][a-z][0-9][0-9][0-9][!@$#$%^&*()_+\-\=`[`]{};'':`"\\|,.<>\/? ][!@$#$%^&*()_+\-\=`[`]{};'':`"\\|,.<>\/? ][!@$#$%^&*()_+\-\=`[`]{};'':`"\\|,.<>\/? ]')

write-host "complete entering password"

Resultado de la prueba de la siguiente manera: ingrese la descripción de la imagen aquí

1
Ivan Yang 16 oct. 2018 a las 15:51