Napisanie skryptu generującego hasło, to jedno z przyjemniejszych zadań programistycznych. Jest for, są iteracje, jest random. Mniam mniam. Dobra funkcja generująca hasło to jednak coś innego! I właśnie taką udało mi się znaleźć. To co w niej jest najlepsze, to że:
- można określić z jakiej grupy znaków należy generować hasła oraz
- masz gwarancję, że z każdej grupy zostanie wzięty co najmniej jeden znak
Pomyśl teraz (przyjaźnie) o swoim administratorze domeny. Czy nie masz wymogu definiowania hasła o określonej długości ze znakami z określonych grup? Funkcja pochodzi z http://stackoverflow.com/questions/37256154/powershell-password-generator-how-to-always-include-number-in-string (odpowiedź opublikowana przez iRon).
Function Get-Password
{
Param(
[cmdletbinding()]
#Length of the password
[Int]$Size = 8,
#Charactersets that can be used when password is generated Uppercase, Lowercase, Numbers, Symbols
[Char[]]$CharSets = "ULNS",
#Characters to skip during password generation
[Char[]]$Exclude)
#Here final password letters will be saved
$Chars = @();
$TokenSet = @()
#define table of allowed character lists
If (!$TokenSets)
{
$TokenSets = @{
U = [Char[]]'ABCDEFGHIJKLMNOPQRSTUVWXYZ' #Upper case
L = [Char[]]'abcdefghijklmnopqrstuvwxyz' #Lower case
N = [Char[]]'0123456789' #Numerals
S = [Char[]]'!"#$%&''()*+,-./:;<=>?@[\]^_`{|}~' #Symbols
}
}
#for each set of charactersets allowed (U/L/N/S)
foreach ($characterSet in $CharSets)
{
#take the table of characters in this character set skipping those characters that should be excluded
$Tokens = $TokenSets["$characterSet"] | ForEach {If ($Exclude -cNotContains $_) {$_}}
#if still some characters left (should be usually the case)
If ($Tokens)
{
#generate the table of only the valid characters
$TokensSet += $Tokens
#as we guarantee that at least one character of each character set will
#be present in the password, we take here one character from the list
$Chars += $Tokens | Get-Random
}
}
#now we get random number of characters from the approved list
While ($Chars.Count -lt $Size)
{
$Chars += $TokensSet | Get-Random
}
#finally we return the result - the list of charaters needs to be converted to a string
($Chars | Sort-Object {Get-Random}) -Join ""
};
Oto przykłady wywołania tej funkcji:
Get-Password -Size 10
Get-Password -size 20 -CharSets 'ULN'





























