gabebu
Goto Top

Powershell: Bereits bestehenden Benutzer individuelle Passwörter zuweisen

Hallo Zusammen

Ich bin gerade dabei, ein Powershell SCript zu erstellen, bei dem jedem Benutzer ein individuelles Passwort erstellt wird. Dass Passwort ist immer das selbe Wort mit einer aufsteigenden Zahl (z.B: RAUKO0@nummer"

Hier ist das geschriebene Script:
#
# Script: ResetPwd.ps1
# Description: Reset the password for bulk number of users, and 
# set the property to change passwrod required at next logon
#
# 
#

Import-Module ActiveDirectory

# Set the default password
$password = ConvertTo-SecureString -AsPlainText “rau@2018” -Force 
 
# Get the list of accounts from the file on file
# List the user names one per line
#$users = Get-ADUser -SearchBase “OU=L-Konstruktion,OU=Users,OU=RAUEXT,OU=RAU,DC=rauglobal,DC=local” -Filter * | Select givenName > C:\Users\admgb\users.txt
gc C:\Users\admgb\users.txt | sort | get-unique > C:\Users\admgb\userlist.txt
$userlist = Get-Content -Path C:\Users\admgb\userlist.txt
do
{
$nummer = 3;

$Password1 = "RAUKO0@$nummer"  
$Password2 = "RAUKO@$nummer"  
$line = $userlist | Select -Index $nummer

ForEach ($user in $userlist)
{
  
    # Set the default password for the current account
    if($nummer -lt 10)
    {
        Set-ADAccountPassword -Identity "CN=$line,OU=L-Konstruktion,OU=Users,OU=RAUEXT,OU=RAU,DC=rauglobal,DC=local" -Reset -NewPassword (ConvertTo-SecureString -AsPlainText $Password1 -Force)       
        Write-Host “Passwort wurde für den Folgenden Benutzer zurückgesetzt: $user”
        Write-Host "Das neue Passwort ist: $Password1"  
    }
    elseif ($nummer -gt 10)
    {
         Set-ADAccountPassword -Identity "CN=$line,OU=L-Konstruktion,OU=Users,OU=RAUEXT,OU=RAU,DC=rauglobal,DC=local" -Reset -NewPassword (ConvertTo-SecureString -AsPlainText $Password2 -Force)       
        Write-Host “Passwort wurde für den Folgenden Benutzer zurückgesetzt: $user”
        Write-Host "Das neue Passwort ist: $Password2"  
    }
}
$nummer++
}while($nummer -lt $user)
# ————- End ———– 

wenn ich aber nun versuche die Passwörter anuzugleichen erhalte ich jedesmal die folgende Fehlermeldung:
Cannot convert value "kon_20" to type "System.Int32". Error: "Input string was   
not in a correct format."  
At C:\Users\admgb\Untitled1.ps1:44 char:1
+ $nummer++
+ ~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) , RuntimeException
    + FullyQualifiedErrorId : InvalidCastFromStringToInteger

Wüsste da jemand, woran es liegen könnte?

Besten Dank für eure Auskunft.

Gruss


gabeBU

Content-ID: 383906

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

Ausgedruckt am: 22.11.2024 um 12:11 Uhr

erikro
erikro 20.08.2018 um 13:50:41 Uhr
Goto Top
Moin,

$nummer = 3; 

ich vermute mal, dass das Semikolon hinter der 3 stört. ;) Dann ist das ein String und den kann man nicht hochzählen.

hth

Erik
gabeBU
gabeBU 20.08.2018 um 14:05:09 Uhr
Goto Top
Hallo Erikro

Leider nicht, ich habe es erneut ohne Semikolon getestet und erhalte die selbe Fehlermeldung.
colinardo
colinardo 20.08.2018 aktualisiert um 14:34:50 Uhr
Goto Top
while($nummer -lt $user)
Kein Wunder wenn du Äpfel mit Birnen vergleichst face-smile.
$nummer ist eine Zahl und $user ist ein String mit Inhalt des Vornamens (Givenname laut deinem Export, warum auch immer.) und beide lassen sich nunmal in der While Condition nicht vergleichen, sagt ja schon die Fehlermeldung
Cannot convert value "kon_20" to type "System.Int32". Error: "Input string was not in a correct format."
Er kann den Namen "kon_20" nicht in eine Zahl konvertieren, die PS ist ja schon so schlau und versucht dich zu unterstützen indem es die Umwandlung des Strings in eine Zahl vornimmt, aber das geht ja mit "kon_20" nunmal nicht.

Ersetze also $User bspw. durch $users.Count.

Das man die Liste erst in eine Textdatei exportieren muss ist auch überflüssiger Strunz, geschweige denn die Schleife, die man auch direkt über Get-ADUser in der Pipe hätte laufen lassen können, naja so what sieht eh nach Anfänger aus da lass ich mal Gnade vor Recht ergehen face-wink.

G. Uwe
erikro
erikro 20.08.2018 um 14:27:09 Uhr
Goto Top
Moin nochmal,

die Initialisierung der Zählervariable muss außerhalb der Do-While-Schleife stehen. Sonst wird das eine Endlosschleife, da $nummer immer 3 ist, wenn die Schleife ausgeführt wird, bzw. 4, wenn Du bei der Abbruchbedingung ankommst.

Ansonsten hat Uwe den Fehler, nach dem Du gefragt hast, schon gefunden.

Liebe Grüße

Erik
gabeBU
gabeBU 21.08.2018 um 09:13:04 Uhr
Goto Top
Okay...ich habe das Script nun angepasst. Doch leider vergibt er nur dem ersten User in der Liste ein Passwort:

#
# Script: ResetPwd.ps1
# Description: Reset the password for bulk number of users, and 
# set the property to change passwrod required at next logon
#
# 
#

Import-Module ActiveDirectory
$nummer = 3
$zaehler = 1
# Get the list of accounts from the file on file
# List the user names one per line
# $users = Get-ADUser -SearchBase “OU=user,OU=TEST,OU=RAU,DC=rauglobal,DC=local” -Filter * | Select givenName > C:\Users\admgb\users.txt
gc C:\Users\admgb\users.txt | sort | get-unique > C:\Users\admgb\userlist.txt
$userlist = Get-Content -Path C:\Users\admgb\userlist.txt
$user = 1
do
{

$Password1 = "RAUKO@0$zaehler"  
$Password2 = "RAUKO@$zaehler"  
$line = $userlist | Select -Index $nummer

ForEach ($userlist in $users.count)
{
    

    # Set the default password for the current account
    if($nummer -lt 10)
    {
        Set-ADAccountPassword -Identity "CN=$line,OU=user,OU=TEST,OU=RAU,DC=rauglobal,DC=local" -Reset -NewPassword (ConvertTo-SecureString -AsPlainText $Password1 -Force)       
        Write-Host “Passwort wurde für den Folgenden Benutzer zurückgesetzt: $user”
        Write-Host "Das neue Passwort ist: $Password1"  
     
       
    }
    elseif ($nummer -gt 10)
    {
         Set-ADAccountPassword -Identity "CN=$line,OU=user,OU=TEST,OU=RAU,DC=rauglobal,DC=local" -Reset -NewPassword (ConvertTo-SecureString -AsPlainText $Password2 -Force)       
        Write-Host “Passwort wurde für den Folgenden Benutzer zurückgesetzt: $user”
        Write-Host "Das neue Passwort ist: $Password2"  
    }
}
$zaehler++
$nummer++
}while($nummer -lt $users.count)
# ————- End ———– 
erikro
erikro 21.08.2018 um 10:07:42 Uhr
Goto Top
Moin,

klar. In der Foreach-Schleife überschreibst Du ja auch $userlist. Und was soll das, dass Du da $users.count als Array angibst? Was soll die ganze Schleife überhaupt. So auf den ersten Blick würde ich sagen, dass das funktioniert, wenn Du das Foreach ganz weglässt (inkl. der schließenden Klammer).

Zur Schleifenprogrammierung guckst Du mal hier: https://www.windowspro.de/script/schleifen-powershell-foreach-while-do-u ...

hth

Erik