arsene
Goto Top

Powershell- User Export von Ad und CSV Datei Umbenennen bringt Fehler

Guten Tag an alle,
ich bin ein Anfänger in Powershell und hoffe mal hier im Forum eine Lösung zu finden.
Ich habe Zwei Skripte geschrieben:
- Ein der die User vom Active Directory exportiert, und die in einer CSV-Datei speichert
- Ein der die User von der CSV-Datei in Active Directory importiert nachdem die Datei verändert wurde.

Die beide Skripte funktionieren soweit gut.
Jetzt bekomme ich halt Fehler nachdem ich beim Export, die CSV-Datei Filter nach der Abteilung und speichere in einer zweiten und separate CSV-Datei.
Wenn ich von der Zweite Datei wieder ein Import in Active Directory mache, dann tauscht mal ";" in der CSV_Datei auf und die Inhalt von CSV können nicht gelesen werden.
Ein Debuggen Schritt zu schritt zeigt mir vor jeder Inhalte ein ";".
Ein habe sogar eine Methode hinzugefügt, der die ";" entfernen soll. Damit DisplayName, TelePhoneNumber, etc... gelesen werden. Aber bringt das ganze nicht.
Ich habe viel ausprobiert, immer nichts.
könnt ihr mir sagen, ob es überhaupt möglich nach dem Export, nachdem man gefilter hat. Die CSV-Dateien Name zu ändern? Oder ich was falsche macht.
ich würde mich freuen auf Rückmeldungen und mehr auf eine Lösung. wäre auch bereit die Skripte hochzuladen, wenn das notwendig ist. Danke

Hier ist das Skript für den Export:
<Tag>
  1. Die Spalten SAMAccountName,DisplayName,EmailAddress,OfficePhone,Department und Description werden in der Variable $alist gespeichern
  2. Diese Spalten werden auch voneinander mit einer Horizontale-Tabulatur (`t) getrennt
$alist = "SAMAccountName,`t`t`t`t`t`t`tDisplayName,`t`t`t`t`t`t`tEmailAddress,`t`t`t`t`t`t`tOfficePhone,`t`t`t`t`t`t`tFacsimileTelephoneNumber,`t`t`t`t`t`t`tStreetAddress,`t`t`t`t`t`t`tl,`t`t`t`t`t`t`tPostalcode,`t`t`t`t`t`t`tDepartment,`t`t`t`t`t`t`tDescription,`n"

  1. Hier werden erst alle Daten von AD geholt. Dann gefiltern nach Name,Email,Telefonnummer,Abteilung und Beschreibung
$userlist = Get-ADUser -Filter * -Properties * | Select-Object -Property SAMAccountName,DisplayName,EmailAddress,OfficePhone,FacsimileTelephoneNumber,StreetAddress,l,Postalcode,Department,Description | Sort-Object -Property DisplayName

  1. Die Schleife wird hier benutzt. Damit alle Daten ein nach dem anderen gelesen werden
$userlist | ForEach-Object {


$arec = $_.SAMAccountName+",`t`t`t`t`t`t`t"+ $_.DisplayName+",`t`t`t`t`t`t`t"+ $_.EmailAddress+",`t`t`t`t`t`t`t"+"'"+ $_.OfficePhone+",`t`t`t`t`t`t`t"+"'"+ $_.FacsimileTelephoneNumber+",`t`t`t`t`t`t`t"+ $_.StreetAddress+",`t`t`t`t`t`t`t"+ $_.l+",`t`t`t`t`t`t`t"+$_.Postalcode+",`t`t`t`t`t`t`t"+ $_.Department+",`t`t`t`t`t`t`t"+ $_.Description+","

  1. In einer Zeile werden die User-Daten angetragen. Das Zeichen "`n" bedeutet in der nächste Zeile zu gehen und die nächste Benutzer-Daten zu schreiben
$aline = $arec + "`n"

  1. Hier werden alle gelesene Zeile in der Variable $alist gespeichern
$alist += $aline

}

  1. Die gelesene Zeile werden dann in einer csv Datei gespeichern. Da muss man nur den Pfad eingeben
$alist | Out-File C:\Users\Administrator\Desktop\Powershell\Exportcopie.csv

</Tag>


Arsene

Content-ID: 258009

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

Ausgedruckt am: 26.11.2024 um 11:11 Uhr

TlBERlUS
Lösung TlBERlUS 18.12.2014 aktualisiert um 12:58:54 Uhr
Goto Top
Hi,

abgesehen davon, dass ich deinen Text nur mit Mühe verstehen konnte, wären es relativ praktisch wenn du die Skripte posten könntest.
Wegen dem Semikolon: Da eine *.csv (imho) "Wert1";"Wert2" aufgebaut ist, vermute ich, dass dort der Fehler liegt.

Grüße,

Tiberius
colinardo
colinardo 18.12.2014 aktualisiert um 13:39:11 Uhr
Goto Top
Hallo Arsene, Willkommen auf Administrator.de!
Ich hoffe der Nickname ist nicht Programm face-wink, hab keine Lust mir die Finger zu veretzen face-smile
Ich sag nur eins: Schon mal was von dem CMDLet Export-CSV gehört ? Dann brauchst du keine solche abstrusen Konstrukte für den CSV-Export

Export
Get-ADUser -Filter * -Properties * | Select-Object -Property SAMAccountName,DisplayName,EmailAddress,OfficePhone,FacsimileTelephoneNumber,StreetAddress,l,Postalcode,Department,Description | Sort-Object -Property DisplayName  | export-csv 'C:\Users\Administrator\Desktop\Powershell\Exportcopie.csv' -delimiter ";" -NoType -Encoding UTF8  
Import
$csv = Import-CSV 'C:\Users\Administrator\Desktop\Powershell\Exportcopie.csv' -delimiter ";"  
$csv | %{
  # mach hier was mit jedem User in der CSV
  $username = $_.SamAccountName
  write-host $username
  #..........
}
Grüße Uwe
Arsene
Arsene 18.12.2014 um 14:18:16 Uhr
Goto Top
Danke schön für die Rückmeldung. Was ich vorher hatte, hat auch funktioniert. nur trat ein Problem, als ich der CSV-Datei gefiltert habe. Z.b Nach der Abteilung IT und nur die User von IT gespeichert in einer anderen CSV_Datei (exportfinal.csv).
Dann will ich die exportfinal.csv in Active Directory importieren. Da tauschen unerwartete ";" in der CSV-Datei beim Import.
Angenommen, dass ich habe:

SAMAccountName DisplayName Email

Arsene Arsene Lupin lupin@yahoo.fr


Nach dem Filter und Speicherung in einer anderer CSV-Datei (exportfinal.csv), sehe:

SAMAccountName ;;;;;;; DisplayName ;;;;;;;Email

Arsene ;;;;;;; Arsene Lupin ;;;;;;; lupin@yahoo.fr


Und diese ";" davor verhindert, dass der DisplayName oder Email richtig gelesen wird. Und da liegt das Problem.
Wie könnte ich das Problem lösen. Danke

Arsene
colinardo
colinardo 18.12.2014 aktualisiert um 14:26:31 Uhr
Goto Top
Zitat von @Arsene:
Wie könnte ich das Problem lösen. Danke
So wie ich's oben beschrieben habe, dann läuft das zuverlässig, vergess den schmu von oben damit bekommst du später sowieso noch mehr Probleme...
Bemühe mal die Suchfunktion, da findest du auch fertige Scripte für Import und Export von Usern via Powershell, das Thema wurde hier schon bis zum Abwinken behandelt:
TlBERlUS
TlBERlUS 18.12.2014 aktualisiert um 14:30:04 Uhr
Goto Top
Warum setzt du die Frage auf gelöst, wennd das Problem immer noch besteht?

Wenn ich dich richtig verstehe, sind die ";" in der csv?
probiers mal hiermit

<code/>
gc (C:\test\test.csv).Replace(";","") | Set-Content C:\test\test.csv


P.S. Uwe´s Lösung ist definitiv praktikabler
Arsene
Arsene 18.12.2014 um 15:17:40 Uhr
Goto Top
Sorry ich habe auf versehen auf "Zur Lösung beigetragen". Ich probiere mal deinen Vorschlag. Danke
Arsene
Arsene 09.01.2015 um 10:48:02 Uhr
Goto Top
Hallo Leute. Ich komme wieder hier im forum, weil ich ausprobiert habe, was ich als Vorschläge hier bekommen habe. Aber leider klappt das immer nicht.
Es kann auch sein, dass meine vorgehenweise nach dem Export nicht zu empfehlen ist. Und das möchte ich gern wissen bevor ich mich den Kopf kaputt mache für etwas was nicht machtbar ist.

Kurz Erklärung über was ich gemacht habe !

Nachdem ich dem Export mache entweder mit eure Skript oder mit meinem Skript. Ich speichere die Daten in einer csv-Datei(zb export.csv). Die csv-Datei(export.csv) wird noch bearbeitet indem man einige Spalte lösche und filtern und danach speichern in ein andere Dateiname(z.b exportIT.csv). Der Grund dafür ist zu filter nach der Abteilung(It,AD,GL, etc....). Das heisst, ich kann die export.csv 10 mal filtern nach der Anzahl an Abteilungen. Jede Abteilung bekommt dann eine Datei zu bearbeiten und mir zurück zu schicken. Die IT bekommt z.b die Datei exportIT.cvs vobei nur Mitarbeiter dieser Abteilung vorhanden sind.

Bemerkung !
Bei debuggen Schritt zu Schritt merke ich, wenn man die export.csv filtern und einige Spalte lösche. Dann speichere ich die bearbeitende Datei in der Datei exportIT.csv . Da tauschen die ";" in der Datei exportIT.csv . Ich weiss nicht wo die her kommen.

Da liegt mein problem. Ich habe zwar versucht diese ";" vor dem Import in Active Directory mit der Methode -Replace . Aber bis dahin keine Änderung.


Frage !

Filtern nach bestimmte Abteilungen und löschen einige Spalten kann das führen, dass beim Import Fehler auftauschen??
Wenn ja. Habt Ihr vielleicht andere Alternative wie ich mein problem lösen kann.

Ich bedanke mich schon im voraus auf ihre Mühe und würde mich freuen auf Vorschläge. Danke

Arsene
Arsene
Arsene 12.01.2015 um 08:48:50 Uhr
Goto Top
bin ich auf mich allein gelassen??
TlBERlUS
TlBERlUS 12.01.2015 um 15:23:15 Uhr
Goto Top
Hi,

der Mangel an Antworten könnte daran liegen, dass der Thread immer noch als gelöst markiert ist.
Wenn ich dich recht verstehe, sind in der export-csv ";" vorhanden, welche den Import stören?
Du könntest eine solche Zeile einmal als Beispiel posten(zum besseren Verständnis).

Grüße,

Tiberius
Arsene
Arsene 12.01.2015 um 15:44:23 Uhr
Goto Top
Bei der Export-csv ist kein ";" vorhanden.
Der ";" auftaucht nur wenn man die Export-csv manuel filtern (zb nach der Abteilung) und gleich danach in einer anderen csv-Datei(zb. Export1.csv) speichert.
In dem Moment störe der ";" bei dem Import von Export1.csv. Da an der Stelle weiss nicht wie ich weiter komme.
Ich habe zwar versucht eine Methode(-Replace) zu schreiben, die diese ";" entfernen sollte. Aber klappt nicht

Hier der code: Import

add-PSSnapin Quest.ActiveRoles.ADManagement
#Remove-Module ActiveDirectory
Import-Module ActiveDirectory
  1. User einlesen und in Variable $Users ablegen
  2. die Variable $Users enthält dann eine Liste mit allen Objekten
$Users= Import-Csv C:\Users\Administrator\Desktop\Powershell\ADUserExportierte_Daten.csv -Delimiter ","

  1. Hier befindet sich der Log-File für weitere nütliche Informationen vom Script. Hier kann man auch Fehler analysieren
$log = “C:\Users\Administrator\Desktop\Powershell\Log-File.txt”
$date = Get-Date


Function Daten_Aendern
{

$Users | ForEach-Object {

  1. Die Eigenschaft SAMAccountName vom Objekt auslesen und in der Variable $SAMAccountName ablegen
$SAMAccountName = $_.SAMAccountName
#$SAMAccountName

  1. Die Eigenschaft DisplayName vom Objekt auslesen und in der Variable $DisplayName ablegen
$DisplayName = $_.DisplayName
#$DisplayName

  1. Die Eigenschaft Email vom Objekt auslesen und in der Variable $EmailAddress ablegen
$EmailAddress = $_.EmailAddress
#$EmailAddress

  1. Die Eigenschaft OfficePhone vom Objekt auslesen und in der Variable $officephone ablegen
$officephone = $_.OfficePhone
#$officephone

  1. Die Eigenschaft Abteilung vom Objekt auslesen und in der Variable $department ablegen
$department = $_.Department
#$department

  1. Die Eigenschaft Description vom Objekt auslesen und in der Variable $description ablegen
$description = $_.Description
#$description


  1. Hier wird erst geprüft, ob ein User in AD existiert indem wir alle User abrufen und dann filter mit der Voraussetzung "where"
$aduser= get-aduser –filter * | where {($_.SAMAccountName –eq $SAMAccountName) -and ($_.Name –eq $DisplayName)}


  1. prüft, ob ein User schon in Ad vorhanden ist. Wenn nicht soll ein Fehlermeldung zurückgegeben

if($aduser -eq $null){

  1. Hier wird die Fehlermeldung in Rot markiert

Write-Host -BackgroundColor Red "Der Unten stehenden Benutzer existiert nicht in AD. Bitte Überprüfen Sie die Schreibweise Ihrer Angabe"

$SAMAccountName
#$DisplayName
"`n"

}

else
{

  1. Update durchführen(Überschreibung der Alten Daten und ersetzt mit der neuen). Die Meldung ist Grün markiert.
Write-Host -BackgroundColor Green "Änderung durchführen Für:"

$SAMAccountName
#$DisplayName

  1. Update
Set-QADUser -Identity $SAMAccountName -ObjectAttributes @{Description = $description.Trim();Department = $department.Trim();TelephoneNumber = $officephone.Trim("'"); mail = $EmailAddress.Trim();DisplayName = $DisplayName.Trim()}

Write-Host “Änderung der Daten abgeschlossen Für: $DisplayName”
“Änderung der Daten abgeschlossen Für: $DisplayName” | Out-File $log -Append

Start-Sleep 1
"`n"
}
}


Write-Host “Der Prozess ist zu Ende. Bitte die Log-File auf weitere Informationen und Fehler prüfen”
}

Daten_Aendern

Lg

Arsene
TlBERlUS
TlBERlUS 12.01.2015 um 15:59:52 Uhr
Goto Top
Hast du spontan eine Testzeile aus der csv(der bereits bearbeiteten), die diese Probleme aufweist?
Arsene
Arsene 12.01.2015 um 16:14:15 Uhr
Goto Top
Hier ist eine Zeile mit Kopfspalte


SAMAccountName, DisplayName, EmailAddress,
Administrator, Administrator, admin@yahoo.de,
colinardo
Lösung colinardo 12.01.2015, aktualisiert am 19.01.2015 um 09:12:45 Uhr
Goto Top
Zitat von @Arsene:

Hier ist eine Zeile mit Kopfspalte
SAMAccountName, DisplayName, EmailAddress,
Administrator, Administrator, admin@yahoo.de,
Trennst du jetzt mit Komma ? denn deine Zeilen weisen noch Tabulatoren auf ! Und das Komma am Ende ist ebenfalls falsch ...
Eine aussagekräftigge Fehlermeldung aus der Powershell würde hier viel mehr helfen als solche Aussagen wie "geht nicht".

Und bitte nutze endlich Code-Tags für deinen Quellcode: <code> Quellcode </code>. Merci.
Arsene
Arsene 19.01.2015 um 09:12:11 Uhr
Goto Top
Hallo an alle. Ich habe noch mal die Vorschläge von Uwe gefolgt und den Code angepasst. Jetzt funktioniert mein Skript schon wie ich gern haben wollte. Danke noch mal an euch Jungs.

Lg

Arsene