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

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *