PowerShell - Password Generator - How to always include number in string?

前端 未结 8 1613
长情又很酷
长情又很酷 2020-12-19 06:17

I have the following PowerShell script that creates a random string of 15 digits, for use as an Active Directory password.

The trouble is, this works great most of t

8条回答
  •  春和景丽
    2020-12-19 07:18

    I wrote a secure password generator function in PowerShell, maybe this will be useful to someone.

    Similar to the accepted answer, this script also uses Get-Random (twice), and also regular expression matching to ensure the output is secure. The difference in this script is that the password length can also be randomised.

    (To hard set a password length, just set the MinimumPasswordLength and MaximumPasswordLength values to the the same length.)

    It also allows an easy to edit character set, and also has a regex to ensure a decent password has been generated with all of the following characteristics:

    (?=.*\d) must contain at least one numerical character

    (?=.*[a-z]) must contain at least one lowercase character

    (?=.*[A-Z]) must contain at least one uppercase character

    (?=.*\W) must contain at least one non-word character

    The answer to your question about always including a number in your generated output can be solved by checking the output with a regex match (just use the parts of the regex that you need, based on the explanations above), the example here checks for uppercase, lowercase, and numerical:

    $Regex = "(?=.*\d)(?=.*[a-z])(?=.*[A-Z])"
    
    do {
            $Password = ([string]($AllowedPasswordCharacters |
            Get-Random -Count $PasswordLength) -replace ' ')
        }    until ($Password -cmatch $Regex)
    
    $Password
    

    Here is the full script:

    Function GeneratePassword
    {
        cls
        $MinimumPasswordLength = 12
        $MaximumPasswordLength = 16
        $PasswordLength = Get-Random -InputObject ($MinimumPasswordLength..$MaximumPasswordLength)
        $AllowedPasswordCharacters = [char[]]'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!?@#£$%^&'
        $Regex = "(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*\W)"
    
        do {
                $Password = ([string]($AllowedPasswordCharacters |
                Get-Random -Count $PasswordLength) -replace ' ')
           }    until ($Password -cmatch $Regex)
    
        $Password
    
    }
    
    GeneratePassword
    

提交回复
热议问题