Je vous présente mon petit générateur de mot de passe qui est basé sur un système existant mais trop limité pour mes besoins.
Cette fonction vous permet de générer un mot de passe de la longueur de votre choix avec ou sans certains types de caractères.
De plus il vous est tout à fait possible d’exclure très facilement un ou plusieurs caractères spécifiques.
Une particularité de ce type de générateur de mot de passe, contrairement aux plus courants basés sur Get-Random, c’est que celui-ci fonctionne parfaitement dans une exécution parallèle (Job, Workflow, Runspaces)
function New-HSPassword {
<#
.SYNOPSIS
Generate a password.
.DESCRIPTION
Generate a password with specific length. You aere allowed to choose specific characters
type and also to exclude specific characters or characters type.
.PARAMETER Length
Password length.
.PARAMETER UseUpperCaseLetters
Allow you to use or do not use uppercase letters.
.PARAMETER UseLowerCaseLetters
Allow you to use or do not use lowercase letters.
.PARAMETER UseDigits
Allow you to use or do not use digts.
.PARAMETER UseSpecialCharacters
Allow you to use or do not use special characters.
.PARAMETER ExcludedChars
Allow you to exclude one or multiple characters. Input is string. It is case sensitive.
.INPUTS
int, switch, string
.OUTPUTS
string
.EXAMPLE
New-Password -Length 8
Generate a password with a length of 8.
.EXAMPLE
New-Password -Length 32 -UseSpecialCharacters:$false
Generate a password with a length of 32 without special characters.
.EXAMPLE
New-Password -Length 32 -UseDigits:$false -ExcludedChars *T
Generate a password with a length of 32 and without char * and T.
#>
Param (
# Password Length
[Parameter(Mandatory=$true)]
[Int]
$Length,
# Use uppercase letters
[Parameter(Mandatory = $false)]
[Switch]
$UseUpperCaseLetters = $true,
# Use lowercase letters
[Parameter(Mandatory = $false)]
[Switch]
$UseLowerCaseLetters = $true,
# Use digits
[Parameter(Mandatory = $false)]
[Switch]
$UseDigits = $true,
# Use special characters
[Parameter(Mandatory = $false)]
[Switch]
$UseSpecialCharacters = $true,
# Characters to avoid
[Parameter(Mandatory = $false)]
[string]
$ExcludedChars
)
[System.Security.Cryptography.RNGCryptoServiceProvider] $Random = New-Object System.Security.Cryptography.RNGCryptoServiceProvider
$Digits = $(48..57)
$Specials = $(33..38 + 41..47 + 91..95 + 123..126)
$UpperLetter = $(65..90)
$LowerLetter = $(97..122)
$Choice = @()
if ($UseUpperCaseLetters ) { $Choice += $UpperLetter }
if ($UseLowerCaseLetters ) { $Choice += $LowerLetter }
if ($UseSpecialCharacters) { $Choice += $Specials }
if ($UseDigits ) { $Choice += $Digits }
if ($ExcludedChars) {
$Excluded = ($ExcludedChars -split "") | Where-Object {$_ -ne ""}
foreach ($chr in $Excluded) {
$Choice = $Choice | Where-Object {$_ -ne [byte][char]$chr}
}
}
$RandomNumber = New-Object byte[] $Length
$Random.GetBytes($RandomNumber)
$RandomPassword = ''
foreach ($item in $RandomNumber) {
[char]$char = $Choice[$item % $choice.Length]
$RandomPassword += $char
}
return $RandomPassword
}
Bien évidemment, je reste toujours à votre disposition pour d’éventuelles questions ou remarques.
0 commentaire