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, 1226 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
Windows 7

Südkoreas Regierung setzt auf Linux, um Windows 7 Clients abzulösen

Information von kgborn vor 10 StundenWindows 71 Kommentar

Kleiner Infosplitter zum Wochenanfang: Während München (LiMux) und die niedersächsische Finanzverwaltung von Linux auf einen Windows 10-Client (und Office) ...

Internet
Big Brother is Watching You
Information von transocean vor 21 StundenInternet

Moin, die Datenkrake Google fischt Informationen über Einkäufe ab, die GMail Nutzer im Netz tätigen. Gruß Uwe

Datenschutz
TeamViewer gehackt !
Information von aqui vor 23 StundenDatenschutz4 Kommentare

Hat schon einen Grund warum verantwortungsvolle Admins diese Software nicht einsetzen und sie in den meisten größeren Firmen aus ...

Netzwerke

Cisco Security Warnung für SoHo Switches der SG Serie

Information von aqui vor 2 TagenNetzwerke3 Kommentare

Update auf eine aktuelle Version wäre also eine gute Idee ! ;-)

Heiß diskutierte Inhalte
Netzwerkgrundlagen
Netzwerk IP Kamera nur an einem Rechner sichtbar
Frage von Lutz-ReNetzwerkgrundlagen8 Kommentare

Guten Abend Ich hab in einem IP 4 Netzwerk mit gleichen Subnetz zwei Kameras mit festen IP Adresse und ...

Verschlüsselung & Zertifikate
Verschlüsselungsmethoden für Netzwerkdateien im Firmennetzwerk
Frage von kafipauseVerschlüsselung & Zertifikate7 Kommentare

Hallo, ich suche für meine Firma eine Verschlüsselungssoftware, um einige Ordner auf einem Fileserver zu verschlüsseln und verschiedenen Gruppen ...

Microsoft Office
Office 2010, 2013, 2016 und 2019 auf einem PC ohne Dualboot?
gelöst Frage von RT81-2019Microsoft Office6 Kommentare

Office 2010, 2013, 2016 und 2019 auf einem PC ohne Dualboot? In wie fern ist es möglich, das 2010 ...

LAN, WAN, Wireless
OpenVpn - Options error: Maximum option line length (256) exceeded - Editor Notepad++
Frage von mike7050LAN, WAN, Wireless5 Kommentare

Hallo zusammen, ich komme nicht mehr weiter leider: Ich habe OpenVPN auf zwei Windows 10 Pro Notebooks eingerichtet. Notebook ...