coreknabe
Goto Top

Mehrere Passwörter mit Powershell erstellen und in einzelne Variablen

Moin,

stehe gerade auf dem Schlauch und weiß auch nicht so recht, wonach ich googeln soll (was bestimmt schon aus meinem schlauen Titel ersichtlich ist)...

Ich möchte mit einer Funktion mehrere Passwörter erstellen. Das klappt soweit, wenn ich mir alle Passwörter mit Write-Host ausgeben lasse, werden 30 Passwörter erzeugt und angezeigt.

$count=1..30
foreach ($i in $count)
{function Get-RandomCharacters($length, $characters) {
    $random = 1..$length | ForEach-Object { Get-Random -Maximum $characters.length }
    $private:ofs=""  
    return [String]$characters[$random]
}
 
function Scramble-String([string]$inputString){     
    $characterArray = $inputString.ToCharArray()   
    $scrambledStringArray = $characterArray | Get-Random -Count $characterArray.Length     
    $outputString = -join $scrambledStringArray
    return $outputString 
}
 
$password = Get-RandomCharacters -length 13 -characters 'abcdefghiklmnoprstuvwxyz'  
$password += Get-RandomCharacters -length 2 -characters 'ABCDEFGHKLMNOPRSTUVWXYZ'  
$password += Get-RandomCharacters -length 2 -characters '1234567890'  
$password += Get-RandomCharacters -length 3 -characters '!"§$%&/()=?}][{@#*+'  
 
Write-Host $password
 
$password = Scramble-String $password
}

Nun soll jedes einzelne Passwort in eine Variable und ich habe keine Ahnung, wie ich das bewerkstelligen soll. Mittels dieser Variablen schicke ich dann die Passwörter an neu erstellte Testuser, die kurzfristig auf unser System zugreifen sollen.
Frage: Wie kriege ich die 30 Passwörter in 30 Variablen, die ich dann weiterverwursten kann?

Gruß

Content-Key: 666674

Url: https://administrator.de/contentid/666674

Ausgedruckt am: 29.03.2024 um 10:03 Uhr

Mitglied: mbehrens
Lösung mbehrens 12.05.2021 um 15:37:31 Uhr
Goto Top
Zitat von @Coreknabe:

[...]

Nun soll jedes einzelne Passwort in eine Variable und ich habe keine Ahnung, wie ich das bewerkstelligen soll. Mittels dieser Variablen schicke ich dann die Passwörter an neu erstellte Testuser, die kurzfristig auf unser System zugreifen sollen.
Frage: Wie kriege ich die 30 Passwörter in 30 Variablen, die ich dann weiterverwursten kann?

Einfach ein Array definieren und mit der Methode Add Elemente hinzufügen face-smile
Mitglied: 148121
Lösung 148121 12.05.2021 aktualisiert um 15:52:02 Uhr
Goto Top
Einfach den Password Output in die eine Array Variable ausgeben, feddisch

$count = 30

function Get-RandomCharacters($length, $characters) {
    $random = 1..$length | ForEach-Object { Get-Random -Maximum $characters.length }
    $private:ofs=""  
    return [String]$characters[$random]
}
function Scramble-String([string]$inputString){     
    $characterArray = $inputString.ToCharArray()   
    $scrambledStringArray = $characterArray | Get-Random -Count $characterArray.Length     
    $outputString = -join $scrambledStringArray
    return $outputString 
}

[string[]]$passwords = 1..$count | %{
    $password = Get-RandomCharacters -length 13 -characters 'abcdefghiklmnoprstuvwxyz'  
    $password += Get-RandomCharacters -length 2 -characters 'ABCDEFGHKLMNOPRSTUVWXYZ'  
    $password += Get-RandomCharacters -length 2 -characters '1234567890'  
    $password += Get-RandomCharacters -length 3 -characters '!"§$%&/()=?}][{@#*+'  
    Scramble-String $password
}


"Password 1: $($passwords[0])"  
"Password 2: $($passwords[1])"  
"Password 3: $($passwords[2])"  
# ... usw
Gruß w.
Mitglied: Coreknabe
Coreknabe 12.05.2021 um 16:05:42 Uhr
Goto Top
Auweia, jetzt merken hier alle, dass ich gar keine Ahnung habe und mir die Schnipsel nur zusammenklaube face-smile Sorry, ich bin absolut kein Programmierer, aber durchaus lernwillig...

Danke für Eure Antworten!

@mbehrens
Ich weiß nicht genau, wie ich das Array definieren soll. Habe das hier gefunden:
https://blog.netwrix.de/2019/12/19/variablen-und-arrays-in-powershell/#P ...

Da heißt es u.a.:
Natürlich können Sie nicht immer schon im Voraus wissen, wie viele Objekte Sie durch Ausführung eines bestimmten Befehls erhalten. Sie benötigen deshalb einen Code, der das Ergebnis immer als Array behandelt.

--> Verstehe ich nicht, auch wenn es für mich praktisch wäre, weil ich nicht 30 Werte in das Array kloppen will.

Dann habe ich versucht, das Array zu definieren, testweise mit 5 Werten:
$password = @("pw1","pw2","pw3", "pw4", "pw5")  

@148121
Auch bei Deiner Variante habe ich das Array noch nicht definiert:
Es ist nicht möglich, einen Index auf ein NULL-Array anzuwenden.

Resultat:
write-host $password[1]
gibt mir nur einzelne Zeichen aus dem Passwort aus, nämlich das Erste.
Mitglied: 148121
Lösung 148121 12.05.2021 aktualisiert um 16:08:29 Uhr
Goto Top
Zitat von @Coreknabe:
Auch bei Deiner Variante habe ich das Array noch nicht definiert:
Es ist nicht möglich, einen Index auf ein NULL-Array anzuwenden.
> 

Resultat:
write-host $password[1]
gibt mir nur einzelne Zeichen aus dem Passwort aus, nämlich das Erste.
Doch, geht hier problemlos guckst du ...!
screenshot
Mitglied: Coreknabe
Coreknabe 12.05.2021 um 16:45:04 Uhr
Goto Top
Wer lesen kann.... Dir vielen lieben Dank!

Im nächsten Schritt muss ich jetzt die Passwörter den einzelnen Teilnehmern aus der Liste zuordnen. Ich probier mal ein bisschen rum und werde dann wahrscheinlich wieder hier landen face-smile

Euch einen schönen Vatertag, bleibt sauber!
Mitglied: 148121
148121 12.05.2021 aktualisiert um 17:04:18 Uhr
Goto Top
Bsp.
$users = 'Max','Hans'  
$result = $users | %{$cnt=0}{
    [pscustomobject]@{Name=$_;Password=$passwords[$cnt]}
    $cnt++
}
$result | ?{$_Name -eq 'Max'}  
p.s. kennst du die Funktion ...? face-wink
[System.Web.Security.Membership]::GeneratePassword(20,3)
Mitglied: Coreknabe
Coreknabe 12.05.2021 um 17:38:40 Uhr
Goto Top
Nö, kenne ich nich, was Dich aber wohl auch gewundert hätte :-P

Wie gesagt, ich bin kein Programmierheld, ich suche mir bei Bedarf den Krempel zusammen.

Das will ich mit dem Skript machen:
- 30 temporäre AD-Benutzer erzeugen, die durchnummeriert sind (TN-1 - TN-30). Erledigt.
- 30 zufällige Passwörter für diese Benutzer erzeugen. Dank Dir erledigt face-smile
- Aus einer CSV die Emailadressen herausziehen, um die Benutzer für Kennung und Passwort anschreiben zu können. Erledigt.
- Zufällige Passwörter mit den Benutzern verknüpfen. Noch nicht erledigt.
- Die Benutzer per Mail anschreiben. Klappt, allerdings fehlt mir noch die Zusatzinfo Kennung / Passwort, damit sie sich anmelden können.
Hier hakt es momentan, weil ich gerade keine Idee habe, wie ich TN-1 - TN-30 das Passwort mitteile. Ich würde das gern in den Emailtext schreiben ($body).
Mitglied: 148121
148121 12.05.2021 aktualisiert um 18:30:04 Uhr
Goto Top
30 temporäre AD-Benutzer erzeugen,
Wenn du die sowieso selbst anlegst dann erzeuge in der selben Schleife doch direkt das jeweilige Passwort für den User dann brauchst du das nicht erst hinterher zuordnen 😉.
Ich würde das gern in den Emailtext schreiben ($body).
Kannst du ja machen.
Mitglied: Coreknabe
Coreknabe 12.05.2021 um 21:48:32 Uhr
Goto Top
Wenn du die sowieso selbst anlegst dann erzeuge in der selben Schleife doch direkt das jeweilige Passwort für den User dann brauchst du das nicht erst hinterher zuordnen 😉.

Schon, aber ich raffe nicht, wie. So würde ich jetzt die User anlegen, das Passwort habe ich erst einmal manuell erzeugt:

$path="OU=hierdrin,DC=domaene,DC=net"  
$username="TN-"  
$count=1..30
foreach ($i in $count)
{ New-AdUser -Name $username$i -Path $path -Enabled $True -ChangePasswordAtLogon $true -AccountPassword (ConvertTo-SecureString "yY!zir_b[LrPXy#p4+^f/~V\" -AsPlainText -force) -Description Testteilnehmer -passThru | % {Add-ADGroupMember -Identity "Teilnehmer" -Members $_}}  

Wie kriege ich jetzt die erzeugten Zufallspassworte da rein?

Das wirst Du jetzt nicht glauben, aber ich weiß auch nicht, wie ich die erzeugten Array-Variablen in den Mailtext bekomme face-smile
Das mache ich aktuell über diese Variante, die Daten kommen aus der CSV, bzw. sind als Variablen im Skript hinterlegt:

ForEach-Object {
    Send-MailMessage -SmtpServer $SMTPServer -From $EMailFrom -To $EMailTo -Subject $Subject -Body $Body -Port $SMTPPort -Credential $EmailCredential
    }

$EMailTo liest eben die Spalte mit den Emailadressen in der CSV aus.

Ich glaube, ich habe da auch einen konzeptionellen Denkfehler?
Mitglied: 148121
148121 13.05.2021 aktualisiert um 12:19:14 Uhr
Goto Top
Zitat von @Coreknabe:
Ich glaube, ich habe da auch einen konzeptionellen Denkfehler?
Ja. Da du ja jedem Empfänger mit einer Mail-Adresse aus deiner CSV einen User erstellen willst ist es ja sinnig gleich über die CSV-Datei per For-Each zu itterieren dem User einen Account zu generieren und ihm eine entsprechende Mail zuzustellen, all-in-one sozusagen.

Hier mal ein entsprechendes Beispiel (gehe da von aus das die Spalte der CSV in der die E-Mail Adresse steht "EMail" lautet, kannst du dann ja im Code in der Send-MailMessage-Zeile anpassen.
Zusätzlich habe ich das CSV-Object dann noch mit dem Initial-Password ergänzt damit man diese zusätzlich auch noch wieder exportieren kann.
# password generate function
function Generate-Password {
    function Get-RandomCharacters($length, $characters) {
        $random = 1..$length | ForEach-Object { Get-Random -Maximum $characters.length }
        $private:ofs=""  
        return [String]$characters[$random]
    }
    function Scramble-String([string]$inputString){     
        $characterArray = $inputString.ToCharArray()   
        $scrambledStringArray = $characterArray | Get-Random -Count $characterArray.Length     
        $outputString = -join $scrambledStringArray
        return $outputString 
    }
    $password = Get-RandomCharacters -length 13 -characters 'abcdefghiklmnoprstuvwxyz'  
    $password += Get-RandomCharacters -length 2 -characters 'ABCDEFGHKLMNOPRSTUVWXYZ'  
    $password += Get-RandomCharacters -length 2 -characters '1234567890'  
    $password += Get-RandomCharacters -length 3 -characters '!"§$%&/()=?}][{@#*+'  
    Scramble-String $password
}
# ou path
$ou_path="OU=hierdrin,DC=domaene,DC=net"  
# username prefix
$username_prefix = "TN-"  
# email settings
$EMailFrom  = 'from@domain.tld'  
$EmailCredential = (new-Object PSCredential('username',(ConvertTo-SecureString 'Password' -AsPlainText -Force)))  
$SMTPServer = 'server.domain.tld'  
$SMTPPort = 587
# import user csv file
$users = Import-CSV .\Users.csv -Delimiter ";"  
# add adiditional password field to store password only for reference
$users | Add-Member -MemberType NoteProperty -Name InitialPassword -Value '' -Force  
# counter for Usernames
$cnt = 1
foreach ($user in $users){
    # generate password
    $pwd = Generate-Password
    # new account name
    $accName = "$username_prefix$cnt"  
    # add user and membership
    New-AdUser -Name $accName -Path $ou_path -Enabled $True -ChangePasswordAtLogon $true -AccountPassword (ConvertTo-SecureString $pwd -AsPlainText -force) -Description Testteilnehmer -passThru | %{Add-ADGroupMember -Identity "Teilnehmer" -Members $_}  
    # send mail
    Send-MailMessage -SmtpServer $SMTPServer -From $EMailFrom -To $user.EMail -Subject "Ihr neues Passwort" -Body "Ihr Passwort für den Useraccount $accName lautet: $pwd" -Port $SMTPPort -Credential $EmailCredential  
    # note password for later export
    $user.InitialPassword = $pwd
    # increase counter
    $cnt++
}

# export userlist with assigned initial passwords
$users | export-csv .\Users_with_passwords.csv -Delimiter ";" -NoType -Encoding UTF8  
Das regt vielleicht jetzt deine Fantasie etwas an face-wink.

Schönen Vatertag noch
Gruß w.
Mitglied: Coreknabe
Coreknabe 14.05.2021 um 16:05:59 Uhr
Goto Top
Moin!

Meine Güte, Dir vielen lieben, herzlichen Extradank! Rennt jetzt alles wie gewünscht, ein paar kleine Ecken habe ich noch, die verrate ich Dir aber nicht, irgendwas muss ich ja auch machen face-smile

Wünsche Dir ein schönes Wochenende, nochmal danke für Deine Mühe und Geduld!