Announcement

Collapse
No announcement yet.

Windows Benutzername auslesen?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Windows Benutzername auslesen?

    Hallo!

    Ich bin absoluter Neuling in Sachen C# und .NET muss jedoch seit ersten diesen Monats damit in meiner Praktikantenstelle arbeiten!

    Nun soll ich ein riesiges Programm schreiben und scheine bereits an der ersten Hürde zu scheitern!

    Wie kann man den den Usernamen den man bei der Anmeldung an den Rechner eingibt mit C# auslesen???

    Kann mir jemand weiterhelfen??

    MfG Bav

  • #2
    Hallo,

    da es im .NET gleich drei verschiedene Principal-Klassen gibt, muss vor dem ersten Zugriff erst einmal geklärt werden, welche davon genutzt werden soll. In einer Windows-Anwendung wird dies immer der <b>WindowsPrincipal</b> sein, so dass für die Application Domain dieser Principal über die Methode <b>SetPrincipalPolicy</b> als zuständig erklärt wird. Erst dann das erfolgt ist, liefert <b>System.Threading.Thread.CurrentPrincipal</b> auch wirklich eine Objektinstanz zurück, die ausgewertet werden kann.

    Wenn zum Beispiel ein Windows-Programm die Identity des Benutzers ermitteln möchte, ist der Zugriff auf die Klasse <b>WindowsIdentity</b> die richtige Wahl. Um die aktuelle Benutzer-Identität abfragen zu können, benötigt die Anwendung das Recht SecurityPermissionAttribute.ControlPrincipal, was im Fall einer unter Full Trust laufenden Anwendung immer der Fall ist.

    <pre>
    System.Security.Principal.WindowsIdentity aWI;
    aWI = System.Security.Principal.WindowsIdentity.GetCurre nt();
    this.Text = aWI.Name;
    </pre>

    Das folgende Beispiel prüft über die IPrincipal-Methode <b>IsInRole</b> nach, ob der aktuelle Benutzer zu Administratoren-Gruppe gehört, indem auf den vorgedefinerten Rollenkennzeichner aus WindowsBuiltInRole zurückgegriffen wird:

    <pre>
    using System.Security.Principal;
    ...
    private void Form1_Load(object sender, System.EventArgs e)
    {
    // Schritt 1: Principal-Zuständigkeiten müssen vorher definiert werden
    AppDomain.CurrentDomain.SetPrincipalPolicy(Princip alPolicy.WindowsPrincipal);
    // Schritt 2: Aktuelle WindowsPrincipal-Instanz abrufen und auswerten
    WindowsPrincipal aWP;
    aWP = (WindowsPrincipal) System.Threading.Thread.CurrentPrincipal;
    if (aWP.IsInRole(WindowsBuiltInRole.Administrator))
    this.Text = "Benutzer gehört zur Rolle Administrator";
    else
    this.Text = "Benutzer gehört nicht dazu";
    }
    </pre>

    P.S: An dieser Stelle muss es etwas komplizierter sein als bisher bei Win32, weil das .NET Framework verschiedene Principals unterstützt, damit sich .NET auch auf andere Betriebssysteme portieren lässt

    Comment


    • #3
      Hallo,
      mit der folgenden Klasse solltes Du auch zum Ziel kommen um den User-Name zu ermitteln.<br>
      System.Environment.UserName<br>
      Gruß Börge<br&gt

      Comment


      • #4
        Also Danke für die professionelle Hilfe,

        ich werde beide Varianten testen und dann sehen welche am Besten für mein Programm passt!

        MfG Bav

        Comment


        • #5
          Ich hab da nochmal ne Frage zu dem Benutzernamen!
          Wenn ich die Domäne über <PRE>System.Environment.UserDomainName</PRE>
          tritt eine Exception auf, mit der zweiten Variante ebenso:
          <I>Eine nicht behandelte Ausnahme des Typs 'System.Security.SecurityException' ist in mscorlib.dll aufgetreten.</I>

          Welche Einstellungen muss ich denn vornehmen um
          diese Sicherheitsbestimmungen einzuhalten?

          MfG Ba

          Comment


          • #6
            Hallo,

            von wo aus (lokale Festplatte, UNC-Pfad, Intranet, Internet) wird die Anwendung gestartet? Unter .NET spielt neben den Benutzerrechten des Aufrufers vor allem auch die Herkunft der Assembly bei der Rechtezuweisung eine entscheidende Rolle

            Comment


            • #7
              Hallo!

              Die Anwendung lag auf ner Platte im Netzwerk,
              ich habs nun lokal gespeichert und es funktioniert. Danke!

              Aber gibt es denn keine Möglichkeit um es auch im Netzwerk laufen zu lassen?

              MfG Ba

              Comment


              • #8
                Hallo,

                &gt;Aber gibt es denn keine Möglichkeit um es auch im Netzwerk laufen zu lassen?

                selbstverständlich - nur muss der Administrator des Rechners zuerst selbst Hand anlegen, um die Assembly als "sicher" zu deklarieren. Dazu stehen eine Vielzahl von Wegen zur Verfügung:

                a) Alle Assemblies, die mit dem gleichen Strong Name-Schlüsselpaar signiert wurden, sollen volle Rechte erhalten

                b) Alle Assemblies, die über eine Bestimmte URI aufgerufen werden, sollen volle Rechte erhalten.

                c) Jede Assembly wird separat konfiguriert.

                d) usw (insg. 7 Möglichkeiten)

                Die Rechtevergabe erfolgt entweder visuell über die <b>.NET Framework Configuration</b> oder über das Kommandozeilen-Tool caspol.exe

                Comment


                • #9
                  Danke, jetzt funktionierts auch übers Netz! Habs meinem Admin übergeben!

                  MfG Ba

                  Comment

                  Working...
                  X