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:
Powershell-Datei:
Vorab schon mal ein fettes "Dankeschön" für Eure Unterstützung
Mario
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 246949
Url: https://administrator.de/contentid/246949
Ausgedruckt am: 13.11.2024 um 08:11 Uhr
11 Kommentare
Neuester Kommentar
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
Schönen Abend
Grüße Uwe
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"
}
Grüße Uwe
yip habe es gerade nachgetragen ...