Windows-Benutzer als Login im eigenen Programm verwenden und Rechte aus Domäne laden

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Krumnix.

    Windows-Benutzer als Login im eigenen Programm verwenden und Rechte aus Domäne laden

    Hallo.

    Ich habe aufgelegt bekommen, das Login in unserem Firmenprogramm umzugestalten. Damit sich nicht alle Mitarbeiter immer wieder mehrere Passwort und Benutzernamen merken müssen und diese
    von den Admins verwaltet werden (Anruf:"Kannste mein PW wieder zurücksetzen, habs vergessen"-.-), soll nun der Benutzer über das Windows-Login seine Berechtigungen um Programm erhalten und
    seine Einstellungen im Programm sollen auch an den Windows-Benutzer gekoppelt werden.

    Meine Frage ist nun, ob mir jemand Tipps, ein Tut, oder Codeschnipsel zur Verfügung stellen kann, damit ich da einen Einstand erhalten kann.

    Es soll also ein "unsichtbares" Login in dem Programm geben, das über die Windows-Benutzerebene ausgeführt werden soll. Der Benutzer muss in einer bestimmten Domäne angemeldet sein.
    Ist die Domäne nicht vorhanden, so soll ein Login-Fenster aufpoppen und der Benutzer muss sich als Gast anmelden (dadurch hat er auch nur Gastzugang).
    Über die Domäne ist definiert, welche Rechte der Nutzer hat. Also in welchen Gruppen er drin ist. Diese Gruppen sollen dazu dienen, bestimmte Bereiche im Programm zu aktivieren und zu deaktivieren.

    Kann mir da jemand helfen?

    Danke!
    Schau dir mal WindowsPrincipal an, dort gibt es ein Ding Namens "Impersonate", bezieht sich dann auf den Original Caller, also den Anmeldenden.
    Dort bekommste auch den Benutzer-Namen, aus welchem du dir die Domain filtern kannst.
    Danke. Das ist schonmal was.
    Jetzt habe ich Benutzername und die Domäne auslesen können.
    Irgendwie hänge ich aber jetzt, wie ich herausfinden kann, welche Rechte der Benutzer in der Domäne hat, bzw. in welchen Gruppen er vertreten ist.
    Jemand einen Tipp?

    VB.NET-Quellcode

    1. Dim locGroups As List(Of String) = GetUserGroupMembership(Environment.UserName)
    2. ''' <summary>
    3. ''' Fragt die Benutzergruppe eines Anwenders ab
    4. ''' </summary>
    5. ''' <param name="locUsername">Benutzername der Windowsanmeldung</param>
    6. ''' <returns>Gibt eine Liste aller Gruppen aus, in denen der entsprechende Anwender ist</returns>
    7. ''' <remarks></remarks>
    8. Friend Function GetUserGroupMembership(ByVal locUsername As String) As List(Of String)
    9. Dim locResult As New List(Of String)
    10. Try
    11. Dim locDirectoryEntry As New DirectoryServices.DirectoryEntry("LDAP://DC=eintragenBITTE!!!!!!,DC=local") ' ActiveDirectory-Pfad anpassen
    12. Dim locDirectorySearcher As New DirectoryServices.DirectorySearcher(locDirectoryEntry, "sAMAccountName=" & locUsername)
    13. Dim locSearchResult As DirectoryServices.SearchResult = locDirectorySearcher.FindOne
    14. If locSearchResult IsNot Nothing Then
    15. Dim locUserEntry As New DirectoryServices.DirectoryEntry(locSearchResult.Path)
    16. Dim locGroups As Object = locUserEntry.Invoke("Groups")
    17. For Each locGroupObj As Object In DirectCast(locGroups, IEnumerable)
    18. Dim locGroupEntry As New DirectoryServices.DirectoryEntry(locGroupObj)
    19. locResult.Add(locGroupEntry.Name)
    20. Next
    21. Else
    22. Debug.WriteLine("User nicht gefunden!")
    23. End If
    24. Catch ex As Exception
    25. MessageBox.Show(ex.Message, "GetUserGroupMembership", MessageBoxButtons.OK, MessageBoxIcon.Error)
    26. End Try
    27. Return locResult
    28. End Function
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Es geht Wesentlich kürzer und einfacher ^o^

    VB.NET-Quellcode

    1. Public Function IsAdmin() As Boolean
    2. Using ServiceSecurityContext.Current.WindowsIdentity.Impersonate
    3. Dim id As WindowsIdentity = WindowsIdentity.GetCurrent
    4. Dim p As New WindowsPrincipal(id)
    5. Dim domainSid As SecurityIdentifier = id.User.AccountDomainSid
    6. Dim domainAdminSid As New SecurityIdentifier(
    7. WellKnownSidType.AccountDomainAdminsSid, domainSid)
    8. Return p.IsInRole(domainAdminSid)
    9. End Using
    10. End Function


    Du müsstest es dir anpassen, da ich mit OperationContext.CurrentContext arbeite, aber über den Windows-Principal kommst du genauso an die Windows-Identity.

    Impersonate sagt dabei wie gehabt, dass es sich um den Original Caller handelt.


    In WellKnownSidType.--- findest du eigentlich alle Typen, die du brauchst. Funzt daher auch auf anders-Sprachigen Systemen.

    Da wurde mir geholfen
    Ehm mein Code fragt die Benutzergruppen ab und nicht den Benutzernamen.
    An den kommste mit Environment.UserName dran oO
    Dann hat er halt alle Gruppen zusammen in ner Liste.
    Was da ja als Frage stand. oO Was auch immer er dann damit tut ist ja wurscht ^^
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D

    Krumnix schrieb:

    Irgendwie hänge ich aber jetzt, wie ich herausfinden kann, welche Rechte der Benutzer in der Domäne hat, bzw. in welchen Gruppen er vertreten ist.



    OK, vielleicht eines überlesen... deines Testet nicht auf Rechte, so nebenbei. Und ist auch Kompliziert gestaltet...

    Nja, egal, hier mein weiterer Ansatz:

    VB.NET-Quellcode

    1. For Each grp As IdentityReference In OperationContext.Current.ServiceSecurityContext.WindowsIdentity.Groups
    2. Dim translated As IdentityReference = grp.Translate(GetType(NTAccount))
    3. ''' in translated.Value steht eine Benutzergruppe drin
    4. Next


    Du kannst dir nun alle translated.Value die du bekommst inne Liste stopfen und dann nach Gruppen suchen... welche auch mit der entsprechenden Domain versehen sind übrigens... normale String-Arbeit.

    oder du überprüfst sie direkt in dieser For-Each und handlest es da. :) (Sind übrigens String-Werte, teste es mal indem du unter den Comment im Code schreibst

    VB.NET-Quellcode

    1. MsgBox(translated.Value)


    Edit:

    siehe dieser Thread

    ganz unten steht es...
    Richtig. Ich muss wissen in welcher Gruppe der Angemeldete Benutzer in der Domain ist.
    Ob er auf dem Rechner oder im Netz Admin-Rechte hat oder andere Rechte ist egal.

    Wenn er z.B. in der Gruppe "AlleMitarbeiter" ist, so kann er die Grundfunktionen öffnen.
    Ist er noch in der Gruppe "Geschaeftsfuehrung", so kann er z.B. die Einstellungen ändern, das andere nicht dürfen, etc.

    Ich arbeite mich mal durch die Lösungen. Aber es sieht gut aus, das ich damit weiter komme :)

    Danke.

    PS: Ja, ich wollte die Gruppen wissen, in denen der Benutzer ist. Die Rechte im Allgemeinen sind egal. Syr!

    Kagurame schrieb:

    Dann habe ich deine Antwort vorher falsch aufgefasst ^^

    In meinem Code bekommste nacheinander alle Gruppen, da kannste einfach vergleichen :)


    Kein Problem. Hab aber noch eine Frage. Bei mir wird "OperationContext" als nicht deklariert angegeben.
    Hab Imports System.Security.Principal verwendet, aber brachte nix.

    Wo steht die drin?
    OperationContract steht in System.ServiceModel drin, bei dir der falsche Ansatz. Aber über die Pricipal, die du ja hast, kommst du auch an die WindowsIdentity dran ;)

    Wie ich glaube ich erwähnt habe, stammt der Code von einer WCF-Anwendung und wird dir nicht weiterhelfen so wie er da steht, er muss angepasst werden.