it-pro
Goto Top

AD User Import CSV

Hi,
Ich wollte mir mal den Spaß machen und mir mein eigenes Script zum Importieren von Usern aus einer CSV fürs Active Directory schreiben. Ich erhalte jedoch immer folgenden Fehler. Ich weiß aber nicht, wo er liegt und wie er zu beheben ist. Könnt ihr mir weiterhelfen?

New-ADUser : The parameter is incorrect
At C:\Users\USERNAME\Desktop\New-ADUserFromCSV.ps1:32 char:5

back-to-topNew-ADUser -Name 'Name1' `

back-to-top~~~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : InvalidOperation: (CN=Name1,CN=Use...Domain,DC=de:String) [New-ADUser], ADInvalidOperationException
+ FullyQualifiedErrorId : ActiveDirectoryServer:87,Microsoft.ActiveDirectory.Management.Commands.NewADUser

# CSV Datei zum Importieren
$Desktop = [Environment]::GetFolderPath([System.Environment+SpecialFolder]::Desktop).ToString()
$Datei = "$Desktop \NewUser.csv"  
$ADDomain = 'domain.com'  
$EMailDomain = 'emaildomain.de'  

# Importieren der CSV Informationen
$CSVImport = Import-Csv $Datei -Delimiter ";" -Encoding Default  

# Für jeden Datensatz im CSV
foreach ($Benutzer in $CSVImport)
{

    New-ADUser -Name 'Name1' `  
    -SamAccountName "$CSVImport.GivenName + '.' + $CSVImport.Surname" `  
    -GivenName "$CSVImport.GivenName" `  
    -Surname "$CSVImport.Surname" `  
    -DisplayName "$CSVImport.GivenName $CSVImport.Surname" `  
    -UserPrincipalName "$CSVImport.SamAccountName + $ADDomain" `  
    -AccountPassword ("$CSVImport.AccountPassword" | ConvertTo-SecureString -AsPlainText -Force) `  
    -EmailAddress "$CSVImport.GivenName + '.' + $CSVImport.Surname + $EMailDomain" `  
    -MobilePhone "$CSVImport.MobilePhone" `  
    -Title "$CSVImport.Title" `  
    -PostalCode "$CSVImport.PostalCode" `  
    -City "$CSVImport.City" `  
    -State "$CSVImport.State" `  
    -StreetAddress "$CSVImport.StreetAddress" `  
    -Department "$CSVImport.Department" `  
    -Division "$CSVImport.Division" `  
    -Description "$CSVImport.Description" `  
    -AllowReversiblePasswordEncryption $false `
    -Enabled $true `
    -OtherAttributes @{'telephoneNumber'="$CSVImport.telephoneNumber";'co'="$CSVImport.co";'c'="$CSVImport.c";'countryCode'="$CSVImport.countryCode";'msDS-cloudExtensionAttribute1'="$CSVImport.extensionAttribute1";'msDS-cloudExtensionAttribute2'="$CSVImport.extensionAttribute2";'msDS-cloudExtensionAttribute3'="$CSVImport.extensionAttribute3";'msDS-cloudExtensionAttribute4'="$CSVImport.extensionAttribute4";'msDS-cloudExtensionAttribute5'="$CSVImport.extensionAttribute5";'msDS-cloudExtensionAttribute6'="$CSVImport.extensionAttribute6";'msDS-cloudExtensionAttribute7'="$CSVImport.extensionAttribute7";'msDS-cloudExtensionAttribute8'="$CSVImport.extensionAttribute8";'msDS-cloudExtensionAttribute9'="$CSVImport.extensionAttribute9";'msDS-cloudExtensionAttribute10'="$CSVImport.extensionAttribute10";'msDS-cloudExtensionAttribute11'="$CSVImport.extensionAttribute11";'msDS-cloudExtensionAttribute12'="$CSVImport.extensionAttribute12";'msDS-cloudExtensionAttribute13'="$CSVImport.extensionAttribute13";'msDS-cloudExtensionAttribute14'="$CSVImport.extensionAttribute14";'msDS-cloudExtensionAttribute15'="$CSVImport.extensionAttribute15";}  
}

Content-ID: 665047

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

Ausgedruckt am: 21.11.2024 um 15:11 Uhr

147669
147669 23.03.2021 aktualisiert um 17:47:06 Uhr
Goto Top
Moin.
Ich weiß aber nicht, wo er liegt und wie er zu beheben ist.
Sorry wenn ich dich jetzt enttäuschen muss, aber so ziemlich alle Parameter und Variablen sind fehlerhaft face-wink.
Die Gründe:

  • Der größte Fehler : Du verwendest innerhalb der Foreach Schleife die falsche Variable. $CSVImport statt richtigerweise $Benutzer !!
Dann weiter:
  • Du fragst eine Property von einem Object innerhalb von Anführungszeichen ab, das geht aber nicht ohne Subexpression weil der Punkt schon kein Zeichen einer gültigen Variable ist. Außerdem ist sind die Anführungszeichen hier auch überflüssig.

Ergo: Sämtliche Parameter die sowas hier verwenden
"$CSVImport.GivenName"
sind fehlerhaft. Entweder du lässt die Anführungszeichen ganz weg weil eh überflüssig oder schreibst sie so wenn du unbedingt an den Anführungszeichen hängst so
"$($Benutzer.GivenName)"

Deswegen meckert die Shell auch weil dann die Parameter alle leer bzw. ungültige Werte haben !
  • Dann fehlen @ Zeichen im UPN usw.
  • Des weiteren überprüfst du überhaupt nicht ob es einen User mit dem jeweiligen SamAccountName bereits gibt.
  • Des weiteren gibst du jedem Nutzer den selben Namen = 'Name1' => ebenso Blödsinn.

Also nochmal ganz zurück ans Reißbrett, am besten vorher einen Kaffee schlürfen face-smile.
Gruß SK
IT-Pro
IT-Pro 23.03.2021 aktualisiert um 18:11:24 Uhr
Goto Top
Hi @147669. Danke dir erstmal für deine schnelle Antwort.

* Der größte Fehler : Du verwendest innerhalb der Foreach Schleife die falsche Variable. $CSVImport statt richtigerweise $Benutzer !!
Ich hatte mir die CSV mal importiert um die Autovervollständigung nutzen zu können. Unter der Variable $Benutzer fand er keines der Attribute, unter dem $CSVImport dann aber schon. Deshalb habe ich dann doch die $CSVImport genutzt.

Dann weiter:
  • Du fragst eine Property von einem Object innerhalb von Anführungszeichen ab, das geht aber nicht ohne Subexpression weil der Punkt schon kein Zeichen einer gültigen Variable ist. Außerdem ist sind die Anführungszeichen hier auch überflüssig.

Ohne Anführungszeichen hatte der irgendein anderes Problem, dass ich (scheinbar) dadurch lösen konnte. Daher habe ich dann die "" angefügt. Wenn ich die weglassen kann, ist mir das lieber.


Deswegen meckert die Shell auch weil dann die Parameter alle leer bzw. ungültige Werte haben !
  • Dann fehlen @ Zeichen im UPN usw.
Ich hatte vor dem Post nochmal was probiert und die $ADDOmain und $EMAILDOMAIN dafür geleert. Habe ich hier dann tatsächlich fürs posten wieder vergessen zu befüllen. War aber ansonsten drin. Ansonsten ist es ja kein technisches Problem, dass mein Script stoppt.
* Des weiteren überprüfst du überhaupt nicht ob es einen User mit dem jeweiligen SamAccountName bereits gibt.
Brauche ich nicht, weil das eher so ein Proof of Conzept ist und ich das Script nur schreibe um mal selbst eins für sowas geschrieben zu haben. Nehme aber es aber gern mit auf, wenn du was hast, dass ich copy&paste einfügen kann.

* Des weiteren gibst du jedem Nutzer den selben Namen = 'Name1' => ebenso Blödsinn.
Ja. Ist dem ganzen geschuldet, dass ich hier nur mal was testen will und es nicht wichtig ist, dass jeder NAME1 heißt. Das Attribut sorgt aber für was? Das ist der Anzeigename im ADUC.mmc?

LG
147669
147669 23.03.2021 aktualisiert um 18:31:19 Uhr
Goto Top
Zitat von @IT-Pro:
Ich hatte mir die CSV mal importiert um die Autovervollständigung nutzen zu können. Unter der Variable $Benutzer fand er keines der Attribute, unter dem $CSVImport dann aber schon. Deshalb habe ich dann doch die $CSVImport genutzt.
Dann hast du die Datei falsch importiert (z.B. falsches Trennzeichen oder keine Header). Wenn nur ein User im Object ist dann geht das ansonsten => NEIN!
Dann weiter:
  • Du fragst eine Property von einem Object innerhalb von Anführungszeichen ab, das geht aber nicht ohne Subexpression weil der Punkt schon kein Zeichen einer gültigen Variable ist. Außerdem ist sind die Anführungszeichen hier auch überflüssig.

Ohne Anführungszeichen hatte der irgendein anderes Problem, dass ich (scheinbar) dadurch lösen konnte.
Nein, dadurch hast du ganz andere Probleme, dann versucht die Shell nämlich die Variable $CSVImport aufzulösen und das ist ja ein Object mit vielen Eigenschaften, als Ergebnis hast du also unvorhersehbaren Datenmüll in den Parametern!

Nehme aber es aber gern mit auf, wenn du was hast, dass ich copy&paste einfügen kann.
$user = Get-ADUser -Filter {SamAccountName -eq ($Benutzer.GivenName + '.' + $Benutzer.Surname)}  
if (!$user){
    New-ADUser ................
}else{
    write-warning "Benutzer mit dem Namen '$($benutzer.Name)' existiert schon."  
}


* Des weiteren gibst du jedem Nutzer den selben Namen = 'Name1' => ebenso Blödsinn.
Ja. Ist dem ganzen geschuldet, dass ich hier nur mal was testen will und es nicht wichtig ist, dass jeder NAME1 heißt.
Der Name muss auch eindeutig sein sonst wirft die Shell einen Fehler. Wenn du nur einen User zum Testen in der CSV hast merkst du das natürlich nicht, außer du vergisst bei erneutem ausführen den User vorher zu löschen.
Das Attribut sorgt aber für was? Das ist der Anzeigename im ADUC.mmc?
Das auch aber vor allem wird aus ihm der sogenannte DistinguishedName des Users gebildet und ist der CN = CommonName, ergo dieser muss eindeutig sein weil der DN eindeutig in einer Domäne ist.
CN=Max Muster,OU=Marketing,DC=domain,DC=tld

Gruß SK
erikro
erikro 23.03.2021 aktualisiert um 22:38:57 Uhr
Goto Top
Moin,

Zitat von @IT-Pro:
Dann weiter:
  • Du fragst eine Property von einem Object innerhalb von Anführungszeichen ab, das geht aber nicht ohne Subexpression weil der Punkt schon kein Zeichen einer gültigen Variable ist. Außerdem ist sind die Anführungszeichen hier auch überflüssig.

Ohne Anführungszeichen hatte der irgendein anderes Problem, dass ich (scheinbar) dadurch lösen konnte. Daher habe ich dann die "" angefügt. Wenn ich die weglassen kann, ist mir das lieber.

Damit Du verstehst, was @schmitzkatze meint, hier ein Beispiel. Ich habe hier ein einfaches csv mit zwei Spalten Vorname und Name.

PS C:\data\test\csv> cat .\personen.csv
Vorname;Name
Hans;Meier
Frieda;Schulz
Carola;Müller

Das lese ich in eine Variable $personen ein.

PS C:\data\test\csv> $personen = Import-Csv .\personen.csv -Delimiter ";" -Encoding utf8  

Nun gebe ich diese Variable aus.

PS C:\data\test\csv> $personen

Vorname Name
------- ----
Hans    Meier
Frieda  Schulz
Carola  Müller

Die Variable enthält also die gesamte Tabelle inkl. Überschriften. Was ist das für ein Datentyp?

PS C:\data\test\csv> $personen.gettype()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object                                 System.Array

Es ist ein System.Array von Objekten. Und nun schauen wir mal, wie sich solche Objekte verhalten.

PS C:\data\test\csv> $personen.name
Meier
Schulz
Müller

Aha, wenn ich also eine Eigenschaft der im Array enhaltenen Objekte an den Namen des Arrays mit Punkt getrennt anhänge, so erhalte ich die Werte dieser Eigenschaft eines jeden einzelnen Objekts.

Jetzt machen wir das Experiment mal mit Anführungszeichen.

PS C:\data\test\csv> "$personen.name"  
  .name

Was ist jetzt los?

PS C:\data\test\csv> "$personen"  

PS C:\data\test\csv>

$personen ist jetzt plötzlich leer. Wie das? Das System.Array ist natürlich nicht leer, aber es wird nichts mehr zurückgegeben. Mit den Anführungszeichen zwingst Du die PS dazu, das Ergebnis als String auszugeben. Ein System.Array enhält aber nichts, was ein String wäre. Deshalb ist das Ergebnis leer. Kann man das umgehen? Nein. Auf dieser Ebenen nicht. Selbst eine Subexpression hilft da nicht weiter.

PS C:\data\test\csv> "$($personen)"  

PS C:\data\test\csv>

Ein System.Array enthält keinen String. Es kommt nichts zurück. Bei den Eigenschaften geht das sehr wohl.

PS C:\data\test\csv> "$($personen.name)"  
Meier Schulz Müller

Sieht bloß doof aus ohne Zeilenumbrüche. Ganz ohne Anführungszeichen war es schöner. face-wink Aber die Eigenschaft Name der Objekte enthält Strings und so kann man das auch als String ausgeben. Warum geht das hier?

Die Anführungszeichen haben noch einen anderen Effekt. Sie entheben den Punkt seiner besonderen Bedeutung. Ohne die Tüttelchen ist der Punkt das Trennzeichen zwischen einem Objekt und seinen Eigenschaften und ihren Untereigenschaften. Mit den Tüttelchen ist der Punkt einfach ein Punkt. Deshalb wird ohne die Subexpression so aufgelöst: Da steht ein $ also kommt ein Variablenname. p e r s o n . Halt! Ein Punkt ist im Variablennamen verboten. Also ist der Name zuende. Da ist kein String, also nix ausgeben. . n a m e ausgeben als .name. Fertig.

Mit Subexpression sieht das so aus:

Wieder wird mit dem $ eingeleitet, dass jetzt eine Variable kommt. Nun kommt aber die Klammer. Damit wird die PS angewiesen eine annonyme Varible anzulegen, die das Ergebnis der Subexpression enthält. Es wird also $personen.name aufgelöst. Das gibt, wie wir gesehen haben, die Liste der Namen aus. Das steht dann in der annonymen Variablen, die dann wieder auf der Konsole ausgegeben wird.

Noch lustiger wird es, wenn wir die Objekte selbst am Wickel haben.

PS C:\data\test\csv> foreach($person in $personen) {$person.name}
Meier
Schulz
Müller

Das war zu erwarten. Es werden die Namen ausgegeben. Wie Du siehst ganz ohne Tüttelchen. Einfach so $object.property. Und mit Tüttelchen?

PS C:\data\test\csv> foreach($person in $personen) {"$person.name"}  
@{Vorname=Hans; Name=Meier}.name
@{Vorname=Frieda; Name=Schulz}.name
@{Vorname=Carola; Name=Müller}.name

Was wir hier sehen, ist die Art, wie die PS Objekte und ihre Eigenschaften speichert: Als hash table. Das ist insgesamt ein String, den man als solchen auch ausgeben kann. Dann kommt der Punkt, der ja nur ein Punkt ist. Am Ende steht wieder name. Hier kann man das mit der Subexpression wieder umgehen.

PS C:\data\test\csv> foreach($person in $personen) {"$($person.name)"}  
Meier
Schulz
Müller

Das wäre aber ziemlich albern. Das macht nur so einen Sinn.

PS C:\data\test\csv> foreach($person in $personen) {"Hallo $($person.vorname)! Wie geht's?"}  
Hallo Hans! Wie geht's?  
Hallo Frieda! Wie geht's?  
Hallo Carola! Wie geht's?  

Und warum heißt das Subexpression? Weil man nicht nur eine Eigenschaft eines Objekts da reinschreiben kann, sondern ganze Subroutinen bzw. Funktionen, die diese enthalten. Ein kleines Beispiel:

PS C:\data\test\csv> "Es ist jetzt genau $(get-date -format HH:mm:ss)."  
Es ist jetzt genau 22:05:53.

Oder was für den Extremcoder:

PS C:\data\test\csv> foreach($person in $personen) {"Hallo $(if($person.vorname -eq "Hans"){"Herr "} else{"Frau "})$($person.name)! Wie geht's?"}  
Hallo Herr Meier! Wie geht's?  
Hallo Frau Schulz! Wie geht's?  
Hallo Frau Müller! Wie geht's?  

Wenn Du das durchdringen willst, solltest Du Dich mit zwei Dingen beschäftigen:

1. Objektorientierung
Das Mantra ist ähnlich wie bei Linux nicht everything is a file, sondern everything is an object. Die PS ist wirklich streng objektorientiert. Deshalb ist es unbedingt notwendig, sich klar zu machen, was das heißt.

2. Datentypen
Hierbei muss man sich dann wieder an 1. erinnern und begreifen, dass es die klassischen Datentypen (String, Date, Integer, Decimal ...) nur auf der Ebenen der Eigenschaften gibt und nie auf der Ebenen des Objekts selbst. Selbst eine einfache Stringvariable ist ein Objekt mit einer annonymen Eigenschaft, die den String enthält. Wäre dem nicht so, könnte ich keine Methoden auf diese Variable anwenden, denn Methoden kann ich nur auf Objekte anwenden. Aber das geht:

PS C:\data\test\csv> $string="Das ist ja doof."  
PS C:\data\test\csv> $string.replace("doof","toll")  
Das ist ja toll.

Und außerdem hat so eine Stringvariable noch eine weitere Eigenschaft: die Länge des Strings.

PS C:\data\test\csv> $string | select *

Length
------
    16
PS C:\data\test\csv> $string.Length
16

Und da sieht man auch, dass die Eigenschaft des Inhalts des Strings annonym ist. Sonst hätte sie select * mit ausgegeben.

So, nun bin ich aber ins Schwätzen gekommen. face-wink

Liebe Grüße

Erik

P.S.: Nachdem ich jetzt Korrektur gelesen habe, frage ich mich und jetzt auch Euch, ob ich das nicht kopieren und in den Tutorials veröffentlichen sollte.
IT-Pro
IT-Pro 24.03.2021 um 16:52:14 Uhr
Goto Top
Zitat von @147669:
Das auch aber vor allem wird aus ihm der sogenannte DistinguishedName des Users gebildet und ist der CN = CommonName, ergo dieser muss eindeutig sein weil der DN eindeutig in einer Domäne ist.
CN=Max Muster,OU=Marketing,DC=domain,DC=tld
Okay, dann werde ich das wieder aufnehmen, dasss dieser aus dem GivenName und Surname gwbildet wird. Ich dachte, es wäre eher kosmetischer Natur. Warum gibt es bei MS keine Dokumentation dafür, für was welches Attribut benutzt wird? Ich hatte insbesondere bei den extensionAttribute1 bis 15 gesucht aber nichts gefunden.
147669
147669 27.03.2021 aktualisiert um 11:00:34 Uhr
Goto Top
Zitat von @IT-Pro:
Warum gibt es bei MS keine Dokumentation dafür, für was welches Attribut benutzt wird?
Die gibt es schon man muss nur mit den richtigen Begriffen suchen (Active Directory Schema Attributes)
https://docs.microsoft.com/en-us/windows/win32/adschema/attributes-all
http://www.selfadsi.de/user-attributes.htm
Ich hatte insbesondere bei den extensionAttribute1 bis 15 gesucht aber nichts gefunden.
Das sind Attribute die der User frei für sich belegen kann.
IT-Pro
IT-Pro 28.03.2021 um 21:39:34 Uhr
Goto Top
Zitat von @147669:

Zitat von @IT-Pro:
Warum gibt es bei MS keine Dokumentation dafür, für was welches Attribut benutzt wird?
Die gibt es schon man muss nur mit den richtigen Begriffen suchen (Active Directory Schema Attributes)
https://docs.microsoft.com/en-us/windows/win32/adschema/attributes-all
http://www.selfadsi.de/user-attributes.htm
Ich hatte insbesondere bei den extensionAttribute1 bis 15 gesucht aber nichts gefunden.
Das sind Attribute die der User frei für sich belegen kann.


Das "extensionAttribute" oder msDS-cloudExtensionAttribute1 ist bei keinem deiner Links näher beschrieben. Beide Links kenne ich schon und habe ich gerade auf nochmal nachgeprüft. Bei SelfADSI ist es als existierend beschrieben aber nicht, was dort reinzuschreiben ist.
IT-Pro
IT-Pro 28.03.2021 aktualisiert um 21:45:06 Uhr
Goto Top
Zitat von @147669:

Nehme aber es aber gern mit auf, wenn du was hast, dass ich copy&paste einfügen kann.
> $user = Get-ADUser -Filter {SamAccountName -eq ($Benutzer.GivenName + '.' + $Benutzer.Surname)}  
> if (!$user){
>     New-ADUser ................
> }else{
>     write-warning "Benutzer mit dem Namen '$($benutzer.Name)' existiert schon."  
> }
> 
Dieses funktioniert nicht. Also ich habe mir die Dinge angepasst aber es funktioniert trotzdem nicht. Die PowerShell prüft aber selbst auf existenz, von daher reicht die Fehlerroutine der powerShell.

BTW. Musste ich hier und da doch wieder Anführungszeichen setzen. Bspw. beim Diesplayname oder sAMaccountname.
-SamAccountName "$($Benutzer.GivenName ).$($Benutzer.Surname)"  
147669
147669 28.03.2021 aktualisiert um 23:20:12 Uhr
Goto Top
Zitat von @IT-Pro:


Dieses funktioniert nicht.
Klar geht das und sogar sehr gut! Wenn man natürlich die Punkte mit ins Skript übernimmt ist man selbst schuld so dämlich kann man ja dann doch nicht sein 🙃.
Die PowerShell prüft aber selbst auf existenz, von daher reicht die Fehlerroutine der powerShell.
Ganz schlechter Stil und fällt dir bestimmt irgendwann wieder auf die Füße.

BTW. Musste ich hier und da doch wieder Anführungszeichen setzen. Bspw. beim Diesplayname oder sAMaccountname.
-SamAccountName "$($Benutzer.GivenName ).$($Benutzer.Surname)"  
Wenn man mit weiteren Strings Kombiniert sicher, aber nicht zwingend! Es gibt mehrere Methoden das zu realisieren, mit Subexpression innerhalb von Anführungszeichen wie du oder als Kombination mittels +
-SamAccountname ($Benutzer.GivenName + '.' + $Benutzer.Surname)  
Bitte dann noch nen Haken an den Post damit wir das hier abhaken können,Danke.
147669
147669 28.03.2021 aktualisiert um 23:31:07 Uhr
Goto Top
Zitat von @IT-Pro:
^^Zitat von [user:
Das "extensionAttribute" oder msDS-cloudExtensionAttribute1 ist bei keinem deiner Links näher beschrieben.
Nach dem hattest du ja auch nicht gefragt.
Die ms* Attribute sind
MS Anwendungs--/Applikationsspezifische Attribute und auf den jeweiligen Produktseiten, z.B. vom Exchange erläutert.
In einem AD kannst du auch selbst das Schema um benutzerdefinierte Attribute ergänzen, du wirst also nicht immer eine Erläuterung finden, aber in dem Fall ist es ein Attribut das im Zusammenhang mit der Azure Cloud genutzt wird
https://www.google.de/amp/s/ronnydejong.com/2015/09/14/use-custom-attrib ...
Man findet alles man muss sich nur etwas anstrengen und die richtigen Suchbegriffe benutzen. 😉
IT-Pro
IT-Pro 29.03.2021 um 09:23:21 Uhr
Goto Top
Zitat von @147669:

Zitat von @IT-Pro:
Das "extensionAttribute" oder msDS-cloudExtensionAttribute1 ist bei keinem deiner Links näher beschrieben.
Nach dem hattest du ja auch nicht gefragt.
Doch, 24.03. 2021, 16:52, letzter Satz.

Die ms* Attribute sind
MS Anwendungs--/Applikationsspezifische Attribute und auf den jeweiligen Produktseiten, z.B. vom Exchange erläutert.
In einem AD kannst du auch selbst das Schema um benutzerdefinierte Attribute ergänzen, du wirst also nicht immer eine Erläuterung finden, aber in dem Fall ist es ein Attribut das im Zusammenhang mit der Azure Cloud genutzt wird
https://www.google.de/amp/s/ronnydejong.com/2015/09/14/use-custom-attrib ...
Man findet alles man muss sich nur etwas anstrengen und die richtigen Suchbegriffe benutzen. 😉
Ich habe nach AAD und ExtensionAttribute gesucht. Habe auch bei Google mehrere Seiten geblättert, aber dieses Ergebnis war nicht dabei.
IT-Pro
IT-Pro 31.03.2021 aktualisiert um 08:58:39 Uhr
Goto Top
Das ist der aktuelle Stand. Findet jemand noch den inkorrekten Parameter? Ich hatte es auch schon bereits soweit, dass es funktionierte. Da hatte ich allerdings dazwischen geschmiert... Ich habe es dann nochmal ordentlich abgeschrieben und dabei noch irgendetwas vergessen.

Okay. ist nicht ganz die aktuellste Version, aber vllt findet jemand von hier aus eine elegantere Lösung, für die Fehler, die noch hierin enthalten sind...

# CSV Datei zum Importieren
$Desktop = [Environment]::GetFolderPath([System.Environment+SpecialFolder]::Desktop).ToString()
$Datei = "$Desktop\NewUser.csv"  
$OUPath = ''   
$ADDomain = '@'  
$EMailDomain = '@'  

# Importieren der CSV Informationen
$CSVImport = Import-Csv $Datei -Delimiter ";" -Encoding Default  

# Für jeden Datensatz im CSV
foreach ($Benutzer in $CSVImport)
{
        New-ADUser -Name "$($Benutzer.GivenName) $($Benutzer.Surname)" `  
		-GivenName $Benutzer.GivenName `
		-Surname $Benutzer.Surname `
		-DisplayName "$($Benutzer.GivenName) $($Benutzer.Surname)" `  
		-SamAccountName "$($Benutzer.GivenName).$($Benutzer.Surname)" `  
		-UserPrincipalName "$($Benutzer.GivenName).$($Benutzer.Surname)" + $ADDomain `  
		-AccountPassword ($Benutzer.AccountPassword | ConvertTo-SecureString -AsPlainText -Force) `
        -EmailAddress "$($Benutzer.GivenName).$($Benutzer.Surname)" + $EMailDomain `  
		-MobilePhone $Benutzer.MobilePhone `
		-Title $Benutzer.Title `
		-PostalCode $Benutzer.PostalCode `
		-City $Benutzer.City `
		-State $Benutzer.State `
		-StreetAddress $Benutzer.StreetAddress `
		-Department $Benutzer.Department `
		-Division $Benutzer.Division `
		-Description $Benutzer.Description `
		-AllowReversiblePasswordEncryption $false `
		-Enabled $true `
        -ChangePasswordAtLogon `
        -Path $OUPath `
        -OtherAttributes @{'telephoneNumber'=$Benutzer.telephoneNumber; `  
			'co'=$Benutzer.co; `  
			'c'=$Benutzer.c; `  
			'countryCode'=$Benutzer.countryCode; `  
			'msDS-cloudExtensionAttribute1'=$Benutzer.extensionAttribute1; `  
			'msDS-cloudExtensionAttribute2'=$Benutzer.extensionAttribute2; `  
			'msDS-cloudExtensionAttribute3'=$Benutzer.extensionAttribute3; `  
			'msDS-cloudExtensionAttribute4'=$Benutzer.extensionAttribute4; `  
			'msDS-cloudExtensionAttribute5'=$Benutzer.extensionAttribute5; `  
			'msDS-cloudExtensionAttribute6'=$Benutzer.extensionAttribute6; `  
			'msDS-cloudExtensionAttribute7'=$Benutzer.extensionAttribute7; `  
			'msDS-cloudExtensionAttribute8'=$Benutzer.extensionAttribute8; `  
			'msDS-cloudExtensionAttribute9'=$Benutzer.extensionAttribute9; `  
			'msDS-cloudExtensionAttribute10'=$Benutzer.extensionAttribute10; `  
			'msDS-cloudExtensionAttribute11'=$Benutzer.extensionAttribute11; `  
			'msDS-cloudExtensionAttribute12'=$Benutzer.extensionAttribute12; `  
			'msDS-cloudExtensionAttribute13'=$Benutzer.extensionAttribute13; `  
			'msDS-cloudExtensionAttribute14'=$Benutzer.extensionAttribute14; `  
			'msDS-cloudExtensionAttribute15'=$Benutzer.extensionAttribute15;}  
    
    }
em-pie
em-pie 03.04.2021 um 09:53:07 Uhr
Goto Top
Moin,

da du mich per PN angeschrieben hast, ob ich hier unterstützen kann:
Testen kann ich dein Script nicht (habe keine Testumgebung zur Hand), aber wenn ich mir die Doku zum New-ADUser anschaue, fällt mir folgendes auf:

Zeile 34: da scheint ein Wert zu fehlen. Versuche mal
 -ChangePasswordAtLogon $True 

Ansonsten auch mal prüfen, was passiert, wenn ein Parameter nicht gefüllt wird. Also z.B. deine Spalte "Beschreibung" ist in der CSV leer. Wie verhält sich dann das Powershell-Script?

Gruß
em-pie
IT-Pro
IT-Pro 03.04.2021 um 14:45:08 Uhr
Goto Top
Zitat von @em-pie:

Moin,

Zeile 34: da scheint ein Wert zu fehlen. Versuche mal
 -ChangePasswordAtLogon $True 
Ja, der Fehler ist bereits behoben. Damit also nicht der Auslöser für das Problem.
Ansonsten auch mal prüfen, was passiert, wenn ein Parameter nicht gefüllt wird. Also z.B. deine Spalte "Beschreibung" ist in der CSV leer. Wie verhält sich dann das Powershell-Script?
Hat eigentlich problemlos funktioniert!


Das Problem ist, dass angeblich während des Ausführens noch ein Paramter inkorrekt ist.
em-pie
em-pie 03.04.2021 aktualisiert um 18:06:20 Uhr
Goto Top
Dann arbeite mal ein try... catch.. mit ein und schaue, was er genau ausspuckt.
https://www.reddit.com/r/PowerShell/comments/41sq2i/output_logs_for_batc ...
Alternativ schaue einfach mal, dass du den Befehl New-ADUser nicht ausführst, sondern mal als Aoutput irgendwo hinschreibst. Dann solltest du ggf. schon sehen, wo der Fehler steckt.

Ansonsten gehe ich davon aus, dass die Variablen in den Zeilen 5, 6, 7 gefüllt sind und es den OU-Path so auch im AD gibt!

Edit:
Ferner mal als ersten Parameter -WhatIf einbinden und alle anderen Zeilenweise auskommentieren.
Danach dann immer ausführen und Zeile für Zeile die Parameter mit rein nehmen und schauen, wie sich das dann verhält.
Kannst du ja auch alternativ in 5er Blöcken machen...

Edit2:
Dein AD hat aber auch einen Teil in der Azure-Cloud, oder?
Ich frage bzgl. der msDS-cloudExtensionAttribute1, die es erst im AD-Schema gibt, wenn ein Azure-Sync existiert.
IT-Pro
IT-Pro 06.04.2021 um 15:14:44 Uhr
Goto Top
Zitat von @em-pie:
Danke dir erstmal erneut für deine Hilfe!


Dann arbeite mal ein try... catch.. mit ein und schaue, was er genau ausspuckt.
Werde ich tun, als zweiten Ansatz. Erstmal werde ich den Befehl in eine Datei umleiten.

Alternativ schaue einfach mal, dass du den Befehl New-ADUser nicht ausführst, sondern mal als Aoutput irgendwo hinschreibst. Dann solltest du ggf. schon sehen, wo der Fehler steckt.

Ansonsten gehe ich davon aus, dass die Variablen in den Zeilen 5, 6, 7 gefüllt sind und es den OU-Path so auch im AD gibt!
Ja, sind gefüllt. Selbst wenn nicht, funktioniert das ganze trotzdem. (Bereits mal versehentlich getestet)
Edit:
Ferner mal als ersten Parameter -WhatIf einbinden und alle anderen Zeilenweise auskommentieren.
Danach dann immer ausführen und Zeile für Zeile die Parameter mit rein nehmen und schauen, wie sich das dann verhält.
Kannst du ja auch alternativ in 5er Blöcken machen...
Oder das... Werde ich als erstes Testen. Klingt am wirkungsvollsten.
Edit2:
Dein AD hat aber auch einen Teil in der Azure-Cloud, oder?
Ich frage bzgl. der msDS-cloudExtensionAttribute1, die es erst im AD-Schema gibt, wenn ein Azure-Sync existiert.
Ja, genau deswegen mache ich ja das Script um diese besonderen Attribute easy zu füllen.