Netz-Weise Logo

Weisheiten - der Netz-Weise Blog

Hier finden Sie Tipps und Tricks für vor, während und nach der Schulung.
3 Minuten Lesezeit (621 Worte)

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

Links

New-Password.txt

DHCP-Server migrieren mit Powershell
Mit [ValidateScript()] Powershell-Parameter prüfen...

Ähnliche Beiträge

 

Kommentare

Derzeit gibt es keine Kommentare. Schreibe den ersten Kommentar!
Bereits registriert? Hier einloggen
Sonntag, 19. Mai 2024

Sicherheitscode (Captcha)