Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

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, 1524 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 ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(3)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
gelöst AD-Felder für User mittels Powershell befüllen aus CSV-Datei (2)

Frage von Alex94G zum Thema Batch & Shell ...

Batch & Shell
gelöst PS Werte CSV-Datei in AD Attribut (3)

Frage von lupolo zum Thema Batch & Shell ...

Batch & Shell
Mehrere AD Benutzer aus CSV Datei mit PowerShell erstellen (1)

Frage von windelterrorist zum Thema Batch & Shell ...

VB for Applications
gelöst Bestimmte Spalten aus CSV-Datei auslesen (VBS) (9)

Frage von Gurkenhobel zum Thema VB for Applications ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...