alex94g
Goto Top

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)

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

Content-ID: 319015

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

Ausgedruckt am: 22.11.2024 um 08:11 Uhr

emeriks
emeriks 25.10.2016 um 12:48:09 Uhr
Goto Top
Hi,
"-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.
colinardo
Lösung colinardo 26.10.2016 aktualisiert um 10:19:31 Uhr
Goto Top
Servus.
Zitat von @emeriks:
> Set-ADUser $_.SamAccountName –add @{l="Beispielort"}   
> 
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"}  
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
SPSman
SPSman 10.11.2021 aktualisiert um 10:00:16 Uhr
Goto Top
Zitat von @colinardo:

Servus.
Zitat von @emeriks:
>> Set-ADUser $_.SamAccountName –add @{l="Beispielort"}   
>> 
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"}  
> 
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,

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

back-to-topSet-ADUser -Instance $ADUser

back-to-top~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : InvalidOperation: (face-smile [Set-ADUser], ADInvalidOperationException
+ FullyQualifiedErrorId : > ActiveDirectoryServer:0,Microsoft.ActiveDirectory.Management.Commands.SetADUser

Wie fragst du ab, ob eine Eigenschaft leer ist?
colinardo
colinardo 10.11.2021, aktualisiert am 12.11.2021 um 12:13:00 Uhr
Goto Top
Servus.
Zitat von @SPSman:
Wie fragst du ab, ob eine Eigenschaft leer ist?
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
}
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 ...
<#
    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
}
SPSman
SPSman 12.11.2021 aktualisiert um 09:14:28 Uhr
Goto Top
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 ...

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?
colinardo
colinardo 12.11.2021 aktualisiert um 12:12:34 Uhr
Goto Top
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.

-edit- habs dir gerade mal so angepasst das du auch die non LDAP Properties von Get-ADUser benutzen kannst.