New-ADUser (optional Parameter)
Hallo zusammen,
mittels New-ADUser möchten wir mehrere Userkonten anlegen.
Allerdings haben nicht alle Benutzer eine E-Mail Adresse, bei diesen ist dann das Feld in der CSV leer.
Gibt es eine Möglichkeit bestimmte Parameter als optional zu kennzeichnen, damit der Befehl nicht abgebrochen wird wegen einem Fehler?
Also eigentlich ein wenn Parameter Variable leer dann nicht nutzen.
Ich hätte schon im Internet gesucht, aber konnte nur Anleitungen finden wie man es realisert wenn man sich selbst eine Funktion schreiben würde.
Danke!
LG mcdy
mittels New-ADUser möchten wir mehrere Userkonten anlegen.
Allerdings haben nicht alle Benutzer eine E-Mail Adresse, bei diesen ist dann das Feld in der CSV leer.
Gibt es eine Möglichkeit bestimmte Parameter als optional zu kennzeichnen, damit der Befehl nicht abgebrochen wird wegen einem Fehler?
Also eigentlich ein wenn Parameter Variable leer dann nicht nutzen.
Ich hätte schon im Internet gesucht, aber konnte nur Anleitungen finden wie man es realisert wenn man sich selbst eine Funktion schreiben würde.
Danke!
LG mcdy
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 322304
Url: https://administrator.de/contentid/322304
Ausgedruckt am: 22.11.2024 um 04:11 Uhr
13 Kommentare
Neuester Kommentar
Zitat von @mc-doubleyou:
gute Idee und da dann also immer erst Prüfung ob Variable leer und wenn nicht dann Set-ADUser -Parameter
Ja das musst du, denn mit Set-AdUser musst du wenn du ein Feld auf Null setzt statt -Replace den Parameter -Clear benutzen weil -replace keine leeren Werte erlaubt!gute Idee und da dann also immer erst Prüfung ob Variable leer und wenn nicht dann Set-ADUser -Parameter
Das lässt sich kompakter schreiben indem man die Felder der CSV filtert welche einen leeren Wert haben und welche nicht. D.h. Mit Get-Member alle Spaltennamen holen und dann per Schleife über die Namen prüfen ob Feld leer oder nicht.
Bsp.
$csv = Import-CSV ................
$fields = $csv | gm -Membertype NoteProperty | ?{$_.Name -ne 'SamAccountName'} | Select -Expand Name
foreach ($line in $csv){
$user = Get-AdUser $line.SamAccountName -EA Ignore
If ($user){
$empty = @(); $notempty = @{}
$fields | %{
If ($line.$_ -ne ""){
$notempty.$_ = $line.$_
}else{
$empty += $_
}
}
Set-Aduser $_.SamAccountName -replace $notempty -clear $empty
}
}
Gruß
Zitat von @mc-doubleyou:
Hallo mikrotik,
also da komm ich jetzt nicht ganz mit was du meinst Oo
Ich habe eine CSV und diese wird importiert, folgende Felder sind nicht immer definiert und würden daher einen Fehler liefern weil der Parameter keinen Wert hat:
Ja.Hallo mikrotik,
also da komm ich jetzt nicht ganz mit was du meinst Oo
Ich habe eine CSV und diese wird importiert, folgende Felder sind nicht immer definiert und würden daher einen Fehler liefern weil der Parameter keinen Wert hat:
- Fax
- Handy
Fax und Handy ist eine 0 also nicht so schlimm, E-Mail wäre aber wirklich leer.
OkWenn ich nun, wie Dani meinte, mit New-ADUser alle definiere die sicher nicht leer sind und dann diese drei mit
dann ist mir die Lösung klar.
Mit deinem Ansatz würde ich doch nur ein bereits volles AD Feld wieder löschen, oder?
Wenn in deiner CSV nicht immer die vollständig gewünschten Daten drin stehen dann ja, ich ging davon aus das in der CSV alle Daten des Users drin stehen, d.h. wenn dort ein Feld leer ist dann soll es auch im AD leer gemacht werden.> if (!(!$email)) { Set-AdUser -EmailAddress $email }
> if (!(!$fax)) { Set-AdUser -Fax $fax }
> if (!(!$handy)) { Set-AdUser -MobilePhone $handy }
>
Mit deinem Ansatz würde ich doch nur ein bereits volles AD Feld wieder löschen, oder?
Aber das kannst du oben ganz einfach anpassen indem du das -Clear Flag weglässt
Kommt halt drauf an wie euer Workflow ist.
Mit obigem sparst du dir halt sämtliche einzelnen Set-ADUser Schreibzugriffe und reduzierst das auf einen einzigen.
Du kannst auch das $user Objekt selber verändern und am Schluss an Set-AdUser pipen dann braucht man auch nicht mehrfach mit seit-Aduser hantieren, denn das kostet einfach zu viele Resourcen wenn man für ein und den selben User 10mal Set-Aduser aufruft.
Es gibt 1000 Wege nach Rom
Das obige Script macht nichts anderes als gefüllte Felder in eine Hashtable zu schreiben die dann an Set-Aduser -Replace gefüttert wird. Wenn du leere Felder in der CSV nicht am AD Objekt ändern willst lässt du im Set-Aduser Befehl einfach das -Clear Flag und das Array der leeren Spalten weg.
Wohl noch nicht so lange dabei was
Na dann hier der obige Code nochmal mit Kommentaren
Statt jede Spalte der CSV manuell zu prüfen macht das der obige Code über eine zusätzliche Schleife über die CSV-Spaltennamen, und das spart Zeilen wenn es um eine Menge Spalten geht.
Das ganze spart halt das andauernde Variablen erstellen und prüfen jeder einzelnen Spalte separat und reduziert somit den Codeaufwand, und das war ja wie du geschrieben hast dein primäres Ziel.
Na dann hier der obige Code nochmal mit Kommentaren
# CSV importieren ...
$csv = Import-CSV ................
# Überschriften der CSV ermitteln und SamAccountName Spalte excluden (wollen wir ja nicht ändern :-))
$fields = $csv | gm -Membertype NoteProperty | ?{$_.Name -ne 'SamAccountName'} | Select -Expand Name
# Für jede Zeile der CSV:
foreach ($line in $csv){
#userobject holen
$user = Get-AdUser $line.SamAccountName -EA Ignore
If ($user){
# ein Array das die Spalten enthalten soll dievLeer sind, und eine Hashtable die hinterher die nicht leeren Felder mit deren Werten enthält
$empty = @(); $notempty = @{}
# Array der Spaltennamen durchlaufen
$fields | %{
# wenn Spalte der aktuellen Zeile nicht leer ist
If ($line.$_ -ne ""){
# füge sie zur Hashtabke hinzu
$notempty.$_ = $line.$_
}else{
#Spalte ist leer also füge den Namen zum Array $empty hinzu
$empty += $_
}
}
# setze die Informationen im Account per replace Parameter und clear parameter (steht ja in der Doku was diese machen!)
Set-Aduser $_.SamAccountName -replace $notempty -clear $empty
}
}
Das ganze spart halt das andauernde Variablen erstellen und prüfen jeder einzelnen Spalte separat und reduziert somit den Codeaufwand, und das war ja wie du geschrieben hast dein primäres Ziel.
Zitat von @mc-doubleyou:
Hab eben dein Script versucht und verstehe jetzt wie es funktioniert, es baut einfach darauf auf, dass der Titel der Spalte dem AD Attribut entspricht.
Ist aber bei mir nicht der Fall weil die Namen der AD Attribute nicht jeder verstehen würde, auch ich tue mir da zugegebenermaßen auch noch etwas schwer.
Das zu implementieren wäre aber ein leichtes. Dazu würde man einfach eine weitere Mapping-Tabelle mit einer Hashtable erstellen die die tatsächlichen AD-Attribute auf die in der CSV genutzen umsetzt und nutzt dann diese in der Schleife.Hab eben dein Script versucht und verstehe jetzt wie es funktioniert, es baut einfach darauf auf, dass der Titel der Spalte dem AD Attribut entspricht.
Ist aber bei mir nicht der Fall weil die Namen der AD Attribute nicht jeder verstehen würde, auch ich tue mir da zugegebenermaßen auch noch etwas schwer.
Somit wird es vorerst bei einem größeren Codeaufwand, wie oben geschrieben bleiben, immerhin mach ich dann nur einmal
Eigentlich nicht, s.o.Für den Lerneffekt habe ich aber trotzdem noch paar kurze Fragen.
wird da durch das ?{} exkludiert?
Nein das ist eine Abkürzung für das CMDLet where-object, es werden also nur Objekte in der Pipeline übernommen dessen Eigenschaft nicht gleich "SamAccountName" ist.?{$_.Name -ne 'SamAccountName'}
-EA Ignore
$fields | %{
If ($line.$_ -ne "")
if (!line.$_)
$empty += $_
Gruß
Zitat von @mc-doubleyou:
Ich muss wohl nochmal das Skript überarbeiten weil paar Parameter viel Rot liefern.
Darum würde mich interessieren wie das mit der Hashtable Übersetzung funktionieren könnte.
Ich muss wohl nochmal das Skript überarbeiten weil paar Parameter viel Rot liefern.
Darum würde mich interessieren wie das mit der Hashtable Übersetzung funktionieren könnte.
# CSV importieren ...
$csv = Import-CSV ................
# Zuordnungstabelle von Spalten der CSV zu Active Directory Attributen
$map = @{
'deinecsvspalte1' = 'activedirectoryattribut1'
'deinecsvspalte2' = 'activedirectoryattribut2'
}
# Überschriften der CSV ermitteln und SamAccountName Spalte excluden (wollen wir ja nicht ändern :-), wenn die Spalte in deiner CSV anders heißt natürlich anpassen)
$fields = $csv | gm -Membertype NoteProperty | ?{$_.Name -ne 'SamAccountName'} | Select -Expand Name
# Für jede Zeile der CSV:
foreach ($line in $csv){
#userobject holen
$user = Get-AdUser $line.SamAccountName -EA Ignore
If ($user){
# ein Array das die Spalten enthalten soll dievLeer sind, und eine Hashtable die hinterher die nicht leeren Felder mit deren Werten enthält
$empty = @(); $notempty = @{}
# Array der Spaltennamen durchlaufen
$fields | %{
# wenn Spalte der aktuellen Zeile nicht leer ist
If ($line.$_ -ne ""){
# füge sie zur Hashtable hinzu (inkl. Umwandlung durch Attributmapping)
$notempty.($map[$_]) = $line.$_
}else{
# Spalte ist leer also füge den Namen zum Array $empty hinzu
$empty += $_
}
}
# setze die Informationen im Account per replace Parameter und clear parameter (steht ja in der Doku was diese machen!)
Set-Aduser $_.SamAccountName -replace $notempty -clear $empty
}
}
wird es nicht zwangsweise rot.
Ich werd auch gleich rot