Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

AD User mit CSV Datei Vergleichen und Webseite befüllen

Frage Entwicklung Batch & Shell

Mitglied: IT-Wurzel

IT-Wurzel (Level 1) - Jetzt verbinden

20.08.2014, aktualisiert 21.08.2014, 1704 Aufrufe, 11 Kommentare

Hallo liebe Community,

ich sehe schon den Wald vor lauter Bäumen nicht mehr ... habe mir nach einigen Anregungen hier aus dem Forum versucht ein Skript zu erstellen, welches folgende Aufgabe hat:

Eine CSV-Datei einlesen, die AD-User einlesen und ein Compare auf das Feld Email-Adresse (die Email-Adresse ist hier eindeutig, da in der CSV-Datei kein "sAMAccountName" vorhanden ist, und es mehrere Accounts mit dem gleichen Vor- und Nachnamen geben kann.
Wenn eine MailAdresse übereinstimmt, soll das Feld HomePage mit dem Wert aus der CSV-Datei gefüllt werden.
Und aus den Spalten Haus, Etage, und Raum soll das Office gefüllt werden, aber soweit war ich noch nicht ..

da der erste Teil bei mir schon auf Fehler läuft, d. h. die CSV-Datei wird nicht eingelesen und kann somit nicht verarbeitet werden ...


CSV-Datei:
01.
Name;Vorname;Telefon;Abteilung;Webseite;Mobilnummer;EMail;Haus;Etage;Raum 
02.
'surename1';'GivenName1';'+49-40-1111-2222';'Haus1';'http://www.domain1.com/de/default.aspx';'+49-151-12345678';'surename1.GivenName1@domain1.com';'H1';'3';'34a' 
03.
'surename2';'GivenName2';'+49-40-5555-1111';'Haus4';'http://www.domain2.com/en/default.aspx';'';'surename2.GivenName2@domain2.com';'Ha6';'1';'-1' 
04.
'surename3';'GivenName3';'+49-40-1111-3333';'';'http://www.domain1.com/de/default.aspx';'+49-175-87654321';'surename3.GivenName3@domain1.com';'H5';'17';'113'
Powershell-Datei:
01.
<# 
02.
	======================================================================================== 
03.
        Pfadübergabe durch einen Batchaufruf (z. B. im Batchaufruf: 
04.
        PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& '%~dp0modify_ad_users_homepage.ps1" -filePath '%~dp0' 
05.
	 wenn die csv-Datei im gleichen Ordner liegt. 
06.
	======================================================================================== 
07.
#> 
08.
param ( 
09.
	[string]$filePath 
10.
11.
 
12.
Clear-Host 
13.
Import-Module ActiveDirectory 
14.
 
15.
$OU = "DC=Training,DC=loc" 
16.
$fileIN = "modify_ad_users_homepage.csv" 
17.
$content = (gc "$filePath\$fileIN" | out-string).Replace("'", """") 
18.
 
19.
$Properties = @( 
20.
'DisplayName', 
21.
'GivenName', 
22.
'SamAccountName', 
23.
'OfficePhone', 
24.
'Department', 
25.
'Description', 
26.
'Homepage', 
27.
'MobilePhone', 
28.
'EmailAddress', 
29.
'Office' 
30.
31.
 
32.
$Date = Get-Date -Format yyyy-MM-dd_THH.mm.ss 
33.
$logFile = "modify_ad_users_homepage" + $Date + ".log" 
34.
$log = @() 
35.
 
36.
# Alle ADUser die eine Mailaddresse haben 
37.
$users = get-aduser -Filter * -SearchBase $OU -Properties $Properties | ? { $_.EmailAddress -eq $null } 
38.
 
39.
# Alle Mailaddressen aus der CSV-User holen 
40.
$CSVUsers = import-csv $content -delimiter ";" -Header @("Name", "Vorname", "Telefon", "Abteilung", "Webseite", "Mobilnummer", "EMail", "Haus", "Etage", "Raum") 
41.
 
42.
# Beide Objekte vergleichen und entsprechende User ändern 
43.
Compare $Users $CSVUsers -PassThru | %{ set-ADUser -Identity $user -EmailAddress $_.EmailAddress  } 
44.
 
45.
<# 
46.
	======================================================================================== 
47.
	 Schleife für das schreiben des Attributes Homepage 
48.
	======================================================================================== 
49.
#> 
50.
foreach ($user in $users) 
51.
52.
	$Emailaddress = $user.EmailAddress 
53.
	if ($Emailaddress -eq $Null) 
54.
55.
		set-aduser -Identity $user -Homepage $user.Webseite 
56.
		$log += New-Object PSObject -Property @{ "Vorname" = $user.GivenName; "Nachname" = $user.Surname; "EMail" = $user.EmailAddress } 
57.
58.
59.
 
60.
<# 
61.
	======================================================================================== 
62.
	 Logfile schreiben (Deklaration oben)  
63.
	======================================================================================== 
64.
#> 
65.
if ($log -ne { }) 
66.
67.
	$log | select Vorname, Nachname, EMail | ft -AutoSize | Out-File -FilePath "$logFile" -Force -Append -encoding "unicode" 
68.
69.
Else 
70.
71.
	$log = "Keine Änderungen im AD durchgeführt" | ft -AutoSize | Out-File -FilePath "$logFile" -Force -Append -encoding "unicode" 
72.
73.
 

Vorab schon mal ein fettes "Dankeschön" für Eure Unterstützung
Mario
Mitglied: colinardo
LÖSUNG 20.08.2014, aktualisiert 21.08.2014
Hello again Mario,
das mit dem Compare lässt sich machen aber dazu sollten beide Objekte gleiche Typen haben. In dem Fall wäre das aber aufwendiger als die folgende Methode:
Ansonsten waren noch ein paar kleinere Fehler drin, wie z.B. ein -eq anstatt eines -ne und der CSV-Import der bei einem übergebenen String mit ConvertFrom-CSV durchgeführt werden muss.

Ungetestet da auf Smartphone
01.
<# 
02.
	======================================================================================== 
03.
        Pfadübergabe durch einen Batchaufruf (z. B. im Batchaufruf: 
04.
        PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& '%~dp0modify_ad_users_homepage.ps1" -filePath '%~dp0' 
05.
	 wenn die csv-Datei im gleichen Ordner liegt. 
06.
	======================================================================================== 
07.
#> 
08.
param ( 
09.
	[string]$filePath 
10.
11.
 
12.
Clear-Host 
13.
Import-Module ActiveDirectory 
14.
 
15.
$OU = "DC=Training,DC=loc" 
16.
$fileIN = "modify_ad_users_homepage.csv" 
17.
$content = (gc "$filePath\$fileIN" | out-string).Replace("'", """") 
18.
 
19.
$Properties = @( 
20.
'DisplayName', 
21.
'GivenName', 
22.
'SamAccountName', 
23.
'OfficePhone', 
24.
'Department', 
25.
'Description', 
26.
'Homepage', 
27.
'MobilePhone', 
28.
'EmailAddress', 
29.
'Office' 
30.
31.
 
32.
$Date = Get-Date -Format 'yyyy-MM-dd_THH.mm.ss' 
33.
$logFile = "modify_ad_users_homepage" + $Date + ".log" 
34.
$log = @() 
35.
 
36.
# Alle ADUser die eine Mailaddresse haben 
37.
$ADusers = get-aduser -Filter * -SearchBase $OU -Properties $Properties | ? { $_.EmailAddress -ne $null } 
38.
 
39.
# CSV-User holen 
40.
$CSVUsers = convertfrom-csv $content -delimiter ";" -Header @("Name", "Vorname", "Telefon", "Abteilung", "Webseite", "Mobilnummer", "EMail", "Haus", "Etage", "Raum") 
41.
 
42.
<# 
43.
	======================================================================================== 
44.
	 Schleife für das schreiben der Attribute 
45.
	======================================================================================== 
46.
#> 
47.
foreach ($user in $CSVUsers) 
48.
49.
	$ADUsers | ?{$_.EmailAddress -eq $user.EMail} | %{ 
50.
		set-aduser -Identity $_.SamAccountName -Replace @{wwwHomepage=$user.Webseite;physicalDeliveryOfficeName="$($user.Haus) / $($user.Etage) / $($user.Raum)"} 
51.
		$log += New-Object PSObject -Property @{ "Vorname" = $_.GivenName; "Nachname" = $_.Surname; "EMail" = $_.EmailAddress } 
52.
53.
54.
 
55.
<# 
56.
	======================================================================================== 
57.
	 Logfile schreiben (Deklaration oben)  
58.
	======================================================================================== 
59.
#> 
60.
if ($log -ne { }) 
61.
62.
	$log | select Vorname, Nachname, EMail | ft -AutoSize | Out-File -FilePath "$logFile" -Force -Append -encoding "unicode" 
63.
64.
Else 
65.
66.
	$log = "Keine Änderungen im AD durchgeführt" | ft -AutoSize | Out-File -FilePath "$logFile" -Force -Append -encoding "unicode" 
67.
}
Schönen Abend
Grüße Uwe
Bitte warten ..
Mitglied: IT-Wurzel
20.08.2014 um 19:11 Uhr
Hallo Uwe,

vielen Dank ... wieder einmal ... ich werde das morgen mal testen (habe hier jetzt keine Demo-Umgebung mehr) und gebe Dir dann Feedback.

Ich wünsche noch einen schönen Abend und Gruß,
Mario
Bitte warten ..
Mitglied: IT-Wurzel
21.08.2014, aktualisiert um 09:47 Uhr
Guten Morgen Uwe,

nachdem ich jetzt Dein Skript testen konnte bin ich bei der Analyse des Fehlers hängen geblieben:

ERROR: Set-ADUser : The specified directory service attribute or value does not exist
ERROR: Parameter name: Office modify_ad_users_homepage.ps1 (57): ERROR: At Line: 57 char: 13
ERROR: + set-aduser <<<< -Identity $_.SamAccountName -Replace @{ Homepage = $user.Webseite; Office = "$($user.Haus) / $($user.Etage) / $($user.Raum)" }
ERROR: + CategoryInfo : InvalidArgument: (SG1:ADUser) [Set-ADUser], ArgumentException
ERROR: + FullyQualifiedErrorId : The specified directory service attribute or value does not exist
ERROR: Parameter name: Office,Microsoft.ActiveDirectory.Management.Commands.SetADUser

Ich vermute mal, dass er mit der Variable Office nicht klar kommt, aber genau weiß ich das nicht.

Gruß,
Mario


Nachtrag:

Auflösen der Variablen wenn er auf die Zeile bei "set-aduser" springt:
$_.SamAccountName = SG1 -> korrekt
$user.EMail = Surename1.GivenName1@domain.com -> korrekt
$user.Webseite = http://www.domain1.com/de/default.aspx -> korrekt

die Variable "$($user.haus)/$($user.Etage)/$($user.Raum)" = (Empty)
Bitte warten ..
Mitglied: colinardo
21.08.2014, aktualisiert um 09:49 Uhr
Das Attribute heißen physicalDeliveryOfficeName anstatt Office und wwwHomePage anstatt Homepage
Bitte warten ..
Mitglied: IT-Wurzel
21.08.2014 um 09:48 Uhr
dann wäre doch auch Homepage in der set-aduser falsch, oder nicht?
Bitte warten ..
Mitglied: IT-Wurzel
21.08.2014 um 09:49 Uhr
sorry hatte nicht weitergelesen ...
Bitte warten ..
Mitglied: colinardo
21.08.2014 um 09:49 Uhr
Zitat von IT-Wurzel:
dann wäre doch auch Homepage in der set-aduser falsch, oder nicht?
yip habe es gerade nachgetragen ...
Bitte warten ..
Mitglied: IT-Wurzel
21.08.2014 um 09:59 Uhr
merci ... funktioniert
Bitte warten ..
Mitglied: IT-Wurzel
21.08.2014, aktualisiert um 12:53 Uhr
Hi,

ich wollte mal das Schreiben der Attribute um die anderen Felder ergänzen, und beim ersten mal funktioniert das einwandfrei, beim zweiten und dritten mal (csv hat nur drei Zeilen)
kommt eine Fehlermeldung ...
hast Du einen Tipp warum? Er findet beim "Foreach" den richtigen User, auch beim $ADusers sind $_.EmailAdress und $user.Email identisch (beim zweiten und dritten mal) ..

Powershell-Ergänzung zu oben:
01.
foreach ($user in $CSVUsers) 
02.
03.
	$ADUsers | ? { $_.EmailAddress -eq $user.EMail } | %{ 
04.
		set-aduser -Identity $_.SamAccountName -Replace @{ telephoneNumber = $user.Telefon; department = $user.Abteilung; wwwHomePage = $user.Webseite; mobile = $user.Mobilnummer; physicalDeliveryOfficeName = "$($user.Haus)/$($user.Etage)/$($user.Raum)" } 
05.
		$log += New-Object PSObject -Property @{ "Vorname" = $_.GivenName; "Nachname" = $_.Surname; "EMail" = $_.EmailAddress } 
06.
07.
}
Fehlermeldungen beim zweiten & dritten Durchlauf:
01.
1. Durchlauf OK - Werte werden ins AD geschrieben 
02.
 
03.
2. Durchlauf ERROR: 
04.
ERROR: Set-ADUser : replace modify_ad_users.ps1 (82): ERROR: At Line: 82 char: 13 
05.
ERROR: +         set-aduser <<<<  -Identity $_.SamAccountName -Replace @{ telephoneNumber = $user.Telefon; department = $user.Abteilung; wwwHomePage = $user.Webseite; 
06.
ERROR:  mobile = $user.Mobilnummer; physicalDeliveryOfficeName = "$($user.Haus)/$($user.Etage)/$($user.Raum)" } 
07.
ERROR:     + CategoryInfo          : InvalidOperation: (SG2:ADUser) [Set-ADUser], ADInvalidOperationException 
08.
ERROR:     + FullyQualifiedErrorId : replace,Microsoft.ActiveDirectory.Management.Commands.SetADUser 
09.
ERROR: 
10.
 
11.
3. Durchlauf ERROR: 
12.
ERROR: Set-ADUser : replace modify_ad_users.ps1 (82): ERROR: At Line: 82 char: 13 
13.
ERROR: +         set-aduser <<<<  -Identity $_.SamAccountName -Replace @{ telephoneNumber = $user.Telefon; department = $user.Abteilung; wwwHomePage = $user.Webseite; 
14.
ERROR:  mobile = $user.Mobilnummer; physicalDeliveryOfficeName = "$($user.Haus)/$($user.Etage)/$($user.Raum)" } 
15.
ERROR:     + CategoryInfo          : InvalidOperation: (SG3:ADUser) [Set-ADUser], ADInvalidOperationException 
16.
ERROR:     + FullyQualifiedErrorId : replace,Microsoft.ActiveDirectory.Management.Commands.SetADUser 
17.
ERROR:
Bitte warten ..
Mitglied: colinardo
21.08.2014, aktualisiert um 12:58 Uhr
wenn die entsprechenden Felder für die anderen User in der CSV-Datei leer sind, kommt es zu solchen Fehlern. Dann musst du vorher die Attribute prüfen die leer sind und diese dann mit set-aduser -Clear leeren. Mit -replace kannst du keine Felder mit leeren Strings replacen !
Bitte warten ..
Mitglied: IT-Wurzel
21.08.2014 um 13:03 Uhr
Danke, das wird es sein, in der CSV stehen zu Testzwecken, natürlich auch Zeilen mit leeren Werten.
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
AD-Felder für User mittels Powershell befüllen aus CSV-Datei
gelöst Frage von Alex94GBatch & Shell2 Kommentare

Hallo Admins, folgendes Szenario: Wir haben von der Personalabteilung eine CSV-Datei mit allen Usern bekommen, die ungefähr so aussieht: ...

Batch & Shell
AD Usernamen in CSV Vergleichen
gelöst Frage von HainoonBatch & Shell32 Kommentare

Hallo Liebe Community, Ich hatte zu diesem Thema schon einen ähnlichen Thread offen, habe das Thema vorerst auf Eis ...

Batch & Shell
CSV Dateien vergleichen die Hundertse
gelöst Frage von hansbaerBatch & Shell4 Kommentare

Hiho, ich bin der totale Noob was das angeht, aber ich möchte in einer batch zwei csv Dateien mit ...

Windows Server
Alle User im AD als CSV speichern
Frage von opc123Windows Server3 Kommentare

Hallo, wie kann ich alle User im AD in eine CSV speichern, aber ohne das die im AD gelöscht ...

Neue Wissensbeiträge
Internet

EU-DSGVO: WHOIS soll weniger Informationen liefern

Information von sabines vor 8 StundenInternet3 Kommentare

Wegen der europäische Datenschutzgrundverordnung stehen die Prozesse um die Registierunf von Domains auf dem Prüfstand. Sollte die Forderungen umgesetzt ...

Verschlüsselung & Zertifikate

19 Jahre alter Angriff auf TLS funktioniert immer noch

Information von BassFishFox vor 15 StundenVerschlüsselung & Zertifikate1 Kommentar

Interessant zu lesen. Der Bleichenbacher-Angriff gilt unter Kryptographen als Klassiker, trotzdem funktioniert er oft noch. Wie wir herausgefunden haben, ...

Windows 10

Windows 10 Fall Creators Update - Neue Funktion Hyper-V Standardswitch kann ggf. Fehler bei Proxy Configs verursachen

Erfahrungsbericht von rzlbrnft vor 1 TagWindows 104 Kommentare

Hallo Kollegen, Da wir die Gefahr lieben, haben wir bei einigen Usern nun mittlerweile das Creators Update drauf. Einige ...

Sicherheit

TLS-Zertifikat und privater Schlüssel von Microsofts Dynamics 365 geleakt

Information von Penny.Cilin vor 1 TagSicherheit

Microsoft hat versehentlich das TLS-Zertifikat inklusive dem privaten Schlüssel seiner Business-Anwendung Dynamics 365 geleakt. TLS-Zertifikat und privater Schlüssel von ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
Von rj11 auf rj45
Frage von jensgebkenLAN, WAN, Wireless18 Kommentare

Hallo Gemeinschaft, könnt ihr mir vielleicht bei der anfertigung eines Kabels helfen - habe ein rj 11 stecker und ...

Netzwerkmanagement
Firefox Profieles im Roaming
gelöst Frage von Hendrik2586Netzwerkmanagement17 Kommentare

Hallo liebe Leute. :) Ich hab da ein kleines Problem, welches anscheinend nicht unbekannt ist. Wir nutzen hier in ...

Netzwerkmanagement
NAS über zwei weitere Ethernet Anschlüsse verbinden
gelöst Frage von Sibelius001Netzwerkmanagement17 Kommentare

Sorry - ich bin hier wahrscheinlich als kompetter IT Trottel unterwegs. Aber eventuell kann mir jemand ganz einfach helfen: ...

LAN, WAN, Wireless
Häufig Probleme beim Anmelden in WLAN
Frage von mabue88LAN, WAN, Wireless15 Kommentare

Hallo zusammen, in einem Netzwerk gibt es relativ häufig (1-2 mal pro Woche) Probleme mit der WLAN-Verbindung. Zunächst mal ...