Требования к паролю Azure-CLI/Powershell

Итак, я пытаюсь сделать так, чтобы переменная соответствовала требованиям к паролю для создания виртуальной машины в azure CLI.

для этого он должен содержать 3 из следующих !верхних регистров, 1 нижний регистр 1 специальный символ или число

Это основной код, который я пытаюсь изменить

$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)"

Это код, который я изменил, но он работает неправильно

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

с строкой совпадения записи я знаю, когда это удастся

настоящая проблема, с которой я столкнулся, заключается в том, что я хочу, чтобы все 4 требования были выполнены 3 раза, поэтому 3 прописных буквы 3 строчных буквы и т. д., и я также хочу иметь специальные символы, но # комментирует весь следующий код как это

заранее спасибо, что прочитали это и разместили свой ответ!!!


person Brynn    schedule 16.10.2018    source источник
comment
добавлен тег регулярного выражения.   -  person Zair Henrique    schedule 16.10.2018


Ответы (2)


Я не уверен, что это можно сделать с помощью всего одного регулярного выражения. В качестве альтернативы, ниже небольшая вспомогательная функция для выполнения тестов.

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)
person Theo    schedule 16.10.2018
comment
Спасибо за ответ Тео! единственное, что я забыл упомянуть в вопросе, это то, что он должен иметь минимум 12 символов и максимум 24. Возможно, вы также знаете, как получить максимум? - person Brynn; 17.10.2018
comment
@Brynn Я обновил ответ, чтобы проверить длину пароля от 12 до 24 (включительно). Ваше здоровье. - person Theo; 17.10.2018
comment
Большое спасибо Тео! теперь я хотел бы проголосовать дважды! Я ценю время и усилия, которые вы вложили в это, я надеюсь, что у вас будет отличный день сегодня! - person Brynn; 17.10.2018
comment
Короткое обновление: он не работает с максимальной длиной, потому что тогда скрипт просто переходит к следующему шагу :( Попытаюсь найти решение для этого @Theo - person Brynn; 17.10.2018
comment
@ Бринн. Я забыл изменить количество требований. Теперь должно быть [int]$Requirements = 5, потому что мы добавили новый тест. Простите за это.. - person Theo; 17.10.2018
comment
Ах, это имеет смысл! спасибо за быстрый ответ! и это не проблема сделать ошибку, не так ли, @Theo? (по крайней мере, у меня нет проблем с ошибками, потому что вы учитесь на них) - person Brynn; 17.10.2018
comment
возможно, есть способ использовать этот метод, чтобы исключить, например, специальные символы? я также использую этот метод для имени пользователя администратора, и я хотел бы исключить все параметры, кроме нижнего регистра. я уже проверил Google, один из сайтов, которые я посещал, это ссылка, но я не смог найти исключение еще вариант @Theo - person Brynn; 17.10.2018
comment
Что ж, адаптироваться легко, однако было бы лучше, если бы вы разместили для этого новый вопрос, а не расширяли этот. Таким образом, вы можете определить свои точные требования, такие как минимальная/максимальная длина, специальные символы или нет и т. д. - person Theo; 17.10.2018
comment
Спасибо, @Theo, я задал новый вопрос, который продолжает этот вопрос. Вот ссылка к нему - person Brynn; 17.10.2018
comment
Еще раз спасибо, Тео, я только что отметил это как ответ! - person Brynn; 18.10.2018

Для специальных символов регулярное выражение должно быть таким, как в приведенном ниже коде.

Вам нужно использовать одинарную кавычку для вашего регулярного выражения:

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"

Результат теста приведен ниже: введите здесь описание изображения

person Ivan Yang    schedule 16.10.2018
comment
Но это не позволяет использовать AaBbCc1!2@3# или пароли, содержащие больше минимально необходимых символов. - person Theo; 16.10.2018
comment
Привет Иван Спасибо за ответ! к сожалению, я забыл упомянуть, что это минимум символов, который ему нужен, и что я могу иметь более 12 символов, в любом случае, вот голос, потому что ваш ответ также правильный! еще раз большое спасибо за ответ!!! - person Brynn; 17.10.2018