Hallo
Seit einigen Tagen sitze ich an einem Problem, wo mir scheinbar nur noch eine Kleinigkeit fehlt :
Mein Wunsch ist es, mein Programm mit einem normalen Benutzer (Benutzer A) ohne Administratorrechte zu starten. Im späteren Verlauf soll eine PDF-Datei in den PDF-Viewer eingebunden werden. Den Windows-Pfad habe ich jedoch nur für einen speziellen Benutzer (Benutzer Z) freigegeben. Der Sinn dahinter ist, dass somit der Benutzer (A) nicht über den Windows-Explorer in diesen Ordner navigieren kann und keine Dateien daraus öffnen, bearbeiten, [...] kann, sondern lediglich auf die Verwaltung der Anwendung angewiesen ist, welche mit den Rechten des extra angelegten Benutzers (Z) auf die Dateien zugreifen kann. Ein "runas" - Skript oder das allgemeine "Ausführen als..." würde mir Probleme machen, da ich die Anwendung bereits über das Kontextmenü ansprechen kann, wodurch Parameter übergeben werden, welche dann verloren gehen würden.
Bislang habe ich verschiedene Methoden der "Impersonation" versucht, jedoch ohne großen Erfolg. Das Problem ist, dass der Anwendung unter der Benutzung von Benutzer (A) weiterhin der Zugriff verweigert wird.
Ich lasse mir an verschiedenen Stellen (vor, während und nach) der Impersonation den "aktuellen" Benutzer des Programms ausgeben, welches mir auch bestätigt, dass der Benutzerwechsel normalerweise funktionieren sollte.
Gibt es da irgendwelche Grenzen bei einer Impersonation oder woran könnte es noch liegen?
Meine "Impersonation" Class sieht wiefolgt aus:
Welche ich über ein simples "Using" anspreche.
Ich bedanke mich bereits im Voraus für jegliche weitere Anregung und Hilfe
Seit einigen Tagen sitze ich an einem Problem, wo mir scheinbar nur noch eine Kleinigkeit fehlt :
Mein Wunsch ist es, mein Programm mit einem normalen Benutzer (Benutzer A) ohne Administratorrechte zu starten. Im späteren Verlauf soll eine PDF-Datei in den PDF-Viewer eingebunden werden. Den Windows-Pfad habe ich jedoch nur für einen speziellen Benutzer (Benutzer Z) freigegeben. Der Sinn dahinter ist, dass somit der Benutzer (A) nicht über den Windows-Explorer in diesen Ordner navigieren kann und keine Dateien daraus öffnen, bearbeiten, [...] kann, sondern lediglich auf die Verwaltung der Anwendung angewiesen ist, welche mit den Rechten des extra angelegten Benutzers (Z) auf die Dateien zugreifen kann. Ein "runas" - Skript oder das allgemeine "Ausführen als..." würde mir Probleme machen, da ich die Anwendung bereits über das Kontextmenü ansprechen kann, wodurch Parameter übergeben werden, welche dann verloren gehen würden.
Bislang habe ich verschiedene Methoden der "Impersonation" versucht, jedoch ohne großen Erfolg. Das Problem ist, dass der Anwendung unter der Benutzung von Benutzer (A) weiterhin der Zugriff verweigert wird.
Ich lasse mir an verschiedenen Stellen (vor, während und nach) der Impersonation den "aktuellen" Benutzer des Programms ausgeben, welches mir auch bestätigt, dass der Benutzerwechsel normalerweise funktionieren sollte.
Gibt es da irgendwelche Grenzen bei einer Impersonation oder woran könnte es noch liegen?
Meine "Impersonation" Class sieht wiefolgt aus:
VB.NET-Quellcode
- Public Class Impersonation
- Implements IDisposable
- Public Sub New(userName As String, domainName As String, password As String)
- 'ImpersonateValidUser(domainName, userName, password)
- ImpersonateValidUser(userName, domainName, password)
- End Sub
- Public Sub Dispose() Implements IDisposable.Dispose
- UndoImpersonation()
- End Sub
- <DllImport("advapi32.dll", SetLastError:=True)> _
- Private Shared Function LogonUser(lpszUserName As String, lpszDomain As String, lpszPassword As String, dwLogonType As Integer, dwLogonProvider As Integer, ByRef phToken As IntPtr) As Integer
- End Function
- <DllImport("advapi32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _
- Private Shared Function DuplicateToken(hToken As IntPtr, impersonationLevel As Integer, ByRef hNewToken As IntPtr) As Integer
- End Function
- <DllImport("advapi32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _
- Private Shared Function RevertToSelf() As Boolean
- End Function
- <DllImport("kernel32.dll", CharSet:=CharSet.Auto)> _
- Private Shared Function CloseHandle(handle As IntPtr) As Boolean
- End Function
- Private Const LOGON32_LOGON_INTERACTIVE As Integer = 2 'LOGON32_LOGON_INTERACTIVE
- Private Const LOGON32_PROVIDER_DEFAULT As Integer = 0
- Private Sub ImpersonateValidUser(userName As String, domain As String, password As String)
- Dim tempWindowsIdentity As WindowsIdentity = Nothing
- Dim token As IntPtr = IntPtr.Zero
- Dim tokenDuplicate As IntPtr = IntPtr.Zero
- Try
- If RevertToSelf() Then
- If LogonUser(userName, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, token) <> 0 Then
- If DuplicateToken(token, 2, tokenDuplicate) <> 0 Then
- tempWindowsIdentity = New WindowsIdentity(tokenDuplicate)
- impersonationContext = tempWindowsIdentity.Impersonate()
- Else
- Throw New Win32Exception(Marshal.GetLastWin32Error())
- End If
- Else
- Throw New Win32Exception(Marshal.GetLastWin32Error())
- End If
- Else
- Throw New Win32Exception(Marshal.GetLastWin32Error())
- End If
- Finally
- If token <> IntPtr.Zero Then
- CloseHandle(token)
- End If
- If tokenDuplicate <> IntPtr.Zero Then
- CloseHandle(tokenDuplicate)
- End If
- End Try
- End Sub
- Private Sub UndoImpersonation()
- If impersonationContext IsNot Nothing Then
- impersonationContext.Undo()
- End If
- End Sub
- Private impersonationContext As WindowsImpersonationContext = Nothing
- End Class
Welche ich über ein simples "Using" anspreche.
Ich bedanke mich bereits im Voraus für jegliche weitere Anregung und Hilfe