samedi 16 juillet 2011

Powershell script - générer un mot de passe aléatoire

Voici un script Powershell permettant de créer un mot de passe aléatoire en spécifiant le nombre de caractères ainsi qu'un niveau de complexité fort, moyen, faible.
Rien de bien exceptionnel, c'était juste pour améliorer mon skill sur ce langage mais je le poste tout de même si toutefois ça peut servir!

<#
.INFORMATIONS
Auteur : Guillaume Blin
Date : 16 juillet 2011

.DESCRIPTION
Ce script permet de générer des mots de passe de la longueur voulue en fonction de 3 niveaux de complexité disponibles.

La base de ce script est un script de John T Childers III disponible à cette adresse :
http://powershellcommunity.poshcode.org/2793

L'idée était de voir si j'étais capable de simplifier le code et d'améliorer aussi mes connaissances en powershell.

Pour ce faire, j'ai utilisé la possibilité de définir des caractères grâce à leur numéro ascii, permettant ainsi d'alléger un peu le code.
Un array composé de numéros ascii des caractères est renvoyé dans une boucle foreach pour être converti en caractère

J'ai ensuite supprimé les boucles for avec le write-host -nonewline qui permettait d'ajouter une lettre à côté de la précédente à chaque boucle.
Pour recréer le même résultat :
- Premièrement, j'ai renvoyé le résultat l'array contenant mes caractères dans get-random avec le commutateur -count qui permet d'indiquer combien d'objets (des caractères dans notre cas) sont retournés
- Deuxièmement, le résultat affichant 1 caractère par ligne, j'ai utilisé -join pour joindre le résultat sur plusieurs lignes de get-random et en faire une ligne unique

.UTILISATION
Par défaut, génère un mot de passe avec les options haute complexité et longueur 9 caractères
get-password

Définir un mot de passe de 8 caractères ainsi qu'un niveau de complexité moyen
get-password -l 8 -c m
ou
get-password 8 m
#>

function get-password {
#Paramètres de configurations
Param (
#Définis la longueur du mot de passe
[Alias("-l")]
[
Int]$longueur = 9,

#Définis le niveau de complexité du mot de passe ( h:hight, m:medium, l:low )
[Alias("-c")]
[ValidateSet(
"h","m","l")]
[
String]$complexite = "h" )

Process {
#48..57 : 012...789
#65..90 : ABC...XYZ
#97..122 : abc...xyz
#35..38+40..43+45,47,33+60..64+92,94,95,123,125 : # $ % & ( ) * + - / ! < = > ? @ \ ^ _ { }

# Chiffres, miniscules, majuscules et caractères spéciaux
$H = 35..38+40..43+45,33+47..57+60..90+92,94,95+97..123+125 | Foreach-Object { "$([char]$_)" }

# Chiffres, miniscules et majuscules
$M = 48..57+65..90+97..122 | Foreach-Object { "$([char]$_)" }

# Miniscules et majuscules
$L = 65..90+97..122 | Foreach-Object { "$([char]$_)" }

#Switch pour générer le mot de passe en fonction de la longueur et de la compléxité
Switch ($complexite) {
h { -join ($H | Get-Random -count $longueur) }
m {
-join ($M | Get-Random -count $longueur) }
l {
-join ($L | Get-Random -count $longueur) }
} }}