greeenn
Goto Top

Domain user in C Sharp Programm einbinden für Berechtigung

Hallo,

ich möchte ein Programm schreiben das jeder AD Benutzer mit Normalen Rechten
ausführen kann.

Das Programm soll dann aber eine Aufgabe erledigen für die es Administrative Rechte braucht.
Meine Idee war im Programm ein AD Benutzer zu hinterlegen der genau die Rechte hat die der "Normale"
ausführende Benutzer nicht hat.

Das ganze soll in C# umgesetzt werden.

-Hat jemand einen Tipp für mich?
-Gibt es irgendwelche Funktionen mit denen man das lösen kann?


Vielen Dank!

Content-ID: 1465113858

Url: https://administrator.de/contentid/1465113858

Ausgedruckt am: 23.11.2024 um 15:11 Uhr

mbehrens
mbehrens 04.11.2021 um 13:03:46 Uhr
Goto Top
Zitat von @GreeeNn:

Das Programm soll dann aber eine Aufgabe erledigen für die es Administrative Rechte braucht.
Meine Idee war im Programm ein AD Benutzer zu hinterlegen der genau die Rechte hat die der "Normale"
ausführende Benutzer nicht hat.

Das ganze soll in C# umgesetzt werden.

-Hat jemand einen Tipp für mich?
-Gibt es irgendwelche Funktionen mit denen man das lösen kann?

Impersonation dürfte der gesuchte Begriff sein.
wiesi200
wiesi200 04.11.2021 um 13:06:45 Uhr
Goto Top
Mann könnte das vermutlich mit ACT machen
https://docs.microsoft.com/de-de/windows/win32/win7appqual/application-c ...

Hier ne Anleitung für eine UPS Software.
https://community.spiceworks.com/how_to/36348-man-ups-allow-users-to-upd ...

Sollte man ummünzen können.
SachsenHessi
SachsenHessi 04.11.2021 um 14:48:47 Uhr
Goto Top
Hallo,

ist zwar in VB, sollte sich aber übertragen lassen ;)
    ''' <summary>  
    ''' Liest die aktuellen User-Daten aus dem AD  
    ''' </summary>  
    ''' <returns></returns>  
    Public Function ActiveUserDatasFromAD() As Dictionary(Of String, String)
        'AD  ---> Der User wird über den aktuell am AD angemeldeten Benutzernamen ermittelt  
        'zuerst den Namen des angemeldeten Nutzers ermitteln  
        Dim _objADUser As New System.Security.Principal.WindowsPrincipal(System.Security.Principal.WindowsIdentity.GetCurrent)
        Dim _strBenutzerName As String = _objADUser.Identity.Name
        Dim _bolAutorisiert As Boolean = _objADUser.Identity.IsAuthenticated
        If Not _bolAutorisiert Then Throw New Exception("Die AD-Autorisierung für %1 konnte nicht bestätigt werden.".Replace("%1", _strBenutzerName.Replace("ASENDIA\", "")))  
        'Nutzerdaten ermitteln  
        Dim _lst As New List(Of String)
        _lst.Add("givenName")  
        _lst.Add("sn")  
        _lst.Add("cn")  
        _lst.Add("telephoneNumber")  
        _lst.Add("department")  
        _lst.Add("physicalDeliveryOfficeName")  
        _lst.Add("mail")  
        _lst.Add("distinguishedName")  
        Dim dt As DataTable = GetLDAPUserAttributs(_strBenutzerName.Replace("ASENDIA\", ""), _lst, True).Copy  
        If dt.Rows.Count <> 1 Then
            Throw New Exception("Es wurden im AD mehrere User für %1 gefunden ? [ActiveUserDatasFromAD] ".Replace("%1", _strBenutzerName.Replace("ASENDIA\", "")))  
        End If
        'in Dictonary schreiben  
        Dim UserDatas As New Dictionary(Of String, String)
        For Each _item As DataColumn In dt.Columns
            UserDatas.Add(_item.ColumnName.ToString, IIf(IsDBNull(dt.Rows(0)(_item.ColumnName)), "", dt.Rows(0)(_item.ColumnName)))  
        Next
        UserDatas.Add("BenutzerName", _strBenutzerName.Replace("ASENDIA\", ""))  
        Return UserDatas
    End Function

    ''' <summary>  
    ''' Return DataTable with LDAP UserAttributs  
    ''' </summary>  
    ''' <param name="SearchPerson">SearchPattern for sn or cn</param>  
    ''' <param name="List<string>">List of Attributs</param>  
    ''' <param name="GlobalCatalog">False for Local Domain, True for Search in GlobalCatalog</param>  
    ''' <returns></returns>  
    ''' <example>  
    '''    in C#:   
    '''    DataTable dt = GetLDAPUserAttributs("Fischer", new List<string>(new string { "givenName", "sn", "cn", "telephoneNumber", "department", "physicalDeliveryOfficeName", "mail", "distinguishedName" }), true);     
    ''' </example>  
    Public Function GetLDAPUserAttributs(ByVal SearchPerson As String, ByVal LDAPProperties As List(Of String), ByVal GlobalCatalog As Boolean) As DataTable
        SearchPerson = SearchPerson '& "*"  
        Dim dt As New DataTable()
        Dim dr As DataRow
        Dim Searcher As New DirectorySearcher()
        Dim SearchResults As SearchResultCollection = Nothing
        Searcher.Filter = "(&(objectClass=user)(|(displayName=" & SearchPerson & ")(cn=" & SearchPerson & ")(sAMAccountName=" & SearchPerson & ")))"  
        Searcher.SearchScope = SearchScope.Subtree
        dt.Columns.Add(New DataColumn("Domain", GetType(String)))  
        For Each Name As String In LDAPProperties
            dt.Columns.Add(New DataColumn(Name, GetType(String)))
            Searcher.PropertiesToLoad.Add(Name)
        Next Name
        If GlobalCatalog Then
            Dim d As Domain = System.DirectoryServices.ActiveDirectory.Domain.GetCurrentDomain()
            Dim gc As GlobalCatalog = d.Forest.FindGlobalCatalog()
            Searcher.SearchRoot = New DirectoryEntry("GC://" & gc.Name)  
        Else
            Dim adsiRoot As New System.DirectoryServices.DirectoryEntry("LDAP://RootDSE")  
            Searcher.SearchRoot = New DirectoryEntry("LDAP://" & adsiRoot.Properties("defaultNamingContext")(0))  
        End If
        SearchResults = Searcher.FindAll()
        For Each Result As SearchResult In SearchResults
            dr = dt.NewRow()
            Dim Domain As String = Result.Path
            Domain = Domain.Substring(Domain.IndexOf("DC="))  
            Domain = Domain.Replace("DC=", "")  
            Domain = Domain.Replace(",", ".")  
            dr("Domain") = Domain  
            For Each Name As String In LDAPProperties
                If Result.Properties(Name).Count >= 1 Then
                    dr(Name) = Result.Properties(Name)(0)
                End If
            Next Name
            dt.Rows.Add(dr)
        Next Result

        'Dim searcher As DirectorySearcher = Nothing  
        Dim lMembers As New List(Of String)()
        'Searcher = New DirectorySearcher(New DirectoryEntry(String.Concat("LDAP://", Domain), USERname, password))  
        Searcher.Filter = String.Concat("(&(objectClass=User) (sAMAccountName=", SearchPerson, "))")  
        Searcher.PropertiesToLoad.Add("MemberOf")  
        Dim result2 As SearchResult = Searcher.FindOne()
        Dim i As Integer = 0
        Do While i < result2.Properties("MemberOf").Count  
            Dim sProp As String = result2.Properties("MemberOf")(i).ToString()  
            lMembers.Add(sProp.Substring(3, sProp.IndexOf(",") - 3))  
            i += 1
        Loop

        dt.Columns.Add("GroupsMemberShip", System.Type.GetType("System.String"))  
        If lMembers.Count > 0 Then
            Dim _groups As String = ""  
            For Each _item As String In lMembers
                _groups += IIf(_groups = "", "", vbCrLf) + _item  
            Next
            dt.Rows(0)("GroupsMemberShip") = _groups  
        End If
        dt.AcceptChanges()
        Return dt
    End Function
Ich hoffe es hilft, bei mir läuft es jedenfalls.
VG
SH
149569
149569 04.11.2021 um 15:49:20 Uhr
Goto Top
143611
Lösung 143611 04.11.2021 um 18:35:07 Uhr
Goto Top
Moin,

wie meine Vor-Poster schon schrieben, kannst Du per "impersonation" bestimmte Code-Teile unter den Credentials eines anderen Benutzers ausführen. Dies lässt sich leider nur per p/invoke erreichen, aber das Netz ist voll von passenden Beispielen. Die Credentials würde ich allerdings nicht in die Anwendung schreiben, sondern mir einen anderen Weg überlegen; die Credentials sind qua IL etwa so gut geschützt wie in einem ZIP-Archiv ohne Passwort - man sieht sie nicht direkt, kommt aber mit zwei Klicks ran - das .NET SDK bringt schon alle Tools mit.