none
Formular Benutzer anlegen/ändern RRS feed

  • Frage

  • Ich schreibe gerade an einem PowerShell Script um Benutzer Daten anzulegen und ändern zu können.

    Das Anzeigen vorhandener Benutzer klappt auch super, nur wenn der Benutzer in der AD nicht gefunden wurde und in eine andere Funktion springt habe ich ein Problem.

    Wie gehe ich vor:

    Es wird ein Formular aufgerufen:

    Hier gebe ich den Anmeldenamen ein. Beim Verlassen des Feldes wird der Benutzer in der AD gesucht.

    $handler_TB_Anmeldename_Leave= 
    {
    Try
      { 
       #Fehler abfangen, wenn der Anmeldename nicht gefunden wird. 
       $Script:GetADUserResult = Get-ADUser -Identity $TB_Anmeldename.Text  -Properties Title,Initials,telephoneNumber,otherTelephone,mobile,otherMobile,mail,description,physicalDeliveryOfficeName,EmployeeID,EmployeeNumber,extensionAttribute1,msTSProfilePath,distinguishedName -errorvariable myerrorvariable  
       
      }
      Catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException]
      {
       # Bei nicht gefundenem Anmeldenamen wird zur Eingabe gesprungen
       Write-Host "Benutzer wird angelegt"
       $SetADUser = @()
       Set-WLUserEingabe
       return;
      }
      Catch 
      {
       Write-Host "Es ist ein unbekannter Fehler aufgetreten!"+$Error[0]
       break
      }
      Finally
      {
       Write-Host "Finally und dann nix"
      }
      Write-Host "Benutzer anzeigen"
      # Wenn der Benutzer vorhanden ist und kein Fehler aufgetreten ist, werden die Attribute angezeigt.
      If (!$myerrorvariable)
      {
       Get-WLUserDaten        
      }
    }

    Sollte der Benutzer vorhanden sein, dann werden die Attribute, soweit in der AD gepflegt, angezeigt.

    Ist der Benutzer nicht vorhanden, dann wird die Funktion Set-WLUserEingabe gesprungen.

    In dieser Funktion sollen die Attribute eingetragen werden, bis ein bestimmtes Ereignis eintritt, z.B. klicken auf einen Button Speichern. Zur Zeit soll die Eingabe solange aktiv bleiben, bis das Feld Kartennummer einen bestimmten Wert hat.

    function Set-WLUserEingabe()
    {
      $TB_UserPrincipalName.Focus()
      Do 
      {
      $SetADUser.Anmeldename = $TB_Anmeldename.Text
      $TB_UserPrincipalName.Text = $TB_Anmeldename.Text+"@WL.ADS"	
      $SetADUser.UserPrincipalName = $TB_UserPrincipalName.Text
      $SetADUser.Title = $TB_Titel.Text
      $SetADUser.GivenName = $TB_Vorname.Text
      $SetADUser.Surname = $TB_Nachname.Text
      $SetADUser.Initials = $TB_Initalen.Text
      $SetADUser.telephoneNumber = $TB_TelefonNr.Text
      $SetADUser.otherTelephone = $TB_TelefonKurzw.Text
      $SetADUser.mobile = $TB_HandyNr.Text
      $SetADUser.otherMobile = $TB_HandyKruzw.Text
      $TB_EMailAdresse.Text = $TB_Vorname.Text+"."+$TB_Nachname.Text+"@westlotto.com"
      $SetADUser.mail = $TB_EMailAdresse.Text
      $SetADUser.physicalDeliveryOfficeName = $TB_Dienstort.Text
      $SetADUser.description = $TB_Beschreibung.Text
      $SetADUser.EmployeeNumber = $TB_MitarbeiterNr.Text
      $SetADUser.EmployeeID = $TB_Kartennr.Text
      Write-Host $SetADUser.Anmeldename
      }until($TB_Kartennr.Text -eq "Schluss")
    }

    Leider hängt sich das Script in der Do-Until Schleife auf bzw. das Script wird nicht bedienbar! Weiß einer Rat? Oder wo habe ich einen Denk Fehler?

    Gruß

    Dirk

    Dienstag, 23. Juli 2013 09:06

Antworten

  • PowerShell  wurde NICHT dazu gedacht Grafische Benutzer Oberflächen (GUI) zu Programmieren. (Auch wenn man es machen kann)
    PowerShell wurde konzipiert um Administrative Aufgaben im Hintergrund OHNE Fenster meist remote zu erledigen. Automation eben.
    Deshalb sollte man die GUI Entwicklung  sehr sparsam einsetzen und nur einfache Oberflächen Programmieren.
    Bei der GUI Programmierung muss man sich mit den Events beschäftigen die in der PowerShell fast keine Rolle spielen.
    Wenn die PowerShell eine längerdauernde Aufgabe erledigt wie z.B. das durchsuchen der Festplatte, kann der User während dessen keine eingaben mehr in der PowerShell GUI tätigen. Die GUI ist aus Sicht des Benutzers „eingefroren“. PowerShell kann in einem Prozess immer nur eine Sache gleichzeitig erledigt (Single Thread) und hat dann keine "Zeit" die Eingaben des Benutzers zu verarbeiten.
    Deshalb kommt schnell das Thema Multithreading auf den Tisch. Multithreading ist das „gleichzeitige“ abarbeiten von mehreren Aufgaben in einem einzigen (PowerShell) Prozess.
    Stabile Programme mit Multithreading zu entwickeln ist selbst für erfahrenen Programmierer keine leichte Aufgabe.
    GUI Programmierung erfordert also grundlegenden Kenntnisse in der.NET Programmierung UND PowerShell Kenntnisse.
    Aus diesem Grund gibt es wenige PowerShell Nutzer die  GUI Programmierung beherrschen (wollen oder müssen).
    Bei der GUI Programmierung muss man natürlich immer bei den C# .NET Entwicklern nachschauen da dies kein Gebiet der PowerShell ist!
    Man sollte auch bei der Internet Recherche mit dem Suchwort C# arbeiten, anstatt mit dem Suchwort PowerShell.
    Siehe hier:
    http://openbook.galileocomputing.de/visual_csharp/visual_csharp_13_001.htm
    http://openbook.galileocomputing.de/visual_csharp/visual_csharp_14_001.htm

    Wenn man in einem Windows Forms Formular, die Eingaben eines GUI Benutzers auf Richtigkeit überprüfen (validieren) will, kann man dies Einzeln in den Events von jedem einzelnen Windows Forms Control machen (Textbox, ListView, Checkbox usw..). Viel Controls bieten dazu das Validation Event an!
    Sieh hier abschnitt 14.1.10 Steuerelemente fokussieren -> Validierung von Benutzereingaben
    http://openbook.galileocomputing.de/visual_csharp/visual_csharp_14_001.htm#mjbac36e44e5fc14dfac57cf3a2a293dd8
    Und hier:
    http://msdn.microsoft.com/de-de/library/vstudio/ms229603.aspx#
    Viele Programmierer benutzen auch das KeyPress  oder keyUp Ereignis einer Textbox um die Eingabe bei jedem Buchstaben zu überprüfen.
    Siehe hier; Events der Textbox:
    http://msdn.microsoft.com/de-de/library/system.windows.forms.textbox_events%28v=vs.80%29.aspx

    Dies hat den Vorteil dass der User sofort bei der Eingabe Feedback bekommt. Dies ist aber sehr aufwändig, man hat viele Events (pro Control  mindestens eins) zu Programmieren und zu pflegen.

    Leichter / Besser ist es, einen OK Button anzulegen und beim drücken dieses Buttons werden die Eingaben in allen Controls überprüft und die Falschen eingaben werden angezeigt (zb. Textbox Schriftfarbe = Rot oder Messagebox mit erklärenden Text).
    Der OK Button lässt den User erst weitermachen, wenn alle eingaben OK sind! (Deshalb heißt er Ok Button ;-)  )  Dann werden alle eingaben in Variablen übertragen oder abgespeichert und umgesetzt. Die geshieht alle in dem einen Click Ereigniss des OK Buttons an einem Platz im Code !

    Wen der User keinen bock hat die verlangten Eingaben ordentlich zu machen, kann er auf einen Cancel  Button drücken oder das Dialog-Fenster Schließen, dabei gehen alle Eingaben verloren.


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!



    Mittwoch, 24. Juli 2013 09:21

Alle Antworten

  • Hallo Dirk !

    Das was du hier zeigst ist ein Musterbeispiel dafür, wie man Schleifen auf keinen Fall einsetzen sollte!

    Schleifen sollten nicht für ein so genanntes Polling (to poll die Umfrage)verwendet werden.
    Polling heißt, man fragt ständig wiederholt nach, ob eine Arbeit schon fertig ist (nerven).
    Das ständige Nachfragen kostet sehr viel Prozessor (CPU) Zeit und die CPU wird so stark beschäftig das sie keine Zeit mehr hat etwas anderes zu bearbeiten.
    Pollen kostet viele Ressourcen und ist BÖSE!!!!

    Was soll das auch für einen Sinn machen, das einer Textbox oder einer Variable alle paar Millisekunden immer der selbe Wert zugewiesen wird?
    Hast du Angst, dass die Ihre Werte vergessen bis jemand den Schluss Button drückt? ;-)

    Aus diesem Grund gibt es die Events (Nachrichten über ein Ereignis).
    Ein Programm kann einfach solange nichts tun bis ein bestimmtes Ereignis (Event) eingetreten ist.
    Das Programm hat ein Event abonniert.

    Das Click Ereignis von einem Button ist so ein Event!
    Alle Windows Dialoge Arbeiten so, mit OK und Cancel Buttons.
    Das ist die Standard-Vorgehensweise für Formular Dialoge!

    Ablaufplan:
    1. Der User Füllt dein Formular aus. Die Daten stehen nun in den Textfeldern
    3. Der user drückt auf OK oder Schluss
    4. Das Click ereigniss des Buttons überträgt die Daten von den Textboxen in dein $SetADUser Objekt

    Mach das:

    1. Entferne die Do Schleife.
    2. Füge ein Button in deine Form mit der Beschriftung "Schluss" oder so (was sinnvolles!)
    3. Fülle das Button_Click Ereignis mit dem Code der das ausführt was dann passieren soll!
    Hier werden dann alle Daten aus deinem Formular ausgelesen und in deine $SetADUser übertragen.
    Eventuell wird dann hier auch gleich noch der User im AD Angelegt.




    Nur so wird ein Schuh draus...


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!

    Dienstag, 23. Juli 2013 16:13
  • Hi Peter,

    das das was ich gemacht habe BÖSE ist hatte ich ja auch schon bemerkt :-)

    Wenn ich das richtig verstehe, dann gebe ich die Daten ein, löse ein Event aus und schreibe die Daten in zurück.

    Die Funktion wollte ich eigentlich nur einführen, um zu überprüfen ob und welche Felder geändert wurden. Ich habe aber gestern ein Event Namens add_ModifiedChanged gefunden, mit dem ich abfragen kann ob der Inhalt der TextBox geändert wurde. Dort werde ich mal weiter machen.

    Gruß

    Dirk

    Mittwoch, 24. Juli 2013 08:00
  • PowerShell  wurde NICHT dazu gedacht Grafische Benutzer Oberflächen (GUI) zu Programmieren. (Auch wenn man es machen kann)
    PowerShell wurde konzipiert um Administrative Aufgaben im Hintergrund OHNE Fenster meist remote zu erledigen. Automation eben.
    Deshalb sollte man die GUI Entwicklung  sehr sparsam einsetzen und nur einfache Oberflächen Programmieren.
    Bei der GUI Programmierung muss man sich mit den Events beschäftigen die in der PowerShell fast keine Rolle spielen.
    Wenn die PowerShell eine längerdauernde Aufgabe erledigt wie z.B. das durchsuchen der Festplatte, kann der User während dessen keine eingaben mehr in der PowerShell GUI tätigen. Die GUI ist aus Sicht des Benutzers „eingefroren“. PowerShell kann in einem Prozess immer nur eine Sache gleichzeitig erledigt (Single Thread) und hat dann keine "Zeit" die Eingaben des Benutzers zu verarbeiten.
    Deshalb kommt schnell das Thema Multithreading auf den Tisch. Multithreading ist das „gleichzeitige“ abarbeiten von mehreren Aufgaben in einem einzigen (PowerShell) Prozess.
    Stabile Programme mit Multithreading zu entwickeln ist selbst für erfahrenen Programmierer keine leichte Aufgabe.
    GUI Programmierung erfordert also grundlegenden Kenntnisse in der.NET Programmierung UND PowerShell Kenntnisse.
    Aus diesem Grund gibt es wenige PowerShell Nutzer die  GUI Programmierung beherrschen (wollen oder müssen).
    Bei der GUI Programmierung muss man natürlich immer bei den C# .NET Entwicklern nachschauen da dies kein Gebiet der PowerShell ist!
    Man sollte auch bei der Internet Recherche mit dem Suchwort C# arbeiten, anstatt mit dem Suchwort PowerShell.
    Siehe hier:
    http://openbook.galileocomputing.de/visual_csharp/visual_csharp_13_001.htm
    http://openbook.galileocomputing.de/visual_csharp/visual_csharp_14_001.htm

    Wenn man in einem Windows Forms Formular, die Eingaben eines GUI Benutzers auf Richtigkeit überprüfen (validieren) will, kann man dies Einzeln in den Events von jedem einzelnen Windows Forms Control machen (Textbox, ListView, Checkbox usw..). Viel Controls bieten dazu das Validation Event an!
    Sieh hier abschnitt 14.1.10 Steuerelemente fokussieren -> Validierung von Benutzereingaben
    http://openbook.galileocomputing.de/visual_csharp/visual_csharp_14_001.htm#mjbac36e44e5fc14dfac57cf3a2a293dd8
    Und hier:
    http://msdn.microsoft.com/de-de/library/vstudio/ms229603.aspx#
    Viele Programmierer benutzen auch das KeyPress  oder keyUp Ereignis einer Textbox um die Eingabe bei jedem Buchstaben zu überprüfen.
    Siehe hier; Events der Textbox:
    http://msdn.microsoft.com/de-de/library/system.windows.forms.textbox_events%28v=vs.80%29.aspx

    Dies hat den Vorteil dass der User sofort bei der Eingabe Feedback bekommt. Dies ist aber sehr aufwändig, man hat viele Events (pro Control  mindestens eins) zu Programmieren und zu pflegen.

    Leichter / Besser ist es, einen OK Button anzulegen und beim drücken dieses Buttons werden die Eingaben in allen Controls überprüft und die Falschen eingaben werden angezeigt (zb. Textbox Schriftfarbe = Rot oder Messagebox mit erklärenden Text).
    Der OK Button lässt den User erst weitermachen, wenn alle eingaben OK sind! (Deshalb heißt er Ok Button ;-)  )  Dann werden alle eingaben in Variablen übertragen oder abgespeichert und umgesetzt. Die geshieht alle in dem einen Click Ereigniss des OK Buttons an einem Platz im Code !

    Wen der User keinen bock hat die verlangten Eingaben ordentlich zu machen, kann er auf einen Cancel  Button drücken oder das Dialog-Fenster Schließen, dabei gehen alle Eingaben verloren.


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!



    Mittwoch, 24. Juli 2013 09:21