none
Extension Attribut im AD anpassen - schon belegte Attribute aber überspringen RRS feed

  • Frage

  • Moin moin,

    folgendes Szenario: Es geht darum, dass es eine Excel Tabelle gibt, welche Usernamen und das ExtensionAttribut beinhaltet. Dieses Attribut soll im AD befüllt werden. Dazu hier mein Skript

    ########################################################### # Logging $Log = "C:\_Install\Logs\Log" + (Get-Date -format s).Replace(":","-") +".log" $LogLevel = "INFO" function LogWrite { Param ([string]$LogString, [string]$LogLevel) $nowDate = Get-Date -format dd.MM.yyyy $nowTime = Get-Date -format HH:mm:ss if ($logLevel -eq "EMPTY") { Add-content $Log -value "$LogString" Write-Host "$LogString" } else { Add-content $Log -value "[$LogLevel] - [$nowDate] - [$nowTime] - $LogString" Write-Host "[$LogLevel] - [$nowDate] - [$nowTime] - $LogString" } } Import-Module ActiveDirectory LogWrite -LogString $("Active Directory Modul importiert") $users = Import-Csv -Path "C:\_Install\User-Liste.csv" foreach ($user in $users) { Try { Set-ADUser -Identity $user.SamAccountName -Replace @{extensionAttribute14 = $user.ExtensionAttribute14} LogWrite -LogString $("Ext-Attribut erfolgreich bei $user gesetzt") } Catch { #Fehlermeldung ausgeben $ErrorMessage = $_.Exception.Message $FailedItem = $_.Exception.ItemName LogWrite -LogString $("ExtensionAttribut konnte nicht gesetzt werden " + $user +" " + $ErrorMessage + " " + $FailedItem) } } write-host "Fertig!" -ForegroundColor Green

    Das Problem dabei ist der Replace Parameter. Sofern das Attribut im AD bereits gefüllt ist, soll der Eintrag übersprungen werden. Wie stelle ich das am Cleversten an? Leider habe ich wenig bis gar keine Aktien in PowerShell, sodass mir hier ein Ansatz fehlt. Diverse if Abfragen sowie where-objet Abfragen habe ich mit meinen Halbwissen erfolglos getestet..

    Herzlichen Dank!

    Montag, 16. Oktober 2017 09:30

Antworten

Alle Antworten

  • Moin,

    zwei Varianten:

    1. Prüfen, ob das Attribut bereits gesetzt ist, z.B. indem Du statt Set-ADUser -Identity <Parameter> so etwas wie

    Get-ADUser -LDAPFilter "(&(SAMAccountName=$($user.SAMAccountName))(extensionAttribute14=*))" | Set-ADUser <Parameter>

     verwendest. Das wäre sauber und würde keine Fehler erzeugen.

    2. Im Set-ADUser -Add statt -Replace verwenden. Ich meine, das wird knallen, wenn das Attribut bereits gesetzt ist. Allerdings wird es auch knallen, wenn das Attribut mit einem leeren String befüllt ist, was in Deinem Fall vermutlich nicht korrekt wäre.


    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> http://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com

    • Als Antwort markiert Bonibuna Dienstag, 17. Oktober 2017 06:21
    Montag, 16. Oktober 2017 09:39
  • Danke für die fixe Antwort!

    Ja, korrekt. Variante 2 wäre schlecht aufgrund dessen, dass das Attribut im Grunde auch nur 1 mal vorkommen darf. (Es handelt sich hier um Telefonnummern).

    Sofern ich deine 1. Variante richtig interpretiere, sollte diese dann in etwas so aussehen, richtig?

    Get-ADUser -LDAPFilter "(&(SAMAccountName=$($user.SAMAccountName))(extensionAttribute14=*))" | 
    Set-ADUser $user.ExtensionAttribute14

    Zum einen verstehe ich nich warum dadruch schon vorhandene Einträge übersprungen werden und zum anderen erscheint folgender Fehler:

    "Set-ADUser : The input object cannot be bound to any parameters for the command either because the command does not take pipeline
    input or the input and its properties do not match any of the parameters that take pipeline input."

    Das Verständnis für den Inhalt werde ich mir sicherlich selber aneignen können / müssen. Bezüglich des Fehlers stehe ich aber leider erneut auf dem Schlauch. Nach meinem Verständnis wird in der ersten Zeile eine Abfrage der User gemacht, welche dann durch die Pipe in die nächste Zeile mit übernommen werden, sodass ich hier keine weitere Parameter angeben muss oder? Sprich so wie die Zeile oben ist - würde dann nicht die Angabe der Variable, die das Attribut beinhaltet reichen?

    Höchstwahrscheinlich vollkommener Stuß, den ich hier von mir gebe...

    Montag, 16. Oktober 2017 09:53
  • Moin, im LDAP-Filter habe ich noch die Umkehrung vergessen, die zweite Klammer muss lauten (!(extensionAttribute14=*)) Aber wichtiger ist, es gibt keine erste und zweite Zeile, sondern die gesamte Pipe ist eine Zeile.

    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> http://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com

    Montag, 16. Oktober 2017 10:05
  • Die eine Zeile sieht nun so aus

    Get-ADUser -LDAPFilter "(&(SAMAccountName=$($user.SAMAccountName))(!(extensionAttribute14=*))" | Set-ADUser $user.ExtensionAttribute14
    

    Beim Ausführen des Skriptes erscheint nun "The search filter cannot be recognized "

    Ich vermute, dass ich mich da wohl noch "etwas" belesen muss.

    In jedem Fall aber herzlichen Dank!!

    Montag, 16. Oktober 2017 10:14
  • Möglicherweise scheint das "und" auch das Problem zu sein.

    Get-ADUser -LDAPFilter "(samAccountName=Test)"

    funktioniert

    Get-ADUser -LDAPFilter "(!(extensionAttribute14=*))"

    funktioniert

    Get-ADUser -LDAPFilter "(&(samAccountName=Test)(!(extensionAttribute14=*))"

    funktioniret dann nicht.

    In dem Test der 3 Befehle rufe ich diese noch nicht einmal aus der Excel Tabelle ab.

    Montag, 16. Oktober 2017 11:41
  • Get-ADUser -LDAPFilter "(&(samAccountName=Test)(!(extensionAttribute14=*))"

    Jede Klammer, die man öffnet, muß man auch wieder schließen :-)))

    Montag, 16. Oktober 2017 14:10
  • Moin,

    vermutlich hat Martin das auch schon geschrieben, aber es fehlt eine schließende Klammer am Ende des Filters.


    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> http://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com

    Montag, 16. Oktober 2017 14:11