Set-ADUser - Füllen des Felds "Location" funktioniert nicht
Hallo Admins,
die Überschrift sagt eigentlich schon alles.
Ich habe ein Script gebastelt, das eine CSV-Datei zeilenweise durchgeht und gewisse AD-Felder mit Inhalt aus der CSV füllt.
Alles funktioniert - bis auf die Zeile, wo der Ort einzutragen ist.
Hier mein Code: (Die ForEach-Schleifen und Get-ADuser-Befehle habe ich weggelassen - Es wird auch ALLES ausgefüllt - außer der Ort)
Das Script läuft wie gesagt einwandfrei durch, aber das Feld "Location" wird nicht angerührt - es wird auch nicht mit "leer" überschrieben. Schreibe ich vor der Scriptausführung in das Feld über Active Directory Benutzer und Gruppen was rein, steht das nach der Ausführung auch noch genau so drinnen.
Kennt irgendwer das Problem und kann mir hier den entscheidenden Tipp geben?
Grüße,
Alex
die Überschrift sagt eigentlich schon alles.
Ich habe ein Script gebastelt, das eine CSV-Datei zeilenweise durchgeht und gewisse AD-Felder mit Inhalt aus der CSV füllt.
Alles funktioniert - bis auf die Zeile, wo der Ort einzutragen ist.
Hier mein Code: (Die ForEach-Schleifen und Get-ADuser-Befehle habe ich weggelassen - Es wird auch ALLES ausgefüllt - außer der Ort)
if ($Standort -ne 1) {
Set-ADUser $_.SamAccountName -streetAddress "Beispielstrasse 1"
Set-ADUser $_.SamAccountName -l "Beispielort"
Set-ADUser $_.SamAccountName -postalCode "12345"
}
else {
Set-ADUser $_.SamAccountName -streetAddress "Musterstrasse 2"
Set-ADUser $_.SamAccountName -l "Testort"
Set-ADUser $_.SamAccountName -postalCode "54545"
}
Das Script läuft wie gesagt einwandfrei durch, aber das Feld "Location" wird nicht angerührt - es wird auch nicht mit "leer" überschrieben. Schreibe ich vor der Scriptausführung in das Feld über Active Directory Benutzer und Gruppen was rein, steht das nach der Ausführung auch noch genau so drinnen.
Kennt irgendwer das Problem und kann mir hier den entscheidenden Tipp geben?
Grüße,
Alex
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 319015
Url: https://administrator.de/contentid/319015
Ausgedruckt am: 22.11.2024 um 08:11 Uhr
6 Kommentare
Neuester Kommentar
Hi,
"-l" ist laut https://technet.microsoft.com/de-de/library/ee617215.aspx nicht vorgesehen.
Statt dessen wohl
Oder "-replace" statt "-add".
E.
"-l" ist laut https://technet.microsoft.com/de-de/library/ee617215.aspx nicht vorgesehen.
Statt dessen wohl
Set-ADUser $_.SamAccountName –add @{l="Beispielort"}
Oder "-replace" statt "-add".
E.
Servus.
Jepp, zusätzlich braucht es keine 3 Zeilen für diesen Akt, da reicht eine zusammengefasste:
Aufpassen muss man nur wenn man diese Felder mit Variablen aus der CSV füllt. Denn wenn eine Variable leer ist, wird das von -replace nicht akzeptiert und ein Fehler getriggert. Diese Eigenschaften muss man dann stattdessen über -Clear als Array angeben.
Wenn ich sowas mache schreibe erstelle ich mir entweder über Get-ADUser ein Objekt mit allen Eigenschaften und weise die Eigenschaften zu, oder wenn man es über Set-ADUser macht itteriere ich über alle CSV-Eigenschaften mit Get-Member und prüfe ob sie leer sind. Die Leeren übergebe ich dann via -Clear und die anderen via -Replace.
Grüße Uwe
Jepp, zusätzlich braucht es keine 3 Zeilen für diesen Akt, da reicht eine zusammengefasste:
Set-AdUser $_.SamAccountName -Replace @{l="Meine Location";postalCode="12345";streetAddress="Beispielstrasse 1"}
Wenn ich sowas mache schreibe erstelle ich mir entweder über Get-ADUser ein Objekt mit allen Eigenschaften und weise die Eigenschaften zu, oder wenn man es über Set-ADUser macht itteriere ich über alle CSV-Eigenschaften mit Get-Member und prüfe ob sie leer sind. Die Leeren übergebe ich dann via -Clear und die anderen via -Replace.
Grüße Uwe
Zitat von @colinardo:
Servus.
Jepp, zusätzlich braucht es keine 3 Zeilen für diesen Akt, da reicht eine zusammengefasste:
Aufpassen muss man nur wenn man diese Felder mit Variablen aus der CSV füllt. Denn wenn eine Variable leer ist, wird das von -replace nicht akzeptiert und ein Fehler getriggert. Diese Eigenschaften muss man dann stattdessen über -Clear als Array angeben.
Wenn ich sowas mache schreibe erstelle ich mir entweder über Get-ADUser ein Objekt mit allen Eigenschaften und weise die Eigenschaften zu, oder wenn man es über Set-ADUser macht itteriere ich über alle CSV-Eigenschaften mit Get-Member und prüfe ob sie leer sind. Die Leeren übergebe ich dann via -Clear und die anderen via -Replace.
Grüße Uwe
Hallo,Servus.
Jepp, zusätzlich braucht es keine 3 Zeilen für diesen Akt, da reicht eine zusammengefasste:
> Set-AdUser $_.SamAccountName -Replace @{l="Meine Location";postalCode="12345";streetAddress="Beispielstrasse 1"}
>
Wenn ich sowas mache schreibe erstelle ich mir entweder über Get-ADUser ein Objekt mit allen Eigenschaften und weise die Eigenschaften zu, oder wenn man es über Set-ADUser macht itteriere ich über alle CSV-Eigenschaften mit Get-Member und prüfe ob sie leer sind. Die Leeren übergebe ich dann via -Clear und die anderen via -Replace.
Grüße Uwe
Ich krame das mal hoch. Ich mache das grad genauso. Allerdings wenn ich das mittels GET-ADUser erstellte und durch CSV-Werte veränderten Objekt mittels SET ADUser versuche zu scheiben, bekomme ich den Replace Fehler.
$CSVData = Import-Csv $CSVPfad -Delimiter ';'
$CSVHead = $CSVData|Get-Member -MemberType "Noteproperty"
foreach ($User in $CSVData){
#ADUser auslesen
$ADUser = Get-ADUser -Filter $("DisplayName -eq '"+$User.DisplayName+"'") -Properties *
#Einzele Eigenschaft bearbeiten
foreach ($Property in $CSVHead){
$ADUser."$($Property.Name)" = $User."$($Property.Name)"
#Kontrolle
$ADUser."$($Property.Name)"
}
Set-ADUser -Instance $ADUser
}
Set-ADUser : replace
In .***\AD Auslesen.ps1:31 Zeichen:9
+ FullyQualifiedErrorId : > ActiveDirectoryServer:0,Microsoft.ActiveDirectory.Management.Commands.SetADUser
In .***\AD Auslesen.ps1:31 Zeichen:9
Set-ADUser -Instance $ADUser
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: ( [Set-ADUser], ADInvalidOperationException+ FullyQualifiedErrorId : > ActiveDirectoryServer:0,Microsoft.ActiveDirectory.Management.Commands.SetADUser
Wie fragst du ab, ob eine Eigenschaft leer ist?
Servus.
Werte in einer CSV sind alle vom Typ [string], also reicht eine einfache Abfrage:
Damit das von Set-ADUser nun auch akzeptiert wird musst du in diesem Fall dann auch die Eigenschaft auf $null setzen, ein leeren String zuweisen wird nicht aktzeptiert, es muss bei der Variante über -Instance zwingend der Wert $null sein!
Grüße Uwe
p.s. Hier mal ein Beispiel wie man sowas automatisiert inkl. LOG und Validitäts-Filterung der CSV-Attribute mit dem AD-Schema, Erkennung des CSV-Delimiters usw. macht ...
Werte in einer CSV sind alle vom Typ [string], also reicht eine einfache Abfrage:
if ($User.($Property.Name) -eq ''){
# Eigenschaft in der CSV ist leer also setze auch das AD Attribut auf $null
$ADUser.($Property.Name) = $null
}
Grüße Uwe
p.s. Hier mal ein Beispiel wie man sowas automatisiert inkl. LOG und Validitäts-Filterung der CSV-Attribute mit dem AD-Schema, Erkennung des CSV-Delimiters usw. macht ...
<#
Update AD-Users from CSV-File
#>
$csvpath = "$psscriptroot\import.csv"
$logpath = "$psscriptroot\changes_import_$(get-date -f 'yyyyMMdd_HHmmss').log"
# ==========================
# get valid property names
$class = ([System.DirectoryServices.ActiveDirectory.ActiveDirectorySchema]::GetCurrentSchema()).FindClass('user')
$validCols = $class.GetAllProperties().Name + (Get-ADUser -Filter * -Properties * -ResultSetSize 1 | gm -MemberType Property | ?{$_.Definition -match 'set;'} | select -Expand Name) | select -Unique
# import csv with delimiter detection
$data = Import-CSV $csvpath -Delimiter ([regex]::match((gc $csvpath -Raw),'^("[^"]*"|[^,;]+)\s*([,;])').Groups[2].Value)
# filter out valid properties from csv
$csvmembers = $data | gm -MemberType NoteProperty | select -Expand Name
$cmp = Compare $validCols $csvmembers -IncludeEqual -PassThru
$validfields = $cmp | ?{$_.SideIndicator -eq '=='}
$nonvalidfields = $cmp | ?{$_.SideIndicator -eq '=>'}
if ($nonvalidfields){
write-host "INFO: The following fields in your csv file will not be processed: $($nonvalidfields -join ",")" -ForegroundColor Magenta
}
$allchanges = @()
# for each line in csv
foreach ($user in $data) {
$usr = $null
# Search AD user
try{
$usr = Get-ADUser -Filter "SamAccountName -eq '$($user.SamAccountName)'" -Properties $validfields -EA Stop
}catch{}
# if no user found goto next one in csv
if ($usr -eq $null){
write-host "`r`nUser '$($user.SamAccountName)' does not exist and will not be updated" -F Yellow
continue
}
# array wich holds changes for AD user
$changelog = @()
# process all property fields
$validfields | %{
# if data from csv differs with data from AD
if ($usr.$_ -ne $user.$_){
# if attribute is not empty
if ($user.$_ -ne ''){
$changelog += [pscustomobject]@{User=$usr.SamAccountName;Attribute=$_;Before=$usr.$_;After=$user.$_;Status='OK'}
# change acutal data in object
$usr.$_ = $user.$_
# if AD User attribute is not $null
}elseif($usr.$_ -ne $null){
$changelog += [pscustomobject]@{User=$usr.SamAccountName;Attribute=$_;Before=$usr.$_;After=$user.$_;Status='OK'}
# CSV-Attribute is empty set AD value to null
$usr.$_ = $null
}
}
}
if ($changelog.Count -gt 0){
try{
# Update user account with changed data
Set-ADUser -Instance $usr -EA Stop
# add changelog to total log
$allchanges += $changelog
# List changes
write-host "`r`nAttribute changes for user '$($user.sAMAccountName)':" -F Green
$changelog | ft -AutoSize
}catch{
write-host $_.Exception.Message -F Red
$allchanges += [pscustomobject]@{User=$usr.SamAccountName;Attribute='';Before='';After='';Status="ERROR: $($_.Exception.Message)"}
}
}else{
write-host "`r`nUser '$($user.SamAccountName)' did not change." -F DarkCyan
}
}
# write all changes to logfile
if ($allchanges.Count -gt 0){
$allchanges | ft -AutoSize -Wrap | out-string | sc $logpath -Force
}
Grüße Uwe
p.s. Hier mal ein Beispiel wie man sowas automatisiert inkl. LOG und Validitäts-Filterung der CSV-Attribute mit dem AD-Schema, Erkennung des CSV-Delimiters usw. macht ...
p.s. Hier mal ein Beispiel wie man sowas automatisiert inkl. LOG und Validitäts-Filterung der CSV-Attribute mit dem AD-Schema, Erkennung des CSV-Delimiters usw. macht ...
Das sieht super Klasse aus, nur das die (für mich relevanten Felder) EmailAddress , Office , OfficePhone als nicht valide bezeichnet werden. Heißt das das die Interessantesten Felder nicht per SET-ADUser verändert werden können?
Zitat von @SPSman:
Das sieht super Klasse aus, nur das die (für mich relevanten Felder) EmailAddress , Office , OfficePhone als nicht valide bezeichnet werden. Heißt das das die Interessantesten Felder nicht per SET-ADUser verändert werden können?
Doch du musst aber bei obigen Script ohne es jetzt anzupassen die LDAP-Bezeichnungen der Eigenschaften in der CSV als Header verwenden.Das sieht super Klasse aus, nur das die (für mich relevanten Felder) EmailAddress , Office , OfficePhone als nicht valide bezeichnet werden. Heißt das das die Interessantesten Felder nicht per SET-ADUser verändert werden können?
-edit- habs dir gerade mal so angepasst das du auch die non LDAP Properties von Get-ADUser benutzen kannst.