78370
Goto Top

AD User anpassen mittels Powershell und Dateiquelle (CSV)

Hallo Forum,

nach langer Zeit hab ich mal wieder eine Frage, die mich zum verzweifeln bringt. Google und Co hat mir bis jetzt leider nicht helfen können.

Folgender Sachverhalt: Ich habe aus dem AD eine CSV gezogen mit den aktuellen Userdaten und benötigten Feldern. Diese wurde dann von der Personalabteilung bearbeitet und soll jetzt korrigiert zurück ins AD. Die Dateiquelle ist eine CSV Datei, wie beim Export. Es sollen alle Felder im AD einfach überschrieben werden.

Folgendes Script hab ich erstellt:

$cv = Import-CSV c:\temp\test.csv -delimiter ';'  

foreach ($User in $cv){
Set-ADUser $User.name -Add @{title = $User.title; department = $User.department; mail = $User.mail; telephoneNumber = $User.telephoneNumber; facsimileTelephoneNumber = $User.facsimileTelephoneNumber; mobile = $User.mobile; company = $User.company; streetAddress = $User.streetAddress; postalCode = $User.postalCode}
}

Dieses generiert dann folgenden Fehler:

Set-ADUser : Unter "DC=XXX-dom,DC=XXXXX,DC=de" kann kein Objekt mit der ID "XXXXX" gefunden werden.

Der User existiert natürlich im AD, es gibt auch keinen Schreibfehler in der CSV Datei, mit anderen Usern erscheint die gleiche Fehlermeldung. Die Domäne in der er sucht ist auf jeden Fall die Richtige, die Powershell ISE führe ich als DomainAdmin aus.

Habt ihr ne Idee, woran es liegt? Vielen Dank im Voraus für die Hilfe.

Content-ID: 370650

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

Ausgedruckt am: 22.11.2024 um 18:11 Uhr

135799
135799 10.04.2018 aktualisiert um 10:56:56 Uhr
Goto Top
$User.name
Nutze den SamAccountName statt dem Namen und statt -Add nutze besser -Replace und !Achtung! Wenn die Felder leer sein sollten bringen diese dir Fehler, die musst du dann mit dem Parameter -Clear behandeln!!

Gruß Schnuffi
78370
78370 10.04.2018 um 10:58:41 Uhr
Goto Top
Hallo Schnuffi face-smile

In der CSV hab ich aber nur das Feld "name", ist der SammAccountName nicht ein anderes Feld im AD oder beinhaltet es den selben Wert?

Ich wollte -Add genau aus dem Grund nutzen, weil ich gelesen hab das es mit Replace bei leeren Feldern zu Problemen kommt. Wie funktioniert dann das -Replace genau im zusammenhang mit dem Befehl -Clear? Hast Du da ein Beispiel für mich?
135799
135799 10.04.2018 aktualisiert um 11:02:00 Uhr
Goto Top
Zitat von @78370:
In der CSV hab ich aber nur das Feld "name", ist der SammAccountName nicht ein anderes Feld im AD oder beinhaltet es den selben Wert?
Nein das sind zwei unterschiedliche Felder!

Ich wollte -Add genau aus dem Grund nutzen, weil ich gelesen hab das es mit Replace bei leeren Feldern zu Problemen kommt. Wie funktioniert dann das -Replace genau im zusammenhang mit dem Befehl -Clear? Hast Du da ein Beispiel für mich?
Ich hol mir immer das Objekt mit Get-ADUser und dann setze ich die Eigenschaften im Objekt um es zum Schluss dann mit
Set-ADUser -Instance $obj
zurückzuschreiben. Simple but effective face-smile.
it-frosch
it-frosch 10.04.2018 aktualisiert um 11:11:55 Uhr
Goto Top
Hallo BOfH,

In der CSV hab ich aber nur das Feld "name", ist der SammAccountName nicht ein anderes Feld im AD oder beinhaltet es den selben Wert?
Lies dir doch mal für einen ADUser alle Felder aus dem AD aus, ich denke dann findest du die Antwort.

get-aduser SAMAccountName Properties *

Der name ist nur eine Eigenschaft des SAMAccountName.

grüße from it-frosch
78370
78370 10.04.2018 um 11:51:01 Uhr
Goto Top
Ich hab jetzt nochmal die Daten aus dem AD gezogen, den samAccountName in der CSV ergänzt zum Name und das Skript dazu passend nochmal zusammengebaut, aus einem anderen Beitrag hier im Forum. Damit bekomme ich keine Fehlermeldung mehr, allerdings passiert auch nichts im AD. Muss da noch irgendwas mit rein? Gibt es die Möglichkeit, die Aktion in einer Logdatei zu protokollieren?

Import-Module ActiveDirectory
$OU_ADUSER="OU=Benutzer,OU=Burg,DC=XXXX,DC=XXXX,DC=de"  
$userCSV="C:\temp\test.csv"  
Import-Csv $userCSV -delimiter ';' | %{   
  $csv_username = $_.SAMAccountName 
  $user = Get-aduser -Filter * -SearchBase $OU_ADUSER | ?{$_.sAMAccountName -eq $csv_username} 
  if ($user){ 
        Set-Aduser -Identity $_.sAMAccountName -Replace @{title = $User.title; department = $User.department; mail = $User.mail; telephoneNumber = $User.telephoneNumber; facsimileTelephoneNumber = $User.facsimileTelephoneNumber; mobile = $User.mobile; company = $User.company; streetAddress = $User.streetAddress; postalCode = $User.postalCode 
  }else{}}}
135799
135799 10.04.2018 aktualisiert um 11:55:06 Uhr
Goto Top
Kein wunder das das nicht klappt ...wenn du die Eigenschaften des Objekts durch die des Objekts selbst ersetzt face-smile.
Hier findest du alles was du brauchst ...
New-ADUser (optional Parameter)
78370
78370 10.04.2018 um 12:49:06 Uhr
Goto Top
Ok, ich hab mir den Thread durchgelesen, bin aber scheinbar noch zu grün hinter den Ohren, um daraus die Lösung zu kreieren für meinen Fall. Den Schalter -Clear kann ich auf jeden Fall übernehmen, denn was in der CSV leer ist, soll es auch im AD Feld sein letztlich.
Ich denke auch ich hab verstanden das er sich den User aus dem AD nimmt und dann mit dem Daten aus dem AD ersetzt, denn ich ich frag den User ab in die Variable $User uns Replace aus der selber Variable. Jetzt dachte ich es müsste ja gehen wenn ich die Replacevariable ändere in die $userCSV, wo ja meine CSV Daten drin liegen, ändert aber nichts, ich bekomme keine Fehlermeldung und keine Änderung im AD. War die Änderung dann jetzt richtig oder ist es unnütz und der Fehler noch ganz woanders?
135799
135799 10.04.2018 aktualisiert um 13:02:58 Uhr
Goto Top
@{title = $User.title;
Guck doch mal genau hin, du nimmst als Daten nicht die Eigenschaften der CSV sonder die des aktuellen Objekts im AD !
Noch kein Kaffee gehabt face-smile?
78370
78370 10.04.2018 um 13:15:42 Uhr
Goto Top
Ich trink gar keinen Kaffee, sollte es aber eventuell versuchen ;)

Wie schon geschrieben, hab ich genau die Stelle geändert nach deinem Tipp, Ergebnis bleibt aber das Gleiche. Hier nochmal der vollständige Code, hab ich noch etwas vergessen?

Import-Module ActiveDirectory
$OU_ADUSER="OU=Benutzer,OU=Burg,DC=XXXX,DC=XXXX,DC=de"  
$userCSV="C:\temp\test.csv"  
Import-Csv $userCSV -delimiter ';' | %{   
  $csv_username = $_.SAMAccountName 
  $user = Get-aduser -Filter * -SearchBase $OU_ADUSER | ?{$_.sAMAccountName -eq $csv_username} 
  if ($user){ 
    # User wurde gefunden, ändere die Eigenschaften 
    Set-Aduser -Identity $_.sAMAccountName -Replace @{title = $Usercsv.title; department = $Usercsv.department; mail = $Usercsv.mail; telephoneNumber = $Usercsv.telephoneNumber; facsimileTelephoneNumber = $Usercsv.facsimileTelephoneNumber; mobile = $Usercsv.mobile; company = $Usercsv.company; streetAddress = $Usercsv.streetAddress; postalCode = $Usercsv.postalCode 
  }else{}}}
135799
135799 10.04.2018 aktualisiert um 13:30:24 Uhr
Goto Top
Wieder falsch, ein String hat keine Eigenschaften, die Eigenschaften der Schleife fragst du mit $_.Eigenschaft ab! Genau so steht es ja eigentlich auch in dem Beitrag wo du es kopiert hast!

Du siehst Copy n' Paste bringt dich nicht weiter.

Sorry das wird mir jetzt zu blöd, ich bin raus.

Viel Erfolg, ciao.
78370
78370 10.04.2018 um 13:48:44 Uhr
Goto Top
Wie bereits 3 Beiträge weiter oben erwähnt hab ich das Skript aus dem Forum hier kopiert und angepasst, du scheinst immer nur die Hälfte der Beiträge zu lesen und deine Tipps bringen mich auch nicht weiter. Ich bin gerne bereit mir durch nachlesen etwas anzueignen, ich würde nur gerne konkret wissen an welcher Stelle. Vielleicht kann mir jemand anderes auf die Sprünge helfen bei dem Thema.
fireblade09
fireblade09 10.04.2018 um 14:56:04 Uhr
Goto Top
Was schnuffi dir sagen wollte: $Usercsv.title , $Usercsv.department, $Usercsv.mail, etc. geht nicht, es muss $_.title , $_.department , $_.mail , etc. heissen
78370
78370 11.04.2018 um 09:05:18 Uhr
Goto Top
Hi Fireblade09,

Danke, für die Info. Ich hab das im Skript angepasst, ändert aber nach wie vor nichts im AD. Ich denke ich frage immer noch die Daten zum ändern aus dem AD ab und nicht aus der CSV Datei da er ja sonst bei den leeren Feldern abbrechen müsste.

$user = Get-aduser -Filter * -SearchBase $OU_ADUSER | ?{$_.sAMAccountName -eq $csv_username} 
  if** ($user)**{ 

Eigentlich müsste ich doch an der Stelle nicht den Userstring, sondern die CSV Abfragen, oder? Wenn ich daraus aber $usercsv mache, bekomme ich den Fehler "Das Argument ist NULL".