Войти

Показать полную графическую версию : Ограничить количество цифр в генераторе паролей


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

Параметр Size определяет длину пароля.
Параметр CharSets определяет сложность , в которой символ U , L, N и S обозначает Прописные, Строчные буквы, Цифры и Символы. Если указано в нижнем регистре ( u , l , n или s ) , возвращаемая строка может содержать любой символ в соответствующем наборе символов, если он указан в верхнем регистре ( U , L , 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
Есть отличная функция »
Похожая на велосипед. К чему это, когда есть штатные методы?

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
К чему это, когда есть штатные методы? »
Похожей функцией давно пользуюсь... Но, в функции MakeUp-String есть то, чего не хватает штатным методам. Например, исключение определённых символов из пароля.
Вот и хотелось бы добавить в неё ещё и возможность регулирования количества цифр.

Foreigner
30-06-2021, 18:43
исключение определённых символов из пароля. »

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

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

greg zakharov
30-06-2021, 19:28
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
Ну так и берите только нужные символы »
Foreigner, спасибо! Можно конечно и так... Но для генератора планируется GUI и, согласитесь, проще перечислить ненужные символы в пароле, чем прописывать все необходимые... Да и другие мелкие нюансы есть.
greg zakharov, спасибо, код хороший, но не получается запустить его ни на версии PS 5.1, на на 7.0.

greg zakharov
02-07-2021, 18:12
не получается запустить его ни на версии PS 5.1, на на 7.0
https://i.ibb.co/9VYhjTH/screen.png (https://ibb.co/7RyQFWt)
В пятой же версии и не должно работать.

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

http://images.vfl.ru/ii/1625244118/6d0d3fc9/35031383_s.jpg (http://vfl.ru/fotos/6d0d3fc935031383.html)




© OSzone.net 2001-2012