Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

gelöst New-ADUser (optional Parameter)

Mitglied: mc-doubleyou

mc-doubleyou (Level 2) - Jetzt verbinden

28.11.2016, aktualisiert 12:56 Uhr, 1539 Aufrufe, 13 Kommentare, 5 Danke

Hallo zusammen,

mittels New-ADUser möchten wir mehrere Userkonten anlegen.
Allerdings haben nicht alle Benutzer eine E-Mail Adresse, bei diesen ist dann das Feld in der CSV leer.

Gibt es eine Möglichkeit bestimmte Parameter als optional zu kennzeichnen, damit der Befehl nicht abgebrochen wird wegen einem Fehler?
Also eigentlich ein wenn Parameter Variable leer dann nicht nutzen.

Ich hätte schon im Internet gesucht, aber konnte nur Anleitungen finden wie man es realisert wenn man sich selbst eine Funktion schreiben würde.

Danke!

LG mcdy
Mitglied: Dani
LÖSUNG 28.11.2016, aktualisiert um 12:49 Uhr
Moin,
Gibt es eine Möglichkeit bestimmte Parameter als optional zu kennzeichnen, damit der Befehl nicht abgebrochen wir wegen einem Fehler?
leg doch mit New-ADUser den Benutzer zuerst mit allen Pflichtwerten an. Anschließend über Modifizierung die optionalen Wert/Parameter.


Gruß,
Dani
Bitte warten ..
Mitglied: mc-doubleyou
28.11.2016 um 12:55 Uhr
Hallo Dani,

gute Idee und da dann also immer erst Prüfung ob Variable leer und wenn nicht dann Set-ADUser -Parameter

Fehler unterdrücken könnte zwar auch helfen sehe ich aber nicht als unbedingt sinnvoll an.
Eine richtige Option dafür ist dir also auch nicht bekannt?
Danke mal für den Ansatz, mal sehen ob noch wer eine Idee mit weniger Zeilen hat ^^

LG mcdy
Bitte warten ..
Mitglied: 131381
LÖSUNG 28.11.2016, aktualisiert um 15:29 Uhr
Zitat von mc-doubleyou:

gute Idee und da dann also immer erst Prüfung ob Variable leer und wenn nicht dann Set-ADUser -Parameter
Ja das musst du, denn mit Set-AdUser musst du wenn du ein Feld auf Null setzt statt -Replace den Parameter -Clear benutzen weil -replace keine leeren Werte erlaubt!
Das lässt sich kompakter schreiben indem man die Felder der CSV filtert welche einen leeren Wert haben und welche nicht. D.h. Mit Get-Member alle Spaltennamen holen und dann per Schleife über die Namen prüfen ob Feld leer oder nicht.

Bsp.
01.
$csv = Import-CSV ................
02.
$fields = $csv | gm -Membertype NoteProperty | ?{$_.Name -ne 'SamAccountName'} | Select -Expand Name
03.
foreach ($line in $csv){
04.
    $user = Get-AdUser $line.SamAccountName -EA Ignore
05.
    If ($user){
06.
        $empty = @(); $notempty = @{}
07.
        $fields | %{
08.
            If ($line.$_ -ne ""){
09.
                $notempty.$_ = $line.$_
10.
            }else{
11.
                $empty += $_
12.
            }
13.
        }
14.
       Set-Aduser $_.SamAccountName -replace $notempty -clear $empty
15.
    }
16.
}
So fackelt man die Änderung mit einem einzigen Set-Aduser ab und spart sich so mehrere Aufrufe, was Ressourcen einspart und das Script schneller macht.

Gruß
Bitte warten ..
Mitglied: mc-doubleyou
28.11.2016, aktualisiert um 15:11 Uhr
Hallo mikrotik,

also da komm ich jetzt nicht ganz mit was du meinst Oo

Ich habe eine CSV und diese wird importiert, folgende Felder sind nicht immer definiert und würden daher einen Fehler liefern weil der Parameter keinen Wert hat:

  • E-Mail
  • Fax
  • Handy

Fax und Handy ist eine 0 also nicht so schlimm, E-Mail wäre aber wirklich leer.

Wenn ich nun, wie Dani meinte, mit New-ADUser alle definiere die sicher nicht leer sind und dann diese drei mit
01.
if (!(!$email)) { Set-AdUser -EmailAddress $email }
02.
if (!(!$fax)) { Set-AdUser -Fax $fax }
03.
if (!(!$handy)) { Set-AdUser -MobilePhone $handy }
dann ist mir die Lösung klar.

Mit deinem Ansatz würde ich doch nur ein bereits volles AD Feld wieder löschen, oder?

Danke!

LG mcdy
Bitte warten ..
Mitglied: 131381
28.11.2016, aktualisiert um 15:27 Uhr
Zitat von mc-doubleyou:

Hallo mikrotik,

also da komm ich jetzt nicht ganz mit was du meinst Oo

Ich habe eine CSV und diese wird importiert, folgende Felder sind nicht immer definiert und würden daher einen Fehler liefern weil der Parameter keinen Wert hat:

  • E-Mail
  • Fax
  • Handy
Ja.
Fax und Handy ist eine 0 also nicht so schlimm, E-Mail wäre aber wirklich leer.
Ok
Wenn ich nun, wie Dani meinte, mit New-ADUser alle definiere die sicher nicht leer sind und dann diese drei mit
01.
> if (!(!$email)) { Set-AdUser -EmailAddress $email }
02.
> if (!(!$fax)) { Set-AdUser -Fax $fax }
03.
> if (!(!$handy)) { Set-AdUser -MobilePhone $handy }
04.
> 
dann ist mir die Lösung klar.

Mit deinem Ansatz würde ich doch nur ein bereits volles AD Feld wieder löschen, oder?
Wenn in deiner CSV nicht immer die vollständig gewünschten Daten drin stehen dann ja, ich ging davon aus das in der CSV alle Daten des Users drin stehen, d.h. wenn dort ein Feld leer ist dann soll es auch im AD leer gemacht werden.
Aber das kannst du oben ganz einfach anpassen indem du das -Clear Flag weglässt

Kommt halt drauf an wie euer Workflow ist.
Mit obigem sparst du dir halt sämtliche einzelnen Set-ADUser Schreibzugriffe und reduzierst das auf einen einzigen.

Du kannst auch das $user Objekt selber verändern und am Schluss an Set-AdUser pipen dann braucht man auch nicht mehrfach mit seit-Aduser hantieren, denn das kostet einfach zu viele Resourcen wenn man für ein und den selben User 10mal Set-Aduser aufruft.

Es gibt 1000 Wege nach Rom

Das obige Script macht nichts anderes als gefüllte Felder in eine Hashtable zu schreiben die dann an Set-Aduser -Replace gefüttert wird. Wenn du leere Felder in der CSV nicht am AD Objekt ändern willst lässt du im Set-Aduser Befehl einfach das -Clear Flag und das Array der leeren Spalten weg.
Bitte warten ..
Mitglied: mc-doubleyou
28.11.2016 um 16:12 Uhr
Hallo und Danke mikrotik,

mehrfach Set-ADUser ist sicher nicht optimal da bin ich bei dir, leider verstehe ich deinen Aufbau aber so gar nicht.

Damit würde ich auch mehrfaches Set-ADUser verhindern

01.
$Land = "AT"
02.
$vara = "user@domain.eu"
03.
$varb = "05123456789"
04.
$varc = "09123456789"
05.

06.
if (!(!$vara)) { $Mail = @{mail=$vara} }
07.
if (!(!$varb)) { $Fax = @{facsimileTelephoneNumber=$varb} }
08.
if (!(!$varc)) { $Handy = @{mobile=$varc} }
09.

10.
if ($Land -eq "AT") { $Additional = @{c="AT";co="Austria";countrycode=40} }
11.

12.
if (!(!$Mail)) { $Additional += $Mail }
13.
if (!(!$Fax)) { $Additional += $Fax }
14.
if (!(!$Handy)) { $Additional += $Handy }
bezüglich der Sinnhaftigkeit bin ich aber nicht sicher ;)

Eventuell kannst mir deinen Ansatz um $empty erleichtern und kurz erklären.

Danke!

LG mcdy
Bitte warten ..
Mitglied: 131381
28.11.2016, aktualisiert um 17:50 Uhr
Wohl noch nicht so lange dabei was

Na dann hier der obige Code nochmal mit Kommentaren
01.
# CSV importieren ...
02.
$csv = Import-CSV ................
03.
# Überschriften der CSV ermitteln und SamAccountName Spalte excluden (wollen wir ja nicht ändern :-))
04.
$fields = $csv | gm -Membertype NoteProperty | ?{$_.Name -ne 'SamAccountName'} | Select -Expand Name
05.
# Für jede Zeile der CSV:
06.
foreach ($line in $csv){
07.
    #userobject holen
08.
    $user = Get-AdUser $line.SamAccountName -EA Ignore
09.
    If ($user){
10.
        # ein Array das die Spalten enthalten soll dievLeer sind, und eine Hashtable die hinterher die nicht leeren Felder mit deren Werten enthält
11.
        $empty = @(); $notempty = @{}
12.
        # Array der Spaltennamen durchlaufen
13.
        $fields | %{
14.
            # wenn Spalte der aktuellen Zeile nicht leer ist
15.
            If ($line.$_ -ne ""){
16.
                # füge sie zur Hashtabke hinzu
17.
                $notempty.$_ = $line.$_
18.
            }else{
19.
                #Spalte ist leer also füge den Namen zum Array $empty hinzu
20.
                $empty += $_
21.
            }
22.
        }
23.
       # setze die Informationen im Account per replace Parameter und clear parameter (steht ja in der Doku was diese machen!)
24.
       Set-Aduser $_.SamAccountName -replace $notempty -clear $empty
25.
    }
26.
}
Statt jede Spalte der CSV manuell zu prüfen macht das der obige Code über eine zusätzliche Schleife über die CSV-Spaltennamen, und das spart Zeilen wenn es um eine Menge Spalten geht.
Das ganze spart halt das andauernde Variablen erstellen und prüfen jeder einzelnen Spalte separat und reduziert somit den Codeaufwand, und das war ja wie du geschrieben hast dein primäres Ziel.
Bitte warten ..
Mitglied: mc-doubleyou
28.11.2016 um 17:29 Uhr
Hallo mikrotik,

Wohl noch nicht so lange dabei was

Noch nicht sehr lange, war bisher nur Batcher und da kein besonders guter ;)

Hab eben dein Script versucht und verstehe jetzt wie es funktioniert, es baut einfach darauf auf, dass der Titel der Spalte dem AD Attribut entspricht.
Ist aber bei mir nicht der Fall weil die Namen der AD Attribute nicht jeder verstehen würde, auch ich tue mir da zugegebenermaßen auch noch etwas schwer.

Somit wird es vorerst bei einem größeren Codeaufwand, wie oben geschrieben bleiben, immerhin mach ich dann nur einmal

  • New-ADUser
  • Add-ADGroupMember
  • Set-ADUser

Wobei ich Set-ADUser ohnehin schon für Manager und Land gebraucht habe.

Für den Lerneffekt habe ich aber trotzdem noch paar kurze Fragen.

01.
?{$_.Name -ne 'SamAccountName'}
wird da durch das ?{} exkludiert?

01.
-EA Ignore
ist das um Fehler zu unterdrücken?

01.
$fields | %{ 
was bewirkt das %{}

01.
If ($line.$_ -ne "")
müsste dann das selbe sein wie
01.
if (!line.$_)

01.
$empty += $_
meintest du nicht eher: Spalte ist leer also füge den Namen zum Array $empty hinzu

Danke!

LG mcdy
Bitte warten ..
Mitglied: 131381
LÖSUNG 28.11.2016, aktualisiert um 17:57 Uhr
Zitat von mc-doubleyou:
Hab eben dein Script versucht und verstehe jetzt wie es funktioniert, es baut einfach darauf auf, dass der Titel der Spalte dem AD Attribut entspricht.
Ist aber bei mir nicht der Fall weil die Namen der AD Attribute nicht jeder verstehen würde, auch ich tue mir da zugegebenermaßen auch noch etwas schwer.
Das zu implementieren wäre aber ein leichtes. Dazu würde man einfach eine weitere Mapping-Tabelle mit einer Hashtable erstellen die die tatsächlichen AD-Attribute auf die in der CSV genutzen umsetzt und nutzt dann diese in der Schleife.
Somit wird es vorerst bei einem größeren Codeaufwand, wie oben geschrieben bleiben, immerhin mach ich dann nur einmal
Eigentlich nicht, s.o.
Für den Lerneffekt habe ich aber trotzdem noch paar kurze Fragen.

01.
?{$_.Name -ne 'SamAccountName'}
wird da durch das ?{} exkludiert?
Nein das ist eine Abkürzung für das CMDLet where-object, es werden also nur Objekte in der Pipeline übernommen dessen Eigenschaft nicht gleich "SamAccountName" ist.
01.
-EA Ignore
ist das um Fehler zu unterdrücken?
Ja. Abkürzung für -ErrorAction
01.
$fields | %{ 
was bewirkt das %{}
Das ist eine Abkürzung für eine For-Schleife in der Pipeline.
01.
If ($line.$_ -ne "")
müsste dann das selbe sein wie
01.
if (!line.$_)
Kannst du auch.

01.
$empty += $_
meintest du nicht eher: Spalte ist leer also füge den Namen zum Array $empty hinzu
Ja Tippfehler ist oben korrigiert.

Gruß
Bitte warten ..
Mitglied: mc-doubleyou
28.11.2016 um 20:27 Uhr
Hallo mikrotik,

solltest du es noch sehen.

Ich muss wohl nochmal das Skript überarbeiten weil paar Parameter viel Rot liefern.
Darum würde mich interessieren wie das mit der Hashtable Übersetzung funktionieren könnte.

Danke!

LG mcdy
Bitte warten ..
Mitglied: 131381
28.11.2016, aktualisiert um 23:53 Uhr
Zitat von mc-doubleyou:
Ich muss wohl nochmal das Skript überarbeiten weil paar Parameter viel Rot liefern.
Darum würde mich interessieren wie das mit der Hashtable Übersetzung funktionieren könnte.
01.
# CSV importieren ...
02.
$csv = Import-CSV ................
03.
# Zuordnungstabelle von Spalten der CSV zu Active Directory Attributen
04.
$map = @{
05.
    'deinecsvspalte1' = 'activedirectoryattribut1'
06.
    'deinecsvspalte2' = 'activedirectoryattribut2'
07.
}
08.
# Überschriften der CSV ermitteln und SamAccountName Spalte excluden (wollen wir ja nicht ändern :-), wenn die Spalte in deiner CSV anders heißt natürlich anpassen)
09.
$fields = $csv | gm -Membertype NoteProperty | ?{$_.Name -ne 'SamAccountName'} | Select -Expand Name
10.
# Für jede Zeile der CSV:
11.
foreach ($line in $csv){
12.
    #userobject holen
13.
    $user = Get-AdUser $line.SamAccountName -EA Ignore
14.
    If ($user){
15.
        # ein Array das die Spalten enthalten soll dievLeer sind, und eine Hashtable die hinterher die nicht leeren Felder mit deren Werten enthält
16.
        $empty = @(); $notempty = @{}
17.
        # Array der Spaltennamen durchlaufen
18.
        $fields | %{
19.
            # wenn Spalte der aktuellen Zeile nicht leer ist
20.
            If ($line.$_ -ne ""){
21.
                # füge sie zur Hashtable hinzu (inkl. Umwandlung durch Attributmapping)
22.
                $notempty.($map[$_]) = $line.$_
23.
            }else{
24.
                # Spalte ist leer also füge den Namen zum Array $empty hinzu
25.
                $empty += $_
26.
            }
27.
        }
28.
       # setze die Informationen im Account per replace Parameter und clear parameter (steht ja in der Doku was diese machen!)
29.
       Set-Aduser $_.SamAccountName -replace $notempty -clear $empty
30.
    }
31.
}
Bitte warten ..
Mitglied: mc-doubleyou
29.11.2016 um 13:24 Uhr
Hallo mikrotik,

danke!

Werde mal sehen wann und wie ich umbaue, wie sich herausgestellt hat, wird es nicht zwangsweise rot.
Habe heute nur mal eine Firma importiert und das hat hervorragend funktioniert, es liegt dann also eher an der Formatierung der CSV bzw. am Aufbau der Namen. Vermutlich passen ihm á é usw. nicht, nachdem was ich bisher gelesen habe.

Wenn ich aber doch mal eine Finale Version für Import der User baue, nach Initialimport werde ich mit deinem Script arbeiten.

Nochmal danke und LG
mcdy
Bitte warten ..
Mitglied: 131381
29.11.2016 um 13:33 Uhr
wird es nicht zwangsweise rot.
Ich werd auch gleich rot
Bitte warten ..
Ähnliche Inhalte
Exchange Server
New-PublicFolderMoveRequest
gelöst Frage von IxxZettExchange Server2 Kommentare

Hallo zusammen, derzeit habe ich unseren Exchange noch auf dem DC (Exch2016 auf WS2012R2) das war noch nie gut ...

Batch & Shell
New-PSDrive im Skript
gelöst Frage von erikroBatch & Shell2 Kommentare

Moin, gleich vorweg: Es ist keine Domain vorhanden. Gruppenrichtlinien fallen also weg. Bisher wird den Usern eine Freigabe per ...

Windows Netzwerk
Namensauflösung bei New-Pssession
Frage von IT-twakWindows Netzwerk2 Kommentare

Hey, habe mein vorheriges Problem, den Namen meiner VM aufzulösen wenn ich vom Host eine RDP Verbindung herstelle gelöst. ...

Exchange Server
Problem mit New-PublicFolderMoveRequest
Frage von IxxZettExchange Server1 Kommentar

Hallo, ich habe testweise in einen zweiten Exchange 2016 in einer Domäne installiert (Ws2012R2) und testweise ein Userpostfach über ...

Neue Wissensbeiträge
Viren und Trojaner
Trend Micro WFBS 10 SP1 Patch 2185
Tipp von Abramelin vor 3 StundenViren und Trojaner

Hi, Hab gerade gesehen das Patch 2185 für TM WFBS 10 SP1 erschienen ist! Werde mal Morgen den Patch ...

Viren und Trojaner

Neuer Virus lässt Windows im abgesicherten Modus starten

Tipp von transocean vor 6 StundenViren und Trojaner2 Kommentare

Moin, lest selbst. Grüße Uwe

Sicherheit
Böser Bug in Domänenkennwortrichtlinie!
Information von DerWoWusste vor 11 StundenSicherheit1 Kommentar

Ich spiegele mal Borncity: In Kürze: Nutzt Ihr eine Domänen-Kennwortrichtlinie der herkömmlichen Art (keine PSO-Richtlinie)? Ja? Und plant Ihr, ...

Windows Tools
7-Zip v19.0 MSI silent uninstall
Tipp von Dirmhirn vor 1 TagWindows Tools5 Kommentare

Hi, ich versuchte grade 7-Zip v19.0 MSI silent zu deinstallieren. mit msiexec /x stürzt mir immer der Explorer ab. ...

Heiß diskutierte Inhalte
Sicherheitsgrundlagen
Sperrung der IMAP Aktivierung: GMail für Apple Mail - in einer Schul-Google-Suite
Frage von lazylandSicherheitsgrundlagen15 Kommentare

Hallo, ich würde mich sehr über Eure Einschätzung und Rat freuen: Der Administrator einer Google Suite (Schule) löscht aus ...

Windows 10
Win10 Remote Desktop User anders
Frage von ludibubiWindows 1014 Kommentare

Folgende Situation: Auf meinem Rechner (Win10) in der Firma (Domänen-Netzwerk) starte ich abends bevor ich gehe einen Newsletterversand. Damit ...

Windows 8
Snipping Tool Alternative für bzw ab Windows 8.1
gelöst Frage von schmitziWindows 814 Kommentare

Hallo, ich suche für Windows 8.1 eine Alternative für das bordeigene Snipping Tool von MS, vielleicht weiss ja jemand ...

Server-Hardware
Anschaffung neuer Server
Frage von tschip1801Server-Hardware14 Kommentare

unsere Firma bekommt einen neuen Server, ich bin schon sehr lange nicht mehr so tief im geschehen um hier ...