Benutzer mit den meisten Antworten
Extension Attribut im AD anpassen - schon belegte Attribute aber überspringen

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!
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
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
-
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...
-
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 -
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!!
-
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.
-
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