PowerShell CSV-Import Set-ADuser Nullwerte ausschließen
Hallo zusammen,
als PowerShell Novize bräuchte ich bitte Eure Unterstützung. Ich habe eine relativ mickrige AD-Umgebung aufs Auge gedrückt bekommen. Die User wurden kreuz und quer angelegt, meistens nur mit den nötigsten Angaben. Da nun eine AD-Synchronisierung ins Haus steht (MS-AD-Sync) und bisher sämtliche User Details im Office Portal gepflegt wurden, muss ich die lokalen User dementsprechend anpassen, da sonst sämtliche User Details, welche online gepflegt sind, durch die Synchronisierung wegfallen würden. Soweit also erst mal die Hintergründe.
Um jetzt nicht alles manuell eingeben zu müssen, habe ich mir eine Userliste vom Office Portal exportiert, gleichzeitig habe ich die User, Standortbezogen, aus dem AD exportiert. Die Überschriften aus der Portal-CSV habe ich denen der AD-CSV angeglichen. Das ist also meine Ausgangslage, Ziel ist es jetzt, die Portal-CSV zu importieren, nach Standorten (Städten) zu filtern und die entsprechenden User Details zu füllen. Die Filter sind deshalb nötig, da wir die Synchronisierung Standortweise durchführen wollen/müssen.
So sieht die CSV auszugsweise aus:
dazu habe ich nun folgendes Skript zusammengeklaut:
Sieht zwar gut aus, funktioniert aber nicht, läuft in der ISE durch, gibt jedoch im Anschluss zeilenweise die "Warnungsmeldung" der Else-Schleife aus, aber führt keinerlei Änderungen im AD selbst aus.
In der Test-csv welche dazu verwendet wurde, sind lediglich drei Namen aufgeführt, respektive dementsprechend gefüllt. Wollte das noch nicht mit der großen Liste testen, sondern erst mal klein. Hatte erst den Verdacht, dass bei dem Skript zu viele if-Schleifen sind und deshalb die else-Schleife so oft kommt, aber auch das Kürzen des Skriptes hat diesbezüglich nichts gebracht.
Wäre super, wenn mir da jemand weiterhelfen könnte.
Gruß
Artaios
als PowerShell Novize bräuchte ich bitte Eure Unterstützung. Ich habe eine relativ mickrige AD-Umgebung aufs Auge gedrückt bekommen. Die User wurden kreuz und quer angelegt, meistens nur mit den nötigsten Angaben. Da nun eine AD-Synchronisierung ins Haus steht (MS-AD-Sync) und bisher sämtliche User Details im Office Portal gepflegt wurden, muss ich die lokalen User dementsprechend anpassen, da sonst sämtliche User Details, welche online gepflegt sind, durch die Synchronisierung wegfallen würden. Soweit also erst mal die Hintergründe.
Um jetzt nicht alles manuell eingeben zu müssen, habe ich mir eine Userliste vom Office Portal exportiert, gleichzeitig habe ich die User, Standortbezogen, aus dem AD exportiert. Die Überschriften aus der Portal-CSV habe ich denen der AD-CSV angeglichen. Das ist also meine Ausgangslage, Ziel ist es jetzt, die Portal-CSV zu importieren, nach Standorten (Städten) zu filtern und die entsprechenden User Details zu füllen. Die Filter sind deshalb nötig, da wir die Synchronisierung Standortweise durchführen wollen/müssen.
So sieht die CSV auszugsweise aus:
dazu habe ich nun folgendes Skript zusammengeklaut:
#csv-Datei importieren und aufbereiten
$user = Import-Csv -Delimiter ";" -Encoding UTF8 -Path C:\test\user_Objektplanung-.csv
#führe für jeden User in der csv-Datei aus
foreach($user in $user){
# Filtere User und hole Atribute
$ADUser = Get-ADUser -filter {SamAccountName -eq '$($_.SamAccountName)' -and (City -like 'München')} -Properties c,City,CN,Company,Country,Department,Description,DisplayName,Division,EmailAddress,Fax,GivenName,HomePage,HomePhone,Initials,`
Manager,MobilePhone,Name,Office,OfficePhone,Organization,OtherName,POBox,PostalCode,SamAccountName,sn,st,State,StreetAddress,Surname,Title,UserPrincipalName
#übergebe gefilterte und gefundene User und führe Änderungen aus
if ($ADUser){
if ($_.c) {$ADUser.c = $_.c}
if ($_.City) {$ADUser.City = $_.City}
if ($_.CN) {$ADUser.CN = $_.CN}
if ($_.Company) {$ADUser.Company = $_.Company}
if ($_.Country) {$ADUser.Country = $_.Country}
if ($_.Department) {$ADUser.Department = $_.Department}
if ($_.Description) {$ADUser.Description = $_.Description}
if ($_.DisplayName) {$ADUser.DisplayName = $_.DisplayName}
if ($_.Division) {$ADUser.Division = $_.Division}
if ($_.EmailAddress) {$ADUser.EmailAddress = $_.EmailAddress}
if ($_.Fax) {$ADUser.Fax = $_.Fax}
if ($_.GivenName) {$ADUser.GivenName = $_.GivenName}
if ($_.HomePage) {$ADUser.HomePage = $_.HomePage}
if ($_.HomePhone) {$ADUser.HomePhone = $_.HomePhone}
if ($_.Initials) {$ADUser.Initials = $_.Initials}
if ($_.Manager) {$ADUser.Manager = $_.Manager}
if ($_.MobilePhone) {$ADUser.MobilePhone = $_.MobilePhone}
if ($_.Name) {$ADUser.Name = $_.Name}
if ($_.Office) {$ADUser.Office = $_.Office}
if ($_.OfficePhone) {$ADUser.OfficePhone = $_.OfficePhone}
if ($_.Organization) {$ADUser.Organization = $_.Organization}
if ($_.OtherName) {$ADUser.OtherName = $_.OtherName}
if ($_.POBox) {$ADUser.POBox = $_.POBox}
if ($_.PostalCode) {$ADUser.PostalCode = $_.PostalCode}
if ($_.SamAccountName) {$ADUser.SamAccountName = $_.SamAccountName}
if ($_.sn) {$ADUser.sn = $_.sn}
if ($_.st) {$ADUser.st = $_.st}
if ($_.State) {$ADUser.State = $_.State}
if ($_.StreetAddress) {$ADUser.StreetAddress = $_.StreetAddress}
if ($_.Surname) {$ADUser.Surname = $_.Surname}
if ($_.Title) {$ADUser.Title = $_.Title}
if ($_.UserPrincipalName) {$ADUser.UserPrincipalName = $_.UserPrincipalName}
Set-ADUser -Instance $ADUser
#Schreibe Fehlermeldung welcher User nicht geändert wurde
}else{
Write-Warning ("Fehler beim update von " + $($user.name))
}
}
In der Test-csv welche dazu verwendet wurde, sind lediglich drei Namen aufgeführt, respektive dementsprechend gefüllt. Wollte das noch nicht mit der großen Liste testen, sondern erst mal klein. Hatte erst den Verdacht, dass bei dem Skript zu viele if-Schleifen sind und deshalb die else-Schleife so oft kommt, aber auch das Kürzen des Skriptes hat diesbezüglich nichts gebracht.
Wäre super, wenn mir da jemand weiterhelfen könnte.
Gruß
Artaios
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 6982331684
Url: https://administrator.de/contentid/6982331684
Ausgedruckt am: 23.11.2024 um 15:11 Uhr
18 Kommentare
Neuester Kommentar
Hi,
hier ist schonmal was komisch:
Sollte wohl heißen
bzw. besser:
Und dann entsprechend:
Insgesamt dann also:
-Thomas
hier ist schonmal was komisch:
foreach($user in $user){
# Filtere User und hole Atribute
$ADUser = Get-ADUser -filter {SamAccountName -eq '$($_.SamAccountName)'
Sollte wohl heißen
foreach($u in $user){
# Filtere User und hole Atribute
$ADUser = Get-ADUser -filter {SamAccountName -eq '$($u.SamAccountName)'
bzw. besser:
$ADUser = Get-ADUser -identity $u.samaccountname
if ($u.c) {$ADUser.c = $u.c}
if ($u.City) {$ADUser.City = $u.City}
if ($u.CN) {$ADUser.CN = $u.CN}
...
Insgesamt dann also:
#csv-Datei importieren und aufbereiten
$user = Import-Csv -Delimiter ";" -Encoding UTF8 -Path C:\test\user_Objektplanung-.csv
#führe für jeden User in der csv-Datei aus
foreach ($u in $user) {
# Filtere User und hole Atribute
$ADUser = Get-ADUser -Identity $u.SamAccountName -Properties c, City, CN, Company, Country, Department, Description, DisplayName, Division, EmailAddress, Fax, GivenName, HomePage, HomePhone, Initials, `
Manager, MobilePhone, Name, Office, OfficePhone, Organization, OtherName, POBox, PostalCode, SamAccountName, sn, st, State, StreetAddress, Surname, Title, UserPrincipalName
#übergebe gefilterte und gefundene User und führe Änderungen aus
if ($ADUser) {
if ($u.c) { $ADUser.c = $u.c }
if ($u.City) { $ADUser.City = $u.City }
if ($u.CN) { $ADUser.CN = $u.CN }
if ($u.Company) { $ADUser.Company = $u.Company }
if ($u.Country) { $ADUser.Country = $u.Country }
if ($u.Department) { $ADUser.Department = $u.Department }
if ($u.Description) { $ADUser.Description = $u.Description }
if ($u.DisplayName) { $ADUser.DisplayName = $u.DisplayName }
if ($u.Division) { $ADUser.Division = $u.Division }
if ($u.EmailAddress) { $ADUser.EmailAddress = $u.EmailAddress }
if ($u.Fax) { $ADUser.Fax = $u.Fax }
if ($u.GivenName) { $ADUser.GivenName = $u.GivenName }
if ($u.HomePage) { $ADUser.HomePage = $u.HomePage }
if ($u.HomePhone) { $ADUser.HomePhone = $u.HomePhone }
if ($u.Initials) { $ADUser.Initials = $u.Initials }
if ($u.Manager) { $ADUser.Manager = $u.Manager }
if ($u.MobilePhone) { $ADUser.MobilePhone = $u.MobilePhone }
if ($u.Name) { $ADUser.Name = $u.Name }
if ($u.Office) { $ADUser.Office = $u.Office }
if ($u.OfficePhone) { $ADUser.OfficePhone = $u.OfficePhone }
if ($u.Organization) { $ADUser.Organization = $u.Organization }
if ($u.OtherName) { $ADUser.OtherName = $u.OtherName }
if ($u.POBox) { $ADUser.POBox = $u.POBox }
if ($u.PostalCode) { $ADUser.PostalCode = $u.PostalCode }
if ($u.SamAccountName) { $ADUser.SamAccountName = $u.SamAccountName }
if ($u.sn) { $ADUser.sn = $u.sn }
if ($u.st) { $ADUser.st = $u.st }
if ($u.State) { $ADUser.State = $u.State }
if ($u.StreetAddress) { $ADUser.StreetAddress = $u.StreetAddress }
if ($u.Surname) { $ADUser.Surname = $u.Surname }
if ($u.Title) { $ADUser.Title = $u.Title }
if ($u.UserPrincipalName) { $ADUser.UserPrincipalName = $u.UserPrincipalName }
Set-ADUser -Instance $ADUser
#Schreibe Fehlermeldung welcher User nicht geändert wurde
}
else {
Write-Warning ("Fehler beim update von " + $($u.name))
}
}
Moment mal, hat die CSV kein samAccountName?
Entspricht die Mailadresse in der CSV dem UPN im AD? Dann ersetze Zeile 6 und 7 durch:
Alternativ dem property "mail" im AD? Dann ersetze Zeile 6 und 7 durch:
-Properties * gibt alle Attribute aus. Bei der Menge die du benötigst kann man sich das Filtern IMO sparen.
Nach Standort zu filtern ist mMn. auch nicht nötig, da die Zuordnung pro Emailadresse eindeutig ist. Wenn die entsprechende Mailadresse lokal im AD nicht vorhanden ist, wird auch nichts ausgegeben/geändert.
-Thomas
Entspricht die Mailadresse in der CSV dem UPN im AD? Dann ersetze Zeile 6 und 7 durch:
$ADUser = Get-ADUser -Filter {UserPrincipalName -eq $u.EmailAddress} -Properties *
Alternativ dem property "mail" im AD? Dann ersetze Zeile 6 und 7 durch:
$ADUser = Get-ADUser -Filter {mail -eq $u.EmailAddress} -Properties *
-Properties * gibt alle Attribute aus. Bei der Menge die du benötigst kann man sich das Filtern IMO sparen.
Nach Standort zu filtern ist mMn. auch nicht nötig, da die Zuordnung pro Emailadresse eindeutig ist. Wenn die entsprechende Mailadresse lokal im AD nicht vorhanden ist, wird auch nichts ausgegeben/geändert.
-Thomas
Kannst du die CSV mit einem oder zwei Testeinträgen hier posten?
-Thomas
-Thomas
foreach($user in $user)
foreach($u in $user)
und falls die Daten echt sind, lösch die bitte wieder
-Thomas
Das sind alles Felder, die du normalerweise auch nicht verändern willst
CN
Name
SamAccountName
UserPrincipalName
Versuche es mal so:
-Thomas
CN
Name
SamAccountName
UserPrincipalName
Versuche es mal so:
#csv-Datei importieren und aufbereiten
$user = Import-Csv -Delimiter ";" -Encoding UTF8 -Path C:\test\user_Objektplanung-.csv
#führe für jeden User in der csv-Datei aus
foreach ($u in $user) {
# Filtere User und hole Atribute
$ADUser = Get-ADUser -Filter { UserPrincipalName -eq $u.UserPrincipalName } -Properties *
#übergebe gefilterte und gefundene User und führe Änderungen aus
if ($ADUser) {
if ($u.City) { $ADUser.City = $u.City }
if ($u.Company) { $ADUser.Company = $u.Company }
if ($u.Country) { $ADUser.Country = $u.Country }
if ($u.Department) { $ADUser.Department = $u.Department }
if ($u.Description) { $ADUser.Description = $u.Description }
if ($u.DisplayName) { $ADUser.DisplayName = $u.DisplayName }
if ($u.Division) { $ADUser.Division = $u.Division }
if ($u.EmailAddress) { $ADUser.EmailAddress = $u.EmailAddress }
if ($u.Fax) { $ADUser.Fax = $u.Fax }
if ($u.GivenName) { $ADUser.GivenName = $u.GivenName }
if ($u.HomePage) { $ADUser.HomePage = $u.HomePage }
if ($u.HomePhone) { $ADUser.HomePhone = $u.HomePhone }
if ($u.Initials) { $ADUser.Initials = $u.Initials }
if ($u.Manager) { $ADUser.Manager = $u.Manager }
if ($u.MobilePhone) { $ADUser.MobilePhone = $u.MobilePhone }
if ($u.Office) { $ADUser.Office = $u.Office }
if ($u.OfficePhone) { $ADUser.OfficePhone = $u.OfficePhone }
if ($u.Organization) { $ADUser.Organization = $u.Organization }
if ($u.OtherName) { $ADUser.OtherName = $u.OtherName }
if ($u.POBox) { $ADUser.POBox = $u.POBox }
if ($u.PostalCode) { $ADUser.PostalCode = $u.PostalCode }
if ($u.State) { $ADUser.State = $u.State }
if ($u.StreetAddress) { $ADUser.StreetAddress = $u.StreetAddress }
if ($u.Surname) { $ADUser.Surname = $u.Surname }
if ($u.Title) { $ADUser.Title = $u.Title }
Set-ADUser -Instance $ADUser
#Schreibe Fehlermeldung welcher User nicht geändert wurde
}
else {
Write-Warning ("Fehler beim update von " + $($u.name))
}
}
-Thomas
# Filtere User und hole Atribute
$ADUser = Get-ADUser -Filter { UserPrincipalName -eq $u.UserPrincipalName } -Properties *
ändere das bitte mal zu
# Filtere User und hole Atribute
$ADUser = $null
$ADUser = Get-ADUser -Filter { UserPrincipalName -eq $u.UserPrincipalName } -Properties *
öffne bitte auch eine neue PS-Session (also ISE oder worüber du das Skript startest neu starten)
-Thomas
Mein letzter Versuch
-Thomas
#csv-Datei importieren und aufbereiten
$user = Import-Csv -Delimiter ";" -Encoding UTF8 -Path C:\test\user_Objektplanung-.csv
#führe für jeden User in der csv-Datei aus
foreach ($u in $user) {
# Filtere User und hole Atribute
$upn = $u.UserPrincipalName
$ADUser = $null
$ADUser = Get-ADUser -Filter { UserPrincipalName -eq $upn } -Properties *
#übergebe gefilterte und gefundene User und führe Änderungen aus
if ($ADUser) {
if ($u.City) { $ADUser.City = $u.City }
if ($u.Company) { $ADUser.Company = $u.Company }
if ($u.Country) { $ADUser.Country = $u.Country }
if ($u.Department) { $ADUser.Department = $u.Department }
if ($u.Description) { $ADUser.Description = $u.Description }
if ($u.DisplayName) { $ADUser.DisplayName = $u.DisplayName }
if ($u.Division) { $ADUser.Division = $u.Division }
if ($u.EmailAddress) { $ADUser.EmailAddress = $u.EmailAddress }
if ($u.Fax) { $ADUser.Fax = $u.Fax }
if ($u.GivenName) { $ADUser.GivenName = $u.GivenName }
if ($u.HomePage) { $ADUser.HomePage = $u.HomePage }
if ($u.HomePhone) { $ADUser.HomePhone = $u.HomePhone }
if ($u.Initials) { $ADUser.Initials = $u.Initials }
if ($u.Manager) { $ADUser.Manager = $u.Manager }
if ($u.MobilePhone) { $ADUser.MobilePhone = $u.MobilePhone }
if ($u.Office) { $ADUser.Office = $u.Office }
if ($u.OfficePhone) { $ADUser.OfficePhone = $u.OfficePhone }
if ($u.Organization) { $ADUser.Organization = $u.Organization }
if ($u.OtherName) { $ADUser.OtherName = $u.OtherName }
if ($u.POBox) { $ADUser.POBox = $u.POBox }
if ($u.PostalCode) { $ADUser.PostalCode = $u.PostalCode }
if ($u.State) { $ADUser.State = $u.State }
if ($u.StreetAddress) { $ADUser.StreetAddress = $u.StreetAddress }
if ($u.Surname) { $ADUser.Surname = $u.Surname }
if ($u.Title) { $ADUser.Title = $u.Title }
Set-ADUser -Instance $ADUser
#Schreibe Fehlermeldung welcher User nicht geändert wurde
}
else {
Write-Warning ("Fehler beim update von " + $($u.name))
}
}
-Thomas
Verstehe ich nicht, da weiter oben ja geprüft wird, ob $ADUser nicht null ist.
Versuchs mal so:
Ansonsten muss einer der klügeren Köpfe hier mal reinschauen.
-Thomas
Versuchs mal so:
#csv-Datei importieren und aufbereiten
$user = Import-Csv -Delimiter ";" -Encoding UTF8 -Path C:\test\user_Objektplanung-.csv
#führe für jeden User in der csv-Datei aus
foreach ($u in $user) {
# Filtere User und hole Atribute
$upn = $u.UserPrincipalName
$ADUser = $null
$ADUser = Get-ADUser -Filter { UserPrincipalName -eq $upn } -Properties *
#übergebe gefilterte und gefundene User und führe Änderungen aus
if ($ADUser) {
if ($u.City) { $ADUser.City = $u.City }
if ($u.Company) { $ADUser.Company = $u.Company }
if ($u.Country) { $ADUser.Country = $u.Country }
if ($u.Department) { $ADUser.Department = $u.Department }
if ($u.Description) { $ADUser.Description = $u.Description }
if ($u.DisplayName) { $ADUser.DisplayName = $u.DisplayName }
if ($u.Division) { $ADUser.Division = $u.Division }
if ($u.EmailAddress) { $ADUser.EmailAddress = $u.EmailAddress }
if ($u.Fax) { $ADUser.Fax = $u.Fax }
if ($u.GivenName) { $ADUser.GivenName = $u.GivenName }
if ($u.HomePage) { $ADUser.HomePage = $u.HomePage }
if ($u.HomePhone) { $ADUser.HomePhone = $u.HomePhone }
if ($u.Initials) { $ADUser.Initials = $u.Initials }
if ($u.Manager) { $ADUser.Manager = $u.Manager }
if ($u.MobilePhone) { $ADUser.MobilePhone = $u.MobilePhone }
if ($u.Office) { $ADUser.Office = $u.Office }
if ($u.OfficePhone) { $ADUser.OfficePhone = $u.OfficePhone }
if ($u.Organization) { $ADUser.Organization = $u.Organization }
if ($u.OtherName) { $ADUser.OtherName = $u.OtherName }
if ($u.POBox) { $ADUser.POBox = $u.POBox }
if ($u.PostalCode) { $ADUser.PostalCode = $u.PostalCode }
if ($u.State) { $ADUser.State = $u.State }
if ($u.StreetAddress) { $ADUser.StreetAddress = $u.StreetAddress }
if ($u.Surname) { $ADUser.Surname = $u.Surname }
if ($u.Title) { $ADUser.Title = $u.Title }
if($ADUser){
Set-ADUser -Instance $ADUser
} else{
Write-Warning "wtf $($u.name)"
}
#Schreibe Fehlermeldung welcher User nicht geändert wurde
}
else {
Write-Warning ("Fehler beim update von " + $($u.name))
}
}
Ansonsten muss einer der klügeren Köpfe hier mal reinschauen.
-Thomas
Set-ADUser : Der Namensverweis ist unzulässig
Meine Glaskugel sagt das Manager-Attribut ist schuld!Dort muss ein DistinguishedName hinterlegt sein (also bspw.
CN=Max Muster,DC=domain,DC=de
)Die ganzen IF-Abfragen würde ich persönlich auch durch eine kurze ForEach Schleife ersetzen wenn die Spaltennamen der CSV eh alle gleich sind wie die AttributNamen, ....
# ...
$properties = 'City','Company','Country','Department','Description','DisplayName','Division','EmailAddress','Fax','GivenName','HomePage','HomePhone','Initials','MobilePhone','Office','OfficePhone','Organization','OtherName','POBox','PostalCode','State','StreetAddress','Surname','Title','Manager'
foreach($property in $properties){
if ($u.$property){
$ADUser.$property = $u.$property
}
}
# ....
Cheers briggs