Заметки о Windows и других программных продуктах Microsoft...

Генерация пароля заданной длины и сложности с помощью PowerShell

Генерация пароля заданной длины и сложности с помощью PowerShell

Если необходимо сбросить пароли или создать большое количество новых пользователей, это легко можно сделать с помощью Powershell. Cегодня мы рассмотрим 3 способа создания паролей в PowerShell.

— Простой генератор паролей, выдающий произвольный пароль заданной длины;
— Генератор паролей с предопределенным набором символов;
— Генератор паролей, позволяющий задать количество прописных, строчных, числовых и специальных символов.

Простой генератор паролей

Самый простой вариант, с использованием встроенного генератора паролей. В этом варианте используем метод  GeneratePassword класса System.Web.Security.Membership:

function Get-Password {
param (
[Parameter(Mandatory)]
[int] $length, #password length
[int] $special = 1 #special
)
Add-Type -AssemblyName 'System.Web';
$password = [System.Web.Security.Membership]::GeneratePassword($length, $special);
return $password;
}

В итоге получаем произвольный пароль заданной длины. Но методу GeneratePassword можно передать только 2 аргумента — длину и минимальное количество нестандартных символов. В ситуации, когда есть жесткие требования к сложности пароля (например парольная политика AD) этот способ может не подойти.

простой генератор паролей

Генератор паролей с предопределенным набором символов

Здесь мы используем класс RandomNumberGenerator, который реализует криптографический генератор случайных чисел. Пароль будем создавать с помощью метода Create:

function Get-Password {
param (
[Parameter(Mandatory)]
[int] $length #password length
)

#password charset
$charSet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789{]+-[*=@:)}$^%;(_!&#?>/|.'.ToCharArray();

#generate password
$rng = [System.Security.Cryptography.RandomNumberGenerator]::Create();
$bytes = New-Object byte[]($length);
$rng.GetBytes($bytes);
$result = New-Object char[]($length);

for ($i = 0 ; $i -lt $length ; $i++) {
$result[$i] = $charSet[$bytes[$i]%$charSet.Length];
}
return (-join $result);
}

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

генератор паролей с предопределенным набором символов

Генератор паролей с контролируемыми параметрами

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

function Get-Password {
param (
[Parameter(Mandatory)]
[ValidateRange(4,[int]::MaxValue)]
[int] $length, #length
[int] $upper = 1, #number of uppercase
[int] $lower = 1, #number of lowercase
[int] $numeric = 1, #number of numeric
[int] $special = 1 #number of special
)
if($upper + $lower + $numeric + $special -gt $length) {
throw "number of upper/lower/numeric/special char must be lower or equal to length";
}
# password charset
$uCharSet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; #uppercase
$lCharSet = "abcdefghijklmnopqrstuvwxyz"; #lowercase
$nCharSet = "0123456789"; #numeric
$sCharSet = "/*-+,!?=()@;:._"; #special
$charSet = "";
if($upper -gt 0) { $charSet += $uCharSet }
if($lower -gt 0) { $charSet += $lCharSet }
if($numeric -gt 0) { $charSet += $nCharSet }
if($special -gt 0) { $charSet += $sCharSet }

#pasword generate
$charSet = $charSet.ToCharArray();
$rng = [System.Security.Cryptography.RandomNumberGenerator]::Create();
$bytes = New-Object byte[]($length);
$rng.GetBytes($bytes);

$result = New-Object char[]($length);
for ($i = 0 ; $i -lt $length ; $i++) {
$result[$i] = $charSet[$bytes[$i] % $charSet.Length]
}
$password = (-join $result);

# pasword validation
$valid = $true;
if($upper -gt ($password.ToCharArray() | Where-Object {$_ -cin $uCharSet.ToCharArray() }).Count) { $valid = $false }
if($lower -gt ($password.ToCharArray() | Where-Object {$_ -cin $lCharSet.ToCharArray() }).Count) { $valid = $false }
if($numeric -gt ($password.ToCharArray() | Where-Object {$_ -cin $nCharSet.ToCharArray() }).Count) { $valid = $false }
if($special -gt ($password.ToCharArray() | Where-Object {$_ -cin $sCharSet.ToCharArray() }).Count) { $valid = $false }

if(!$valid) {
$password = Get-Password $length $upper $lower $numeric $special;
}
return $password;
}

Вот теперь мы можем полностью контролировать генерируемый пароль, например исключить из него спецсимволы, или использовать только буквы в нижнем регистре.

генератор паролей с контролируемыми параметрами

 
 
Комментарии

Пока нет комментариев.

Ответить