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!
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!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 1465113858
Url: https://administrator.de/contentid/1465113858
Ausgedruckt am: 23.11.2024 um 15:11 Uhr
5 Kommentare
Neuester Kommentar
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?
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.
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.
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.
Hallo,
ist zwar in VB, sollte sich aber übertragen lassen ;)
Ich hoffe es hilft, bei mir läuft es jedenfalls.
VG
SH
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
VG
SH
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.
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.