chrischtoph
Goto Top

Server 2016 - neue User per Powershell Script anlegen

Hallo,

ich hab mich an einem Skript für Powershell probiert um mehrere User über eine csv-Datei auf dem Server anzulegen. Erst kam keine Fehlermeldung aber nachdem ich die einzulesenden Daten in Powershell hab anzeigen lassen, kam folgende Meldung schon beim ersten Benutzer:

Verarbeite Benutzer: AbromeitF
Fehler beim Erstellen von Benutzer AbromeitF: Eigenschaft "SamAccountName" wurde im Objekt vom Typ "System.Man
agement.Automation.PSCustomObject" nicht gefunden.

Das Skript sieht so aus:
 # Pfad zur OU
$ouDN = "OU=AlleSchueler,OU=Abschluss30,DC=fcsnetz,DC=local"  

# Pfad zur CSV-Datei
$csvPath = "C:\Users\Administrator.FCSNETZ\Desktop\neue5er.csv"  

# Importiere die Benutzerinformationen aus der CSV-Datei mit Semikolon als Trennzeichen
$users = Import-Csv -Path $csvPath -Delimiter ";"  

# Überprüfen Sie die eingelesenen Benutzerinformationen
#hier hatte ich mir die Liste anzeigen lassen, was auch funktionierte

# Einheitliches Passwort für alle Benutzer (direkt als SecureString)
$securePassword = ConvertTo-SecureString "sommer5" -AsPlainText -Force  

# Schleife durch die Benutzerliste und erstelle jeden Benutzer
foreach ($user in $users) {
    Write-Host "Verarbeite Benutzer: $($user.SamAccountName)"  
    
    # Überprüfen, ob der Benutzer bereits existiert
    try {
        $existingUser = Get-ADUser -Filter {SamAccountName -eq $user.SamAccountName} -ErrorAction SilentlyContinue
        
        if ($existingUser) {
            Write-Host "Benutzer $($user.SamAccountName) existiert bereits, wird übersprungen."  
        } else {
            # Neuen Benutzer in Active Directory erstellen
            New-ADUser `
                -SamAccountName $user.SamAccountName `
                -UserPrincipalName "$($user.SamAccountName)@fcsnetz.local" `  
                -Name "$($user.GivenName) $($user.Surname)" `  
                -GivenName $user.GivenName `
                -Surname $user.Surname `
                -DisplayName $user.DisplayName `
                -AccountPassword $securePassword `
                -Enabled $true `
                -Path $ouDN `
                -ChangePasswordAtLogon $true `
                -PasswordNeverExpires $true
            
            Write-Host "Benutzer $($user.SamAccountName) wurde erfolgreich erstellt."  
        }
    } catch {
        Write-Host "Fehler beim Erstellen von Benutzer $($user.SamAccountName): $_"  
    }
}

Write-Host "Skript abgeschlossen."  

kann jmd helfen?

Content-ID: 33866642906

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

Ausgedruckt am: 03.12.2024 um 17:12 Uhr

Vision2015
Vision2015 15.08.2024 um 21:18:51 Uhr
Goto Top
Moin...

kannst du das mal ordentlich in den Code Tag posten!
$ouDN = "OU=AlleSchueler,OU=Abschluss30,DC=fcsnetz,DC=local"  

Frank
14135584197
14135584197 15.08.2024 aktualisiert um 23:50:04 Uhr
Goto Top
Moin.
Filter mit curly braces sind besonders, hier funktionieren bei CustomObjects nur ganze Variablen kein Abrufen von Eigenschaften einer Variablen, deswegen auch der Fehler, schreibe den Filter stattdessen so
# ....
$existingUser = Get-ADUser -Filter "SamAccountName -eq '$($user.SamAccountName)'" -EA SilentlyContinue  
# ....

Resultat:
$ErrorActionPreference = 'Stop'  
# Pfad zur OU
$ouDN = "OU=AlleSchueler,OU=Abschluss30,DC=fcsnetz,DC=local"    

# Pfad zur CSV-Datei
$csvPath = "C:\Users\Administrator.FCSNETZ\Desktop\neue5er.csv"    

# Importiere die Benutzerinformationen aus der CSV-Datei mit Semikolon als Trennzeichen
$users = Import-Csv -Path $csvPath -Delimiter ";"    

# Einheitliches Passwort für alle Benutzer (direkt als SecureString)
$securePassword = ConvertTo-SecureString "sommer5" -AsPlainText -Force    

# Schleife durch die Benutzerliste und erstelle jeden Benutzer
foreach ($user in $users) {
    Write-Host "Verarbeite Benutzer: $($user.SamAccountName)"    
    
    # Überprüfen, ob der Benutzer bereits existiert
        if (Get-ADUser -Filter "SamAccountName -eq '$($user.SamAccountName)'" -EA SilentlyContinue) {  
            Write-Host "Benutzer $($user.SamAccountName) existiert bereits, wird übersprungen."    
        } else {
            # Neuen Benutzer in Active Directory erstellen
           try {
                New-ADUser `
                -SamAccountName $user.SamAccountName `
                -UserPrincipalName "$($user.SamAccountName)@fcsnetz.local" `    
                -Name "$($user.GivenName) $($user.Surname)" `    
                -GivenName $user.GivenName `
                -Surname $user.Surname `
                -DisplayName $user.DisplayName `
                -AccountPassword $securePassword `
                -Enabled $true `
                -Path $ouDN `
                -ChangePasswordAtLogon $true `
                -PasswordNeverExpires $true
            
                Write-Host "Benutzer $($user.SamAccountName) wurde erfolgreich erstellt."    
           } catch {
                Write-Host "Fehler beim Erstellen von Benutzer $($user.SamAccountName): $_"    
           }
      }
}

Write-Host "Skript abgeschlossen."    

Gruß
Chrischtoph
Chrischtoph 15.08.2024 aktualisiert um 22:25:01 Uhr
Goto Top
danke - das war schon mal wichtig aber jetzt kommt folgendes
Verarbeite Benutzer: AbromeitF
Verzeichnisobjekt nicht gefunden.


aber die Benutzer existieren eben noch nicht
Celiko
Celiko 15.08.2024 aktualisiert um 23:28:26 Uhr
Goto Top
Naja, du sagst in Zeile 22, dass die Variable $existingUser in der AD nach dem Benutzer suchen soll...
Dann nutzt du auch noch diese Variable, die keinen Wert hat, um einen User zu erstellen.

PS C:\Users\Administrator.FCSNETZ> # Pfad zur OU
$ouDN = "OU=AlleSchueler,OU=Abschluss30,DC=fcsnetz,DC=local"      

# Pfad zur CSV-Datei
$csvPath = "C:\Users\Administrator.FCSNETZ\Desktop\neue5er.csv"      

# Importiere die Benutzerinformationen aus der CSV-Datei mit Semikolon als Trennzeichen
$users = Import-Csv -Path $csvPath -Delimiter ";"      

# Überprüfen Sie die eingelesenen Benutzerinformationen


# Einheitliches Passwort für alle Benutzer (direkt als SecureString)
$securePassword = ConvertTo-SecureString "sommer5" -AsPlainText -Force      

# Schleife durch die Benutzerliste und erstelle jeden Benutzer
foreach ($user in $users) {
    Write-Host "Verarbeite Benutzer: $($user.SamAccountName)"      
    
    # Überprüfen, ob der Benutzer bereits existiert
    if (Get-ADUser -Filter "SamAccountName -eq '$($user.SamAccountName)'")    
        { Write-Host "Benutzer existiert, mache nix" }    
    else {
        # Neuen Benutzer in Active Directory erstellen
        New-ADUser `
            -SamAccountName $user.SamAccountName `
            -UserPrincipalName "$($user.SamAccountName)@fcsnetz.local" `  
            -Name "$($user.GivenName) $($user.Surname)" `  
            -GivenName $user.GivenName `
            -Surname $user.Surname `
            -DisplayName $user.DisplayName `
            -AccountPassword $securePassword `
            -Enabled $true `
            -Path $ouDN `
            -ChangePasswordAtLogon $true `
            -PasswordNeverExpires $true
            
        Write-Host "Benutzer $($user.SamAccountName) wurde erfolgreich erstellt."      
    }
} 
Write-Host "Skript abgeschlossen."      

VG
erikro
erikro 16.08.2024 um 09:33:43 Uhr
Goto Top
Moin,

Zitat von @14135584197:

Moin.
Filter mit curly braces sind besonders, hier funktionieren bei CustomObjects nur ganze Variablen kein Abrufen von Eigenschaften einer Variablen

Unsinn.

PS U:\> $user = get-aduser username

PS U:\> get-aduser -filter {samaccountname -eq $user.samaccountname}

DistinguishedName : CN=[...]
Enabled           : True
GivenName         : Hans
Name              : User, Hans
ObjectClass       : user
ObjectGUID        : 4b9dc892-fce9-49ec-b59e-f4e1c92d5b26
SamAccountName    : username
SID               : S-1-5-21-*
Surname           : User
UserPrincipalName : [...]

Selbstverständlich funktioniert der Abruf einer Objekteigenschaft in jedem Filter der PS.

Liebe Grüße

Erik
14135584197
14135584197 16.08.2024 aktualisiert um 10:14:18 Uhr
Goto Top
Zitat von @erikro:
Unsinn.

PS U:\> $user = get-aduser username

PS U:\> get-aduser -filter {samaccountname -eq $user.samaccountname}

DistinguishedName : CN=[...]
Enabled           : True
GivenName         : Hans
Name              : User, Hans
ObjectClass       : user
ObjectGUID        : 4b9dc892-fce9-49ec-b59e-f4e1c92d5b26
SamAccountName    : username
SID               : S-1-5-21-*
Surname           : User
UserPrincipalName : [...]

Selbstverständlich funktioniert der Abruf einer Objekteigenschaft in jedem Filter der PS.

aber nicht in jedem Fall! Schau dir das bitte mal an:
$users = [pscustomobject]@{
    Name = "MaxMuster"  
    SamAccountName = 'mmuster'  
}

foreach($user in $users){
    Get-ADUser -Filter {SamAccountName -eq $user.SamAccountName}
}

Fehler:
Get-ADUser : Eigenschaft "SamAccountName" wurde im Objekt vom Typ "System.Management.Automation.PSCustomObject" nicht gefunden.
In Zeile:7 Zeichen:5
+     Get-ADUser -Filter {SamAccountName -eq $user.SamAccountName}
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Get-ADUser], ArgumentException
    + FullyQualifiedErrorId : ActiveDirectoryCmdlet:System.ArgumentException,Microsoft.ActiveDirectory.Management.Commands.GetADUser

Bei Objekten den Typs PSCustomObject bspw. funktioniert das eben gerade nicht, und der TO verwendet eben diese in seinem Code!

Hier wird das Problem damit auch nochmal aufgeführt.
https://stackoverflow.com/questions/20075502/get-aduser-filter-will-not- ...
Chrischtoph
Lösung Chrischtoph 16.08.2024 um 16:52:06 Uhr
Goto Top
Hallo Leute,

es funktioniert tatasächlich wenn ich die geschweiften Klammern nicht nutze! Ich hatte dann noch ein Problem mit OU - aber das war einfach falsch aufgeschrieben. Ich stelle hier noch mal den jetzt funktionierenden Code ein, falls den jmd anders noch brauchen kann. Und vielen, vielen Dank an alle, die mitgedacht haben!!!

# Pfad zur OU
$ouDN = "OU=Abschluss30,OU=AlleSchueler,DC=fcsnetz,DC=local"  

# Pfad zur CSV-Datei
$csvPath = "C:\Users\Administrator.FCSNETZ\Desktop\neue5er.csv"  

# Importiere die Benutzerinformationen aus der CSV-Datei mit Semikolon als Trennzeichen
$users = Import-Csv -Path $csvPath -Delimiter ";"  

# Einheitliches Passwort für alle Benutzer (direkt als SecureString)
$securePassword = ConvertTo-SecureString "sommer5" -AsPlainText -Force  

# Schleife durch die Benutzerliste und erstelle jeden Benutzer
foreach ($user in $users) {
    Write-Host "Verarbeite Benutzer: $($user.SamAccountName)"  
    # Überprüfen, ob der Benutzer bereits existiert
    try {
     $existingUser = Get-ADUser -Filter "SamAccountName -eq '$($user.SamAccountName) -ErrorAction SilentlyContinue'"  
       
        if ($existingUser) {
            Write-Host "Benutzer $($user.SamAccountName) existiert bereits, wird übersprungen."  
        } else {
            # Neuen Benutzer in Active Directory erstellen
            New-ADUser `
                -SamAccountName $user.SamAccountName `
                -UserPrincipalName "$($user.SamAccountName)@fcsnetz.local" `  
                -Name "$($user.GivenName) $($user.Surname)" `  
                -GivenName $user.GivenName `
                -Surname $user.Surname `
                -DisplayName $user.DisplayName `
                -AccountPassword $securePassword `
                -Enabled $true `
                -Path $ouDN `
                -ChangePasswordAtLogon $true `
                -PasswordNeverExpires $false
            
            Write-Host "Benutzer $($user.SamAccountName) wurde erfolgreich erstellt."  
        }
    } catch {
        Write-Host "Fehler beim Erstellen von Benutzer $($user.SamAccountName): $_"  
    }
}

Write-Host "Skript abgeschlossen."