[PowerShell] New-ADObject stößt Fehlermeldung aus wenn leerer Wert übermittelt wird

crashbandicot

Commander
Registriert
Dez. 2013
Beiträge
2.981
Hi,

ich habe eine .csv mit mehreren tausend Zeilen. Pro Zeile, und damit pro Objekt, gibt es bis zu 20 Werte die übergeben werden. Die Separierung zwischen den Werten erfolgt mittels Semikolon. Jetzt hat nicht jedes Objekt alle 20 Werte gefüllt. Stoße ich den Importvorgang an (New-ADObject) und das Script läuft auf einen leeren Wert, kommt es zu einer Fehlermeldung und das Objekt wird nicht angelegt.

Jemand ne Idee wie man das abfangen kann? Ich möchte nur ungerne mit if-Abfragen arbeiten, das bläht alles nur unnötig auf.
 
Code:
-ErrorAction SilentlyContinue
könntest du als Parameter versuchen. Aber ob das dein eigentliches Ziel ist, kann ich dir nicht sagen. Es hat wohl seinen Grund, warum ein leerer String o.ä. entsprechend validiert wird.

Oder wird allgemein nur gemeckert, weil der Parameter leer übergeben wurde? Dann könntest du dir die entsprechenden Parameter in ne Hashtable oder ein Array legen und mittels Splatting nur die passenden Parameter übergeben.
Code:
$params = @{}
if( $foo ) { $params["foo"] = "bar" }
// if( ... )

New-ADObject @params
Ggf. auch ein Objekt vorbereiten und einfach ins Cmdlet pipen (weiß nur nicht inwiefern das Cmdlet das Piping zulässt...)
Code:
$params = New-Object psobject
if( $foo ) { $params | add-member foo bar }
// ...

$params | New-ADObject
 
@leipziger1979
Ich hatte immer nach "empty value" gesucht, versuche gleich mal deinen Vorschlag.

@Yuuri
Ich denke dass gemeckert wird weil der Befehl einen Wert in das Attributsfeld schreiben möchte, dieser Wert aber leer ist. Ich gucke mir gleich mal deine Ideen an.
 
Der Befehl New-ADObject hat ja einige Parameter die auf Required stehen.
Diese müssen auch zwingend befüllt werden, damit der Befehl erfolgreich ist. Ist das denn der Fall?
Falls ja kannst du einfach mit
Code:
 -ErrorAction SilentlyContinue
arbeiten.

Ansonsten musst du sicherstellen, dass falls ein column leer ist, aber gebraucht wird..
Code:
if ($? -eq NULL)

.. ein entsprechender "Platzhalter" dort eingetragen wird.

Wie immer am besten mal den relevanten Code posten (wenn es nicht geheim ist), dann kann man am besten weiterhelfen..
 
Geheim ist da gar nichts, ist auch nur ein Zweizeiler (bis jetzt)

Code:
$file = "C:\Users\%\Desktop\Firmenkontakte.csv"
Import-Csv $file -Encoding UTF7 -Delimiter ";" | foreach{New-ADObject -Type Contact -Name $_.Name -OtherAttributes @{'title'=$_.Position;'company'=$_.Firma;'co'=$_.Land;'streetAddress'=$_.Adresse;'l'=$_.Ort;'department'=$_.Abteilung;'telephoneNumber'=$_.Telefon;'mobile'=$_.Mobiltelefon;'homePhone'=$_.Privat;'facsimileTelephoneNumber'=$_.Fax;'mail'=$_.Email;'info'=$_.Ansprechpartner} -Path "OU=Kontakte,DC=test,DC=umgebung,DC=local"}

Ist jetzt z.B. die Faxnummer in der csv nicht vorhanden, bricht mir das New-ADObject an der Stelle ins Essen. ;)
 
Auch mit
Code:
-ErrorAction SilentlyContinue
am Ende?
 
Konnte ich noch nicht testen, mache ich morgen.
Ergänzung ()

Auch mit einem -EA SilentlyContinue geht es nicht.

Code:
New-ADObject : The server is unwilling to process the request
 
Zuletzt bearbeitet:
Genaue Fehlermeldung in der Console?
 
Fehlermeldung:
Code:
New-ADObject : The server is unwilling to process the request
At C:\Users\%\Desktop\CreateContacts.ps1:2 char:58
+ Import-Csv $file -Encoding UTF7 -Delimiter ";" | foreach{New-ADObject -Type Cont ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (cn=Vorname...DC=umgebung,DC=local:String) [New-ADObject], ADException
    + FullyQualifiedErrorId : ActiveDirectoryServer:0,Microsoft.ActiveDirectory.Management.Commands.NewADObject
 
Nachdem du die Daten importiert hast, solltest du zuerst eine Datenbereinigung durchführen. z.B:

Code:
$contacts | ?{$_.Foo-eq "" -or $_.Foo -eq $null}

und dann entsprechend anpassen. Natürlich ist dies von der Menge abhängig.

Oder:

Allte Attribute zuerst in eine temporäre Variable schreiben:

Code:
$foo = if($bar -eq $null){"PLATZHALTER"}else{$bar}
 
Mit diesem "foo" kenne ich mich noch nicht aus. Muss mich da wohl noch einmal reinknien. ;)
 
https://de.wikipedia.org/wiki/Fubar#Foo_im_IT-Umfeld schrieb:
In der Informationstechnik werden die Begriffe foo, bar und foobar auch als Platzhalter und Beispielnamen (Metasyntaktische Variablen) für Routinen, Funktionen, Prozesse, Variablennamen etc. verwendet. Wenn in einem Beispiel drei Platzhalternamen benötigt werden, wählt man hierfür oft foo, bar, baz.
Ist einfach nur ein Platzhalter für deine Variablen - ne einfache Illustration.

Du wirst ergo nicht drum rum kommen die Parameter ordentlich zu validieren und korrekt zu übergeben. Siehe dazu meine letzten beiden Schnipsel in #3.
 
Yuuri schrieb:
Ist einfach nur ein Platzhalter für deine Variablen - ne einfache Illustration.
Deswegen auch der ";)". :D

Yuuri schrieb:
Du wirst ergo nicht drum rum kommen die Parameter ordentlich zu validieren und korrekt zu übergeben. Siehe dazu meine letzten beiden Schnipsel in #3.
Habe ich mir schon gedacht. Hat zum Glück keine Eile, kann mich da am Wochenende mal ransetzen.
 
Zurück
Oben