WPF Programm mit anderer Berechtigung ausführen.

  • WPF

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Nofear23m.

    WPF Programm mit anderer Berechtigung ausführen.

    Hallo zusammen,

    ich habe ein kleines Tool geschrieben, wo man Dateien auf dem Server durch eingabe des Dateinamen öffnen kann.
    Die Datei wird in einem Ordner und den Unterordnern gesucht und dann mit einem oder mehreren Programmen geöffnet.

    Das Programm soll später auf einem Rechner laufen der keine Berechtigung auf dem Serverordner hat, kann
    ich die Software mit anderen Benutzeranemldung starten, oder kann ich schon bei der Dateisuche andere Benutzeranmeldung im Quellcode implementieren? ?(

    Ich bin programmieranfänger, wollte ich noch erwähnen. :D

    Gruß und vielen dank für eure Hilfe.

    Martin
    Hallo Martin

    Folgende Klasse hätte ich für dich parat:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Imports System.Security.Principal
    3. Public Class UserImpersonation
    4. Implements IDisposable
    5. Public Declare Function LogonUser Lib "advapi32.dll" (ByVal lpszUserName As String, ByVal lpszDomain As String, ByVal lpszPassword As String, ByVal dwLogonType As Integer, ByVal dwLogonProvider As Integer, ByRef phToken As IntPtr) As Boolean
    6. Public Declare Function CloseHandle Lib "kernel32.dll" (ByVal handle As IntPtr) As Boolean
    7. Private wic As WindowsImpersonationContext
    8. Private tokenHandle As IntPtr
    9. Private _userName As String
    10. Private _domain As String
    11. Private _passWord As String
    12. Public Sub New(ByVal userName As String, ByVal domain As String, ByVal passWord As String)
    13. MyBase.New
    14. Me._userName = userName
    15. Me._domain = domain
    16. Me._passWord = passWord
    17. End Sub
    18. Private Const LOGON32_PROVIDER_DEFAULT As Integer = 0
    19. Private Const LOGON32_LOGON_INTERACTIVE As Integer = 2
    20. Public Function ImpersonateValidUser() As Boolean
    21. Dim returnValue As Boolean = LogonUser(Me._userName, Me._domain, Me._passWord, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, Me.tokenHandle)
    22. Console.WriteLine("LogonUser called.")
    23. If (False = returnValue) Then
    24. Dim ret As Integer = Marshal.GetLastWin32Error
    25. Console.WriteLine("LogonUser failed with error code : {0}", ret)
    26. Return False
    27. End If
    28. Console.WriteLine($"Did LogonUser Succeed? {If(returnValue, "Yes", "No")}")
    29. Console.WriteLine(("Value of Windows NT token: " + Me.tokenHandle))
    30. ' Check the identity.
    31. Console.WriteLine(("Before impersonation: " + WindowsIdentity.GetCurrent.Name))
    32. ' Use the token handle returned by LogonUser.
    33. Dim newId As WindowsIdentity = New WindowsIdentity(Me.tokenHandle)
    34. Me.wic = newId.Impersonate
    35. ' Check the identity.
    36. Console.WriteLine(("After impersonation: " + WindowsIdentity.GetCurrent.Name))
    37. Return True
    38. End Function
    39. #Region "IDisposable Members"
    40. Public Sub Dispose() Implements IDisposable.Dispose
    41. If (Not (Me.wic) Is Nothing) Then
    42. Me.wic.Undo()
    43. End If
    44. If (Me.tokenHandle <> IntPtr.Zero) Then
    45. CloseHandle(Me.tokenHandle)
    46. End If
    47. End Sub
    48. #End Region
    49. End Class


    Wichtig ist diese Klasse in einem Using-Block zu verwenden:

    VB.NET-Quellcode

    1. Dim file As String = "\\SERVER\Folder\datei.txt"
    2. Using user As UserImpersonation = New UserImpersonation("username", "domain", "password")
    3. Dim reader As New StreamReader(file)
    4. Dim result = reader.ReadToEnd
    5. Console.WriteLine(result)
    6. reader.Close()
    7. End Using


    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Maddin23 schrieb:

    jetzt werde ich mich noch schnell rein lesen was ein Using-Block ist

    Jede Klasse welche IDisposable implementiert kann und sollte in einem Using-Block instanziiert werden.
    Wird dies nicht gemacht muss der Programmierer sicherstellen das er Dispose() aufruft.

    VB.NET-Quellcode

    1. Dim file As String = "\\SERVER\Folder\datei.txt"
    2. Dim user As UserImpersonation = New UserImpersonation("username", "domain", "password")
    3. Dim reader As New StreamReader(file)
    4. Dim result = reader.ReadToEnd
    5. Console.WriteLine(result)
    6. reader.Close()
    7. user.Dispose()


    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##