Zugriff auf lesegeschützte Ordner

Jan_VBnet

Grünschnabel
Hi Zusammen,

bin neue hier und hätte eine Frage bezüglich Ordnerberechtigungen und Zugriff auf lesegeschütze Windowsordner:

Ich habe auf einem Windows Fileserver einen Ordner, der nur für bestimmte Usergruppen Leserechte besitzt. Ist es möglich, über VB.Net o.ä. ein kleines Frontend zu programmieren, das mir im "Hintergrund" den Ordner mit einer anderen Userkennung ausließt so dass User, die eigentlich den besagten Ordner nicht lesen können, das über mein GUI können?

Das Frontend ist für mich natürlich kein Problem (Erfahrung in .net hab ich da genug) :suspekt:

Vielen Dank schon mal für Eure Hilfe

Grüße

Jan
 
Hi und willkommen

Abgesehen davon, dass du damit die Security umgehst und den Users, die dein Programm nutzen auch gleich Leserechte geben kannst und du dir damit den Aufwand sparen könntest. Probier doch einfach mal, das Programm unter einem anderen User zu starten (Stichwort Runas)
 
Hi Nico,

Danke für die Info, wahrscheinlich ist es wirklich einfacher, so wie du gesagt hast einer bestimmten Usergruppe Leserechte auf den Ordner zu geben. Ist hier in einem so großen Netzwerk nicht immer ganz so einfach dann da auch mal einen neuen User in so eine Gruppe hinzuzufügen (Darf nur zentral über einen Workflow erfolgen :suspekt:)
Aber ich werde dann wahrscheinlich doch diesen Weg gehen.

Danke für den Tip mit dem Runas. Für alle die es interessiert, hier die Anleitung:
http://www.vbarchiv.net/forum/id14_i2160t2158.html

Viele Grüße
Jan
 
Hi Zusammen,
für alle die Interesse daran haben: Ich habe jetzt in unserem Netzwerk einen "technischen User" angelegt, der auf einen speziellen Daten-Ordner im Netzwerk Zugriff hat und über den ich das Schreiben und Lesen von Ateien ohne Windows Userverwaltung regeln kann.

Hier der Code um im Hintergrund auf einen anderen Domainuser zu wechseln:
Code:
Imports System
Imports System.Runtime.InteropServices
Imports System.Security.Principal
Imports System.Security.Permissions
Imports Microsoft.VisualBasic
<Assembly: SecurityPermissionAttribute(SecurityAction.RequestMinimum, UnmanagedCode:=True), _
 Assembly: PermissionSetAttribute(SecurityAction.RequestMinimum, Name:="FullTrust")> 


Module Imperson

    Public Class Impersonation

        Private Declare Auto 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

        <DllImport("kernel32.dll")> _
        Public Shared Function FormatMessage(ByVal dwFlags As Integer, ByRef lpSource As IntPtr, _
            ByVal dwMessageId As Integer, ByVal dwLanguageId As Integer, ByRef lpBuffer As [String], _
            ByVal nSize As Integer, ByRef Arguments As IntPtr) As Integer

        End Function

        Public Declare Auto Function CloseHandle Lib "kernel32.dll" (ByVal handle As IntPtr) As Boolean


        Public Declare Auto Function DuplicateToken Lib "advapi32.dll" (ByVal ExistingTokenHandle As IntPtr, _
                ByVal SECURITY_IMPERSONATION_LEVEL As Integer, _
                ByRef DuplicateTokenHandle As IntPtr) As Boolean

        ' Test harness.
        ' If you incorporate this code into a DLL, be sure to demand FullTrust.
        <PermissionSetAttribute(SecurityAction.Demand, Name:="FullTrust")> _
        Public Overloads Shared Sub Main() 'ByVal args() As String

            Dim tokenHandle As New IntPtr(0)
            Dim dupeTokenHandle As New IntPtr(0)

            Try

                Dim userName, domainName, pasword As String

                ' Get the user token for the specified user, domain, and password using the 
                ' unmanaged LogonUser method.  
                ' The local machine name can be used for the domain name to impersonate a user on this machine.
                domainName = Main_GUI.txt_domain.Text
                userName = Main_GUI.txt_user.Text
                pasword = Main_GUI.txt_pasword.Text

                Const LOGON32_PROVIDER_DEFAULT As Integer = 0
                'This parameter causes LogonUser to create a primary token.
                Const LOGON32_LOGON_INTERACTIVE As Integer = 2

                tokenHandle = IntPtr.Zero

                ' Call LogonUser to obtain a handle to an access token.
                Dim returnValue As Boolean = LogonUser(userName, domainName, pasword, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, tokenHandle)

                If False = returnValue Then
                    Dim ret As Integer = Marshal.GetLastWin32Error()
                    MsgBox("LogonUser failed with error code: ", ret)
                    Throw New System.ComponentModel.Win32Exception(ret)

                    Return
                End If

                Dim success As String
                If returnValue Then success = "Yes" Else success = "No"
                Main_GUI.txt_log.Text = "LogonUser succeeded? " & success & vbCrLf
                Main_GUI.txt_log.Text = Main_GUI.txt_log.Text & vbCrLf & "Value of Windows NT token: " & tokenHandle.ToString()

                ' Check the identity.
                Main_GUI.txt_log.Text = Main_GUI.txt_log.Text & vbCrLf & "Before impersonation: " & WindowsIdentity.GetCurrent().Name

                ' Use the token handle returned by LogonUser.
                Dim newId As New WindowsIdentity(tokenHandle)
                Dim impersonatedUser As WindowsImpersonationContext = newId.Impersonate()

                ' Check the identity.
                Main_GUI.txt_log.Text = Main_GUI.txt_log.Text & vbCrLf & "After impersonation: " & WindowsIdentity.GetCurrent().Name


                '
                '!! Hier ist der Benutzer gewechselt worden (bis zum Undo)!
                '
                Dim pfad As String = "\\serverxxx\ccc\simresults\b1015\text.txt"
                read_file(pfad, nothing)

                ' Hier wird wieder auf den ursprünglichen User zurückgewechselt
                impersonatedUser.Undo()

                ' Check the identity.
                Main_GUI.txt_log.Text = Main_GUI.txt_log.Text & vbCrLf & "After Undo: " + WindowsIdentity.GetCurrent().Name

                ' Free the tokens.
                If Not System.IntPtr.op_Equality(tokenHandle, IntPtr.Zero) Then
                    CloseHandle(tokenHandle)
                End If

            Catch ex As Exception
                Main_GUI.txt_log.Text = Main_GUI.txt_log.Text & vbCrLf & "Exception occurred. " & ex.Message
            End Try
        End Sub 'Main

    End Class 'Class1

End Module

Viele Grüße und Danke für den Tip

Jan
 
Zurück