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-Key: 246949

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

Printed on: April 19, 2024 at 05:04 o'clock

Member: colinardo
Solution colinardo Aug 20, 2014, updated at Aug 21, 2014 at 08:00:14 (UTC)
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
Member: IT-Wurzel
IT-Wurzel Aug 20, 2014 at 17:11:18 (UTC)
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
Member: IT-Wurzel
IT-Wurzel Aug 21, 2014 updated at 07:47:13 (UTC)
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)
Member: colinardo
colinardo Aug 21, 2014 updated at 07:49:11 (UTC)
Goto Top
Das Attribute heißen physicalDeliveryOfficeName anstatt Office und wwwHomePage anstatt Homepage
Member: IT-Wurzel
IT-Wurzel Aug 21, 2014 at 07:48:47 (UTC)
Goto Top
dann wäre doch auch Homepage in der set-aduser falsch, oder nicht?
Member: IT-Wurzel
IT-Wurzel Aug 21, 2014 at 07:49:12 (UTC)
Goto Top
sorry hatte nicht weitergelesen ...
Member: colinardo
colinardo Aug 21, 2014 at 07:49:37 (UTC)
Goto Top
Zitat von @IT-Wurzel:
dann wäre doch auch Homepage in der set-aduser falsch, oder nicht?
yip habe es gerade nachgetragen ...
Member: IT-Wurzel
IT-Wurzel Aug 21, 2014 at 07:59:55 (UTC)
Goto Top
merci ... funktioniert
Member: IT-Wurzel
IT-Wurzel Aug 21, 2014 updated at 10:53:00 (UTC)
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:
Member: colinardo
colinardo Aug 21, 2014 updated at 10:58:12 (UTC)
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 !
Member: IT-Wurzel
IT-Wurzel Aug 21, 2014 at 11:03:03 (UTC)
Goto Top
Danke, das wird es sein, in der CSV stehen zu Testzwecken, natürlich auch Zeilen mit leeren Werten.