Я пытаюсь создать пароль из 10 символов, который включает в себя сочетание цифр, букв (прописных и строчных) и символов.

Ниже приведен скрипт, который я использую в функции:

Function Get-TempPassword {

$TempPassword = $null

$ascii = $NULL;For ($a = 33;$a –le 126;$a++) {$ascii +=, ([char][byte]$a | Where-Object {$_ -notin "'",'`','|','_',"`;",'"',','})}

Do {$TempPassword += $ascii | Get-Random; $loop++}

Until ($loop -eq 11)

return $TempPassword

}

Если я удалю следующий раздел:

| Where-Object {$ _ -notin "'",' `',' | ',' _ ',"; ",'" ',', '}

Создание пароля работает нормально, хотя и включает символы, которые я не хочу включать.

Наличие функции Where-Object заставляет функцию Get-Random использовать только первые 5 символов в массиве, и поэтому я не получаю букв любого типа, ни цифр, ни каких-либо других символов.

Я обнаружил, что если я использую $ascii[26] (являющийся 25-м символом в массиве), я получаю нулевое значение, однако я бы подумал, что это позволит использовать любой символ вплоть до этого символа или вообще ни одного, не только первый 5. 25-й персонаж просто так; (значение ASCII № 59). Я попытался добавить символ в исключение Where-Object, и он был удален из массива, но 25-й символ по-прежнему отображался как нулевое значение.

Я выполнил обратный поиск значения ascii [int[]][char[]] каждого символа по обе стороны от; появится символ, и он вернет значения 58 и 60, что заставило меня поверить, что это значение 59 является оскорбительным, но символ на этом этапе должен был быть исключен.

Добавление символов в список исключений 'where-object' должно привести к их удалению из массива, и, по-видимому, при выполнении $ascii.Count отображается 49 символов, независимо от того, добавляю я или удаляю символы в список исключений Where-Object ,

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

Любая помощь приветствуется.

1
Random206 1 Мар 2018 в 07:53

5 ответов

Лучший ответ

Использование следующего скрипта, похоже, сработало именно так, как я хочу.

Я удалил запятую (,) после + = в этой строке:

$ascii = $NULL;For ($a = 33;$a –le 126;$a++) {$ascii +=, ([char][byte]$a | Where-Object {$_ -notin "'",'`','|','_',";",'"',','})}

Я создал пустой массив перед добавлением массива в: $ascii = @()

Полный блок кода ниже:

Function Get-TempPassword {

    $TempPassword = $null

    $ascii = @()
    For ($a = 33;$a –le 126; $a++) { $ascii += ([char][byte]$a | Where-Object { $_ -notin "'",'`','|','_',";",'"',',' }) }

    Do {$TempPassword += $ascii | Get-Random; $loop++}

    Until ($loop -eq 11)

    return $TempPassword
}
0
Random206 1 Мар 2018 в 05:18

Я не писал этого, и я не могу вспомнить, где я его получил, но я встроил это в любые сценарии для создания случайных безопасных паролей Windows, вы можете указать длину пароля, возвращаемого параметром [int]$PasswordLength (я уже установили его на 10).

function New-SWRandomPassword {
    [CmdletBinding(DefaultParameterSetName='FixedLength',ConfirmImpact='None')]
    [OutputType([String])]
    Param
    (
        # Specifies minimum password length
        [Parameter(Mandatory=$false,
                   ParameterSetName='RandomLength')]
        [ValidateScript({$_ -gt 0})]
        [Alias('Min')] 
        [int]$MinPasswordLength = 8,

        # Specifies maximum password length
        [Parameter(Mandatory=$false,
                   ParameterSetName='RandomLength')]
        [ValidateScript({
                if($_ -ge $MinPasswordLength){$true}
                else{Throw 'Max value cannot be lesser than min value.'}})]
        [Alias('Max')]
        [int]$MaxPasswordLength = 11,

        # Specifies a fixed password length
        [Parameter(Mandatory=$false,
                   ParameterSetName='FixedLength')]
        [ValidateRange(1,2147483647)]
        [int]$PasswordLength = 10,

        # Specifies an array of strings containing charactergroups from which the password will be generated.
        # At least one char from each group (string) will be used.
        [String[]]$InputStrings = @('abcdefghijkmnpqrstuvwxyz', 'ABCEFGHJKLMNPQRSTUVWXYZ', '23456789', '!"#%&'),

        # Specifies a string containing a character group from which the first character in the password will be generated.
        # Useful for systems which requires first char in password to be alphabetic.
        [String] $FirstChar,

        # Specifies number of passwords to generate.
        [ValidateRange(1,2147483647)]
        [int]$Count = 1
    )
    Begin {
        Function Get-Seed{
            # Generate a seed for randomization
            $RandomBytes = New-Object -TypeName 'System.Byte[]' 4
            $Random = New-Object -TypeName 'System.Security.Cryptography.RNGCryptoServiceProvider'
            $Random.GetBytes($RandomBytes)
            [BitConverter]::ToUInt32($RandomBytes, 0)
        }
    }
    Process {
        For($iteration = 1;$iteration -le $Count; $iteration++){
            $Password = @{}
            # Create char arrays containing groups of possible chars
            [char[][]]$CharGroups = $InputStrings

            # Create char array containing all chars
            $AllChars = $CharGroups | ForEach-Object {[Char[]]$_}

            # Set password length
            if($PSCmdlet.ParameterSetName -eq 'RandomLength')
            {
                if($MinPasswordLength -eq $MaxPasswordLength) {
                    # If password length is set, use set length
                    $PasswordLength = $MinPasswordLength
                }
                else {
                    # Otherwise randomize password length
                    $PasswordLength = ((Get-Seed) % ($MaxPasswordLength + 1 - $MinPasswordLength)) + $MinPasswordLength
                }
            }

            # If FirstChar is defined, randomize first char in password from that string.
            if($PSBoundParameters.ContainsKey('FirstChar')){
                $Password.Add(0,$FirstChar[((Get-Seed) % $FirstChar.Length)])
            }
            # Randomize one char from each group
            Foreach($Group in $CharGroups) {
                if($Password.Count -lt $PasswordLength) {
                    $Index = Get-Seed
                    While ($Password.ContainsKey($Index)){
                        $Index = Get-Seed                        
                    }
                    $Password.Add($Index,$Group[((Get-Seed) % $Group.Count)])
                }
            }

            # Fill out with chars from $AllChars
            for($i=$Password.Count;$i -lt $PasswordLength;$i++) {
                $Index = Get-Seed
                While ($Password.ContainsKey($Index)){
                    $Index = Get-Seed                        
                }
                $Password.Add($Index,$AllChars[((Get-Seed) % $AllChars.Count)])
            }
            Return $(-join ($Password.GetEnumerator() | Sort-Object -Property Name | Select-Object -ExpandProperty Value))
        }
    }
}

New-SWRandomPassword

РЕДАКТИРОВАТЬ:::

https://gallery.technet.microsoft.com/scriptcenter/Generate-a-random-and-5c879ed5

Сценарий можно найти здесь.

1
Owain Esau 1 Мар 2018 в 05:55

Короткая версия (лучший метод для меня):

$possible=36..38 + 40..43 + 45..58 + 60..94 + 97..123 + 125..126 + 33
(get-random -count 10 -input $possible | % {[char]$_}) -join ''
1
Esperento57 1 Мар 2018 в 06:17

Попробуйте что-то вроде этого:

Function random-password ($length = 10)
{
  $possible=36..38 + 40..43 + 45..58 + 60..94 + 97..123 + 125..126  + 33

  $password = get-random -count $length -input $possible |
            % -begin { $aa = $null } -process {$aa += [char]$_} -end {$aa}

  return $password
}

random-password
0
Esperento57 1 Мар 2018 в 06:14

Я исправил свои другие предложения, но я предлагаю другой метод :)

Function random-password2 ($length = 10)
{

$Assembly = Add-Type -AssemblyName System.Web
$password = [System.Web.Security.Membership]::GeneratePassword(50, 2)

$possible=36..38 + 40..43 + 45..58 + 60..94 + 97..123 + 125..126 + 33    
$newchar=[char](get-random -count 1 -input $possible)
$password=$password -replace "[`'|_;,]",  $newchar
$password.Substring(0, $length)


}

random-password2
0
Esperento57 1 Мар 2018 в 06:15