it-wurzel
Goto Top

AD User mit CSV Datei Vergleichen und Webseite befüllen

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:
Name;Vorname;Telefon;Abteilung;Webseite;Mobilnummer;EMail;Haus;Etage;Raum
'surename1';'GivenName1';'+49-40-1111-2222';'Haus1';'http://www.domain1.com/de/default.aspx';'+49-151-12345678';'surename1.GivenName1@domain1.com';'H1';'3';'34a'  
'surename2';'GivenName2';'+49-40-5555-1111';'Haus4';'http://www.domain2.com/en/default.aspx';'';'surename2.GivenName2@domain2.com';'Ha6';'1';'-1'  
'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:
<#
	========================================================================================
        Pfadübergabe durch einen Batchaufruf (z. B. im Batchaufruf:
        PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& '%~dp0modify_ad_users_homepage.ps1" -filePath '%~dp0'  
	 wenn die csv-Datei im gleichen Ordner liegt.
	========================================================================================
#>
param (
	[string]$filePath
)

Clear-Host
Import-Module ActiveDirectory

$OU = "DC=Training,DC=loc"  
$fileIN = "modify_ad_users_homepage.csv"  
$content = (gc "$filePath\$fileIN" | out-string).Replace("'", """")  

$Properties = @(
'DisplayName',  
'GivenName',  
'SamAccountName',  
'OfficePhone',  
'Department',  
'Description',  
'Homepage',  
'MobilePhone',  
'EmailAddress',  
'Office'  
)

$Date = Get-Date -Format yyyy-MM-dd_THH.mm.ss
$logFile = "modify_ad_users_homepage" + $Date + ".log"  
$log = @()

# Alle ADUser die eine Mailaddresse haben
$users = get-aduser -Filter * -SearchBase $OU -Properties $Properties | ? { $_.EmailAddress -eq $null }

# Alle Mailaddressen aus der CSV-User holen
$CSVUsers = import-csv $content -delimiter ";" -Header @("Name", "Vorname", "Telefon", "Abteilung", "Webseite", "Mobilnummer", "EMail", "Haus", "Etage", "Raum")  

# Beide Objekte vergleichen und entsprechende User ändern
Compare $Users $CSVUsers -PassThru | %{ set-ADUser -Identity $user -EmailAddress $_.EmailAddress  }

<#
	========================================================================================
	 Schleife für das schreiben des Attributes Homepage
	========================================================================================
#>
foreach ($user in $users)
{
	$Emailaddress = $user.EmailAddress
	if ($Emailaddress -eq $Null)
	{
		set-aduser -Identity $user -Homepage $user.Webseite
		$log += New-Object PSObject -Property @{ "Vorname" = $user.GivenName; "Nachname" = $user.Surname; "EMail" = $user.EmailAddress }  
	}
}

<#
	========================================================================================
	 Logfile schreiben (Deklaration oben) 
	========================================================================================
#>
if ($log -ne { })
{
	$log | select Vorname, Nachname, EMail | ft -AutoSize | Out-File -FilePath "$logFile" -Force -Append -encoding "unicode"  
}
Else
{
	$log = "Keine Änderungen im AD durchgeführt" | ft -AutoSize | Out-File -FilePath "$logFile" -Force -Append -encoding "unicode"  
}


Vorab schon mal ein fettes "Dankeschön" für Eure Unterstützung
Mario

Content-ID: 246949

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

Ausgedruckt am: 24.11.2024 um 07:11 Uhr

colinardo
Lösung colinardo 20.08.2014, aktualisiert am 21.08.2014 um 10:00:14 Uhr
Goto Top
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
<#
	========================================================================================
        Pfadübergabe durch einen Batchaufruf (z. B. im Batchaufruf:
        PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& '%~dp0modify_ad_users_homepage.ps1" -filePath '%~dp0'  
	 wenn die csv-Datei im gleichen Ordner liegt.
	========================================================================================
#>
param (
	[string]$filePath
)

Clear-Host
Import-Module ActiveDirectory

$OU = "DC=Training,DC=loc"  
$fileIN = "modify_ad_users_homepage.csv"  
$content = (gc "$filePath\$fileIN" | out-string).Replace("'", """")  

$Properties = @(
'DisplayName',  
'GivenName',  
'SamAccountName',  
'OfficePhone',  
'Department',  
'Description',  
'Homepage',  
'MobilePhone',  
'EmailAddress',  
'Office'  
)

$Date = Get-Date -Format 'yyyy-MM-dd_THH.mm.ss'  
$logFile = "modify_ad_users_homepage" + $Date + ".log"  
$log = @()

# Alle ADUser die eine Mailaddresse haben
$ADusers = get-aduser -Filter * -SearchBase $OU -Properties $Properties | ? { $_.EmailAddress -ne $null }

# CSV-User holen
$CSVUsers = convertfrom-csv $content -delimiter ";" -Header @("Name", "Vorname", "Telefon", "Abteilung", "Webseite", "Mobilnummer", "EMail", "Haus", "Etage", "Raum")  

<#
	========================================================================================
	 Schleife für das schreiben der Attribute
	========================================================================================
#>
foreach ($user in $CSVUsers)
{
	$ADUsers | ?{$_.EmailAddress -eq $user.EMail} | %{
		set-aduser -Identity $_.SamAccountName -Replace @{wwwHomepage=$user.Webseite;physicalDeliveryOfficeName="$($user.Haus) / $($user.Etage) / $($user.Raum)"}  
		$log += New-Object PSObject -Property @{ "Vorname" = $_.GivenName; "Nachname" = $_.Surname; "EMail" = $_.EmailAddress }  
	}
}

<#
	========================================================================================
	 Logfile schreiben (Deklaration oben) 
	========================================================================================
#>
if ($log -ne { })
{
	$log | select Vorname, Nachname, EMail | ft -AutoSize | Out-File -FilePath "$logFile" -Force -Append -encoding "unicode"  
}
Else
{
	$log = "Keine Änderungen im AD durchgeführt" | ft -AutoSize | Out-File -FilePath "$logFile" -Force -Append -encoding "unicode"  
}
Schönen Abend
Grüße Uwe
IT-Wurzel
IT-Wurzel 20.08.2014 um 19:11:18 Uhr
Goto Top
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
IT-Wurzel
IT-Wurzel 21.08.2014 aktualisiert um 09:47:13 Uhr
Goto Top
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)
colinardo
colinardo 21.08.2014 aktualisiert um 09:49:11 Uhr
Goto Top
Das Attribute heißen physicalDeliveryOfficeName anstatt Office und wwwHomePage anstatt Homepage
IT-Wurzel
IT-Wurzel 21.08.2014 um 09:48:47 Uhr
Goto Top
dann wäre doch auch Homepage in der set-aduser falsch, oder nicht?
IT-Wurzel
IT-Wurzel 21.08.2014 um 09:49:12 Uhr
Goto Top
sorry hatte nicht weitergelesen ...
colinardo
colinardo 21.08.2014 um 09:49:37 Uhr
Goto Top
Zitat von @IT-Wurzel:
dann wäre doch auch Homepage in der set-aduser falsch, oder nicht?
yip habe es gerade nachgetragen ...
IT-Wurzel
IT-Wurzel 21.08.2014 um 09:59:55 Uhr
Goto Top
merci ... funktioniert
IT-Wurzel
IT-Wurzel 21.08.2014 aktualisiert um 12:53:00 Uhr
Goto Top
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:
foreach ($user in $CSVUsers)
{
	$ADUsers | ? { $_.EmailAddress -eq $user.EMail } | %{
		set-aduser -Identity $_.SamAccountName -Replace @{ telephoneNumber = $user.Telefon; department = $user.Abteilung; wwwHomePage = $user.Webseite; mobile = $user.Mobilnummer; physicalDeliveryOfficeName = "$($user.Haus)/$($user.Etage)/$($user.Raum)" }  
		$log += New-Object PSObject -Property @{ "Vorname" = $_.GivenName; "Nachname" = $_.Surname; "EMail" = $_.EmailAddress }  
	}
}

Fehlermeldungen beim zweiten & dritten Durchlauf:
1. Durchlauf OK - Werte werden ins AD geschrieben

2. Durchlauf ERROR:
ERROR: Set-ADUser : replace modify_ad_users.ps1 (82): ERROR: At Line: 82 char: 13
ERROR: +         set-aduser <<<<  -Identity $_.SamAccountName -Replace @{ telephoneNumber = $user.Telefon; department = $user.Abteilung; wwwHomePage = $user.Webseite;
ERROR:  mobile = $user.Mobilnummer; physicalDeliveryOfficeName = "$($user.Haus)/$($user.Etage)/$($user.Raum)" }  
ERROR:     + CategoryInfo          : InvalidOperation: (SG2:ADUser) [Set-ADUser], ADInvalidOperationException
ERROR:     + FullyQualifiedErrorId : replace,Microsoft.ActiveDirectory.Management.Commands.SetADUser
ERROR:

3. Durchlauf ERROR:
ERROR: Set-ADUser : replace modify_ad_users.ps1 (82): ERROR: At Line: 82 char: 13
ERROR: +         set-aduser <<<<  -Identity $_.SamAccountName -Replace @{ telephoneNumber = $user.Telefon; department = $user.Abteilung; wwwHomePage = $user.Webseite;
ERROR:  mobile = $user.Mobilnummer; physicalDeliveryOfficeName = "$($user.Haus)/$($user.Etage)/$($user.Raum)" }  
ERROR:     + CategoryInfo          : InvalidOperation: (SG3:ADUser) [Set-ADUser], ADInvalidOperationException
ERROR:     + FullyQualifiedErrorId : replace,Microsoft.ActiveDirectory.Management.Commands.SetADUser
ERROR:
colinardo
colinardo 21.08.2014 aktualisiert um 12:58:12 Uhr
Goto Top
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 !
IT-Wurzel
IT-Wurzel 21.08.2014 um 13:03:03 Uhr
Goto Top
Danke, das wird es sein, in der CSV stehen zu Testzwecken, natürlich auch Zeilen mit leeren Werten.