Heute stelle ich meine Passwortgeneratorfunktion vor. Diese habe ich mit der PowerShell geschrieben. Sie liegt in einem PSModule, dass automatisch mit geladen wird. Dadurch steht die Funktion immer zur Verfügung.
function generiere-Zufallspasswort {
<#
.Notes
Scriptreihe: generiere-Passwort
Datum: 2020-03-09
Version: V1.02
Programmierer: Stephan Walther
.Synopsis
Die Funktion erstellt ein zufälliges Passwort.
.DESCRIPTION
Je Aufruf wird ein zufälliges Passwort aus einem teilweise definierbaren Zeichensatz
erstellt. Das Passwort kann angezeigt werden oder für eine bestimmte Zeit in der
Zwischenablage gespeichert werden.
.EXAMPLE
generiere-Zufallspasswort
Das Passwort wurde in die Zwischenablage kopiert.
Qualität: 129 Bits
Länge: 20 Zeichen
Die Zwischenablage wird in 10 Sekunden geleert ,,,,,,,,,, erledigt.
Es wird ein Passwort mit der vordefinierten Länge von 20 Zeichen und dem gesamten
Zeichensatz erzeugt und für 10 Sekunden in der Zwischenablage gespeichert.
.EXAMPLE
generiere-Zufallspasswort -AnzahlZeichen 10
Das Passwort wurde in die Zwischenablage kopiert.
Qualität: 64 Bits
Länge: 10 Zeichen
Die Zwischenablage wird in 10 Sekunden geleert ,,,,,,,,,, erledigt.
Es wird ein Passwort mit der angegebenen Länge von 10 Zeichen und dem gesamten
Zeichensatz erzeugt und für 10 Sekunden in der Zwischenablage gespeichert. Es sind
Zahlen zwischen 5 und 150 erlaubt.
.EXAMPLE
generiere-Zufallspasswort -PasswortAnzeigen
EVZ$.XQo(?GZ3=Grxwp
Es wird ein Passwort mit den Standardwerten erzeugt und angezeigt.
.EXAMPLE
generiere-Zufallspasswort -PasswortAnzeigen -KeineSonderzeichen
GnPIts7qPjvCwmTs4azM
Es wird ein Passwort mit ohne Sonderzeichen erzeugt und angezeigt.
.EXAMPLE
generiere-Zufallspasswort -AlsSecureString
System.Security.SecureString
$PW = generiere-Zufallspasswort -AlsSecureString
New-ADUser -Name "TestMe" -AccountPassword $PW
Mit dem Parameter -AlsSecureString wird das Passwort in einen SecureString kovertiert
ausgegeben.
.PARAMETER AnzahlZeichen
Gibt die Länge des Passwortes an. Der Standardwert ist 20.
.PARAMETER PasswortAnzeigen
Zeigt das Passwort im Klartext an. Ohne den Parameter wird das Passwort
für 10 Sekunden in der Zwischenablage gespeichert. Dieser Parameter ist nicht mit dem
Parameter AlsSecureString kombinierbar.
.PARAMETER AlsSecureString
Gibt das Passwort als SecureString zurück. Ohne den Parameter wird das Passwort
im Klartext behandelt. Dieser Parameter ist nicht mit dem Parameter PasswortAnzeigen
kombinierbar.
.PARAMETER KeineSonderzeichen
Unterdrückt Sonderzeichen im Passwort. Standardmäßig werden diese Sonderzeichen
verwendet: !"§$%&/()=?*+#.,-_;:<>
.PARAMETER KeineZahlen
Unterdrückt Zahlen im Passwort. Standardmäßig werden alle Ziffern verwendet.
.PARAMETER KeineKleinbuchstaben
Unterdrückt kleine Buchstaben im Passwort. Standardmäßig werden alle Buchstaben verwendet.
.PARAMETER KeineGrossbuchstaben
Unterdrückt große Buchstaben im Passwort. Standardmäßig werden alle Buchstaben verwendet.
#>
[outputtype([string])]
param(
[parameter(Mandatory=$false)] [validateRange(5,150)] [int] $AnzahlZeichen = 20,
[parameter(Mandatory=$false,ParameterSetName="show")] [switch] $PasswortAnzeigen = $false,
[parameter(Mandatory=$false)] [switch] $AlsSecureString = $false,
[parameter(Mandatory=$false)] [switch] $KeineSonderzeichen = $false,
[parameter(Mandatory=$false)] [switch] $KeineZahlen = $false,
[parameter(Mandatory=$false)] [switch] $KeineKleinbuchstaben = $false,
[parameter(Mandatory=$false)] [switch] $KeineGrossbuchstaben = $false
)
# definiere Zeichensatz
$Zeichen = @()
if ($KeineGrossbuchstaben -eq $false) { $Zeichen += 65..90 | ForEach-Object {[char] $_} }
if ($KeineKleinbuchstaben -eq $false) { $Zeichen += 97..122 | ForEach-Object {[char] $_} }
if ($KeineZahlen -eq $false) { $Zeichen += 0..9 | ForEach-Object { $_ } }
if ($KeineSonderzeichen -eq $false) { '!"§$%&/()=?*+#.,-_;:<>' -split '' | ForEach-Object { $Zeichen += $_ } }
if ($Zeichen.count -eq 0) {
Write-Host "Der Zeichensatz darf nicht leer sein!" -ForegroundColor Magenta
break
}
# stelle Passwort zusammen
$PWD = (1..$AnzahlZeichen | ForEach-Object { Get-Random -InputObject $Zeichen -Count 1 }) -join ''
# berechne Entropie
$Entropy = [math]::Log($Zeichen.count,2) * $AnzahlZeichen
$Entropy = [math]::Round( $Entropy , 0 )
# Ausgabe
if ($PasswortAnzeigen) {
Return $PWD
Write-Host "" -ForegroundColor Cyan
Write-Host "Qualität: $Entropy Bits" -ForegroundColor Cyan
Write-Host "Länge: $AnzahlZeichen Zeichen" -ForegroundColor Cyan
}
if ($AlsSecureString) {
Return (ConvertTo-SecureString -String $PWD -AsPlainText -Force)
}
if ($PasswortAnzeigen -eq $false -and $AlsSecureString -eq $false) {
Set-Clipboard -Value $PWD
Write-Host "Das Passwort wurde in die Zwischenablage kopiert." -ForegroundColor Cyan
Write-Host "Qualität: $Entropy Bits" -ForegroundColor Cyan
Write-Host "Länge: $AnzahlZeichen Zeichen" -ForegroundColor Cyan
Write-Host ""
Write-Host "Die Zwischenablage wird in 10 Sekunden geleert " -ForegroundColor Yellow -NoNewline
1..10 | ForEach-Object {
Write-Host "." -ForegroundColor Yellow -NoNewline
Start-Sleep -Seconds 1
}
$null | clip.exe
Write-Host " erledigt." -ForegroundColor Yellow
}
}
Der einfachste Aufruf kommt ohne Parameter aus. Es werden dadurch die Standardeinstellungen verwendet. Das neue Passwort wird aus dem kompletten Zeichensatz generiert und für 10 Sekunden in der Zwischenablage gespeichert. Danach wird es aus der Zwischenablage entfernt:
Alternativ kann die Länge des Passwortes mit einem Parameter angegeben werden:
Mit den frei kombinierbaren Parametern -KeineSonderzeichen, -KeineZahlen, -KeineKleinbuchstaben und-Keinegrossbuchstaben kann der Zeichensatz angepasst werden
Anstelle der Zwischenablage kann auch das neue Passwort auch direkt angezeigt werden. Hierbei besteht aber durchaus das Risiko einer Protokollierung durch ein PS-Transcript!
Und wenn das Passwort etwas besser gesichert transportiert werden soll, dann steht auch die integrierte Konvertierung in einen SecureString zur Verfügung. Den Weg zum Klartextpasswort hab ich mal mit dazugeschrieben:
Vielleicht könnt ihr diese Funktion gebrauchen. Dann viel Spass damit!
Stay tuned!