Weisheiten - der Netz-Weise Blog
Zufällige (Komplexe) Kennwörter erzeugen mit Powershell
Update: Eine Version mit Hilfe des .NET-Frameworks finden Sie im Artikel Sichere Kennwörter in Powershell generieren, jetzt mit dem .NET Framework
Kennwörter braucht man in Skripten an allen Ecken und Enden, speziell dann, wenn man Benutzer erstellen möchten. Bei einer größeren Anzahl von Konten kann da ein Skript ganz hilfreich sein, dass zufällige Kennwörter generiert. Das ist mit Powershell relativ einfach gemacht. Alles, was man benötigt, ist eine Funktionalität zum Erstellen von Zufallswerten und die Möglichkeit, Zahlen in Buchstaben umzuwandeln. Das Cmdlet Get-Random liefert Zufallszahlen zurück:
Get-Random -Min 10 -Max 100
Die vollständige Auflistung der Funktionen Get-Random können Sie in der Powershell-Hilfe nachlesen. Für uns interessant ist der Parameter -Inputobject, über den man Get-Random ein Array mit Werten übergeben kann, aus denen der Zielwert gewählt wird.
$ZufallsListe = 65..90
$Zufallszahl = Get-Random -InputObject $Zufallsliste
Die Zahlen 65-90 entsprechen den Ascii-Codes der Großbuchstaben von A-Z. Wir können die Zahlen in einen ASCII-Code umwandeln, indem wir Sie in ein CHAR[]-Array konvertieren.
[CHAR[]]$Zufallszahl
Wenn man den Code in einer Schleife ausführt, bekommt man ein zufällig generiertes Kennwort:
$Length = 12
$Zufallsliste = 65..90
For ( $i = 0; $i -lt 12; $i++)
{
$password += Get-Random -InputObject $Zufallsliste
}
Jetzt kann man noch weitere die Zahlenrepräsentationen für Kleinbuchstaben, Zahlen und Sonderzeichen hinzufügen und alles in eine Funktion packen, und man hat "New-Password":
function New-Password {
<#
[cmdletBinding()]
param
(
# The Length of the Password
[ValidateRange(3,256)]
[int]$Length = 12,
# The Criteria the Password must fullfill. Only Complex enforces the combination of
# different Criteria.
[ValidateSet('Complex','Numbers','Specials','LowerCaseLetters','UpperCaseLetters')]
[String[]]$type = 'Complex'
)
# ASCII-Codes for different Types of Characters as Arrays
$Specials = ( 33..45 ) + ( 58..64 ) + ( 91..95 )
$Numbers = ( 48..57 )
$UpperCaseLetters = 65..90
$LowerCaseLetters = 97.. 122
# Generate the Array $Charset which contains the Characters from all chosen Criteria
Switch ( $Type )
{
'Complex' { $Charset = $UpperCaseLetters + $LowerCaseLetters + $Numbers + $Specials; break }
'UpperCaseLetters' { $Charset += $UpperCaseLetters }
'LowerCaseLetters' { $Charset += $LowerCaseLetters }
'Numbers' { $Charset += $Numbers }
'Specials' { $Charset += $Specials }
}
Write-Verbose "$Charset"
# Generate the password. The While-Loop ensures that Complex Passwords fullfill at least 3 Criteria.
While ((( $UpperInserted + $LowerInserted + $SpecialsInserted + $NumbersInserted -lt 3 ) -and ( $type -eq 'Complex' )) `
-or (( $type -ne 'Complex' ) -and ( $UpperInserted + $LowerInserted + $SpecialsInserted + $NumbersInserted -lt 1 )))
{
# Count-Variables are for reporting purposes
# Inserted-Variables ensure that complex Passwords fullfill always at least 3 Criteria.
# They are checked in the While-Condition.
$UpperCount = 0
$LowerCount = 0
$SpecialsCount = 0
$numbersCount = 0
$UpperInserted = 0
$LowerInserted = 0
$SpecialsInserted = 0
$NumbersInserted = 0
[string]$Password = ''
# Generating the Password
For ( $i=1; $i -le $Length; $i++ )
{
$RandomChar = (Get-Random -InputObject $CharSet)
Switch ( $RandomChar )
{
{ $RandomChar -in $UpperCaseLetters } { $UpperCount++; $UpperInserted = 1 }
{ $RandomChar -in $LowerCaseLetters } { $LowerCount++; $LowerInserted = 1 }
{ $RandomChar -in $Specials } { $SpecialsCount++; $SpecialsInserted = 1 }
{ $RandomChar -in $Numbers } { $NumbersCount++; $NumbersInserted = 1 }
}
[string]$Password += [char[]]$RandomChar
}
}
$Password
Write-Verbose "UpperCaseCount: $UpperCount"
Write-Verbose "LowerCaseCount: $LowerCount"
Write-Verbose "Specials: $SpecialsCount"
Write-Verbose "Numbers: $numbersCount"
}
Kommentare