generiere-Zufallspasswort (PowerShell-Funktion)

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.

Der ScriptCode


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            
        }        
}
Aufrufe

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:

generiere-Zufallspasswort (PowerShell-Funktion)

Alternativ kann die Länge des Passwortes mit einem Parameter angegeben werden:

generiere-Zufallspasswort (PowerShell-Funktion)

Mit den frei kombinierbaren Parametern -KeineSonderzeichen, -KeineZahlen, -KeineKleinbuchstaben und-Keinegrossbuchstaben kann der Zeichensatz angepasst werden

generiere-Zufallspasswort (PowerShell-Funktion)

Anstelle der Zwischenablage kann auch das neue Passwort auch direkt angezeigt werden. Hierbei besteht aber durchaus das Risiko einer Protokollierung durch ein PS-Transcript!

generiere-Zufallspasswort (PowerShell-Funktion)

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:

generiere-Zufallspasswort (PowerShell-Funktion)

Vielleicht könnt ihr diese Funktion gebrauchen. Dann viel Spass damit!
Stay tuned!

Kommentar hinterlassen