Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Ограничить количество цифр в генераторе паролей (http://forum.oszone.net/showthread.php?t=349113)

Uragan66 30-06-2021 13:42 2961183

Ограничить количество цифр в генераторе паролей
 
Добрый день всем!
Есть отличная функция - генератор паролей, со всеми необходимыми настойками.
Описание от автора (ник iRon) :
PHP код:

Параметр Size определяет длину пароля.
    
Параметр CharSets определяет сложность в которой символ U LN и S обозначает ПрописныеСтрочные буквыЦифры и СимволыЕсли указано в нижнем регистре n или s ) , возвращаемая строка может содержать любой символ в соответствующем наборе символовесли он указан в верхнем регистре N или S), возвращаемая строка будет содержать по крайней мере один из символов в соответствующем наборе символов.
    
Параметр Exclude позволяет исключить определенные символыкоторые могутнапример привести к путаниценапримербуквенно-цифровой O и числовой 0 (ноль).

Примеры:

Чтобы создать пароль длиной 8 символовкоторый может содержать любые прописныестрочные и цифры:

Create-Password 8 uln

Чтобы создать пароль длиной 12 символов
который содержит по крайней мере один символ верхнего регистраодин символ нижнего регистраодно число и один символ и не содержит символов OLIoli01:

Create-Password 12 ULNS "OLIoli01" 

Функция:
Код:

Function MakeUp-String([Int]$Size = 8, [Char[]]$CharSets = "ULNS", [Char[]]$Exclude) {
    $Chars = @(); $TokenSet = @()
    If (!$TokenSets) {$Global:TokenSets = @{
        U = [Char[]]'ABCDEFGHIJKLMNOPQRSTUVWXYZ'                                #Upper case
        L = [Char[]]'abcdefghijklmnopqrstuvwxyz'                                #Lower case
        N = [Char[]]'0123456789'                                                #Numerals
        S = [Char[]]'!"#$%&''()*+,-./:;<=>?@[\]^_`{|}~'                        #Symbols
    }}
    $CharSets | ForEach {
        $Tokens = $TokenSets."$_" | ForEach {If ($Exclude -cNotContains $_) {$_}}
        If ($Tokens) {
            $TokensSet += $Tokens
            If ($_ -cle [Char]"Z") {$Chars += $Tokens | Get-Random}            #Character sets defined in upper case are mandatory
        }
    }
    While ($Chars.Count -lt $Size) {$Chars += $TokensSet | Get-Random}
    ($Chars | Sort-Object {Get-Random}) -Join ""                                #Mix the (mandatory) characters and output string
}; Set-Alias Create-Password MakeUp-String -Description "Generate a random string (password)"

Всё устраивает отлично. Но хотелось бы как-то ограничить количество цифр в пароле. А ещё лучше установить их минимальное и максимальное количество.
Может кто подскажет, как правильно это прописать, в самой функции или при её вызове ?
Заранее благодарен за советы и подсказки!

Foreigner 30-06-2021 16:42 2961206

Цитата:

Цитата Uragan66
Есть отличная функция »

Похожая на велосипед. К чему это, когда есть штатные методы?
Код:

Get-Help Get-Random
Код:

$pass = (Get-Random (('a'..'z') + (0..9)) -Count 5)[0..4] -join ''
$pass
#Если до сих пор не pwsh:
$pass =  Get-Random ([char[]]('a'..'z') + (0..9)) -Count 5)[0..4] -join ''
$pass

Cоответственно выборку можно помножить на колличество элементов в "пароле", чтобы было возможно например "aaaaa"

Uragan66 30-06-2021 17:11 2961209

Цитата:

Цитата Foreigner
К чему это, когда есть штатные методы? »

Похожей функцией давно пользуюсь... Но, в функции MakeUp-String есть то, чего не хватает штатным методам. Например, исключение определённых символов из пароля.
Вот и хотелось бы добавить в неё ещё и возможность регулирования количества цифр.

Foreigner 30-06-2021 18:43 2961214

Цитата:

Цитата Uragan66
исключение определённых символов из пароля. »

Ну так и берите только нужные символы:
Код:

(get-random ((('a','b','c') + (0..9)) * 10) -Count 5) -join ''

greg zakharov 30-06-2021 19:28 2961216

Uragan66, например:
Код:

function Get-RandomPass {
  [CmdletBinding()]
  param(
    [Parameter()][Byte]$Length = 8, # немного сэкономим на памяти
    [Parameter()][ValidateSet('U', 'L', 'N', 'S')][Alias('c')]
    [Char[]]$CharSets = 'ULNS',
    [Parameter()][Byte]$NumLimit = 3
  )

  end {
    if ($NumLimit -ge $Length) {
      throw [InvalidOperationException]::new('Вне массива.')
    }

    $arr = [Linq.Enumerable]::SelectMany(
      [Object[]]@{U='A'..'Z';L='a'..'z';N=( # сразу ограничиваем количество цифр
          Get-Random ('0'..'9') -Count $NumLimit
        );S=('!'..'z').Where{$_ -notmatch '[0-9a-z]'}
      }[[String[]]$CharSets], [Func[Object, [Object[]]]]{$args[0]}
    ).ToArray()
    -join (Get-Random (( # просто перемешиваем полученный массив
      Get-Random $arr[0..($arr.Length - $NumLimit - 1)] -Count ($Length - $NumLimit)
    ) + $arr[($NumLimit * -1)..-1]) -Shuffle)
  }
}

Пример использования:
Код:

Get-RandomPass -c lsn
Прочую мишуру навесите сами.

Uragan66 02-07-2021 14:51 2961294

Цитата:

Цитата Foreigner
Ну так и берите только нужные символы »

Foreigner, спасибо! Можно конечно и так... Но для генератора планируется GUI и, согласитесь, проще перечислить ненужные символы в пароле, чем прописывать все необходимые... Да и другие мелкие нюансы есть.
greg zakharov, спасибо, код хороший, но не получается запустить его ни на версии PS 5.1, на на 7.0.

greg zakharov 02-07-2021 18:12 2961318

Цитата:

Цитата Uragan66
не получается запустить его ни на версии PS 5.1, на на 7.0


В пятой же версии и не должно работать.

Uragan66 02-07-2021 19:43 2961320

greg zakharov, но ведь я не виню Вас, в том, что у меня не запускается... Наоборот, спасибо, что подсказываете.
Но и на версии 7.0 у меня ошибка:



Время: 03:52.

Время: 03:52.
© OSzone.net 2001-