Zugriff auf Networkshare von VB.NET

11/04/2008 - 13:59 von Bruno Polder | Report spam
Hallo,

ich möchte aus meiner Applikation auf ein Networkshare zugreifen und
eine Datei ablegen (ohne Mapping eines Laufwerks). Nach einigem suchen
im Web habe ich die API Funktion LogonUser gefunden um mich mit einem
Domainuser am Server anzumelden. Leider kann ich aber nicht auf das
Share schreiben (im Explorer klappts), ich bekomme immer eine
UnauthorizedAccessException. Hier die relevanten Code Teile:


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

Private Declare Auto Function DuplicateToken Lib "advapi32.dll"
(ByVal token As IntPtr, ByVal impersonationLevel As Int16, _
ByRef hNewToken As IntPtr) As Boolean

Const LOGON32_LOGON_INTERACTIVE As Long = 2
Const LOGON32_LOGON_NETWORK As Long = 3
Const LOGON32_PROVIDER_DEFAULT As Long = 0
Const LOGON32_PROVIDER_WINNT50 As Long = 3
Const LOGON32_PROVIDER_WINNT40 As Long = 2
Const LOGON32_PROVIDER_WINNT35 As Long = 1




If Not LogonUser(sapuser, sapServer, sappass,
LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, token) Then
Dim ret As Integer = Marshal.GetLastWin32Error()
Dim errmsg As String = GetErrorMessage(ret)
MsgBox("Fehler beim Verbinden zum Server! " & vbCrLf &
errmsg, MsgBoxStyle.Critical)
Return -1
End If


Dim wi As WindowsIdentity
Dim newToken As New IntPtr
If Not DuplicateToken(token, 2, newToken) Then
MsgBox("Fehler beim Verarbeiten der Login Daten
(DuplicateToken)!", MsgBoxStyle.Critical)
Return -1

End If
wi = New WindowsIdentity(newToken)
Dim wic As WindowsImpersonationContext = wi.Impersonate()

If wic Is Nothing Then
MsgBox("Fehler beim Verarbeiten der Login Daten!",
MsgBoxStyle.Critical)
Return -1

End If
If Not System.IntPtr.op_Equality(token, IntPtr.Zero) Then
CloseHandle(token)
End If
If Not System.IntPtr.op_Equality(newToken, IntPtr.Zero) Then
CloseHandle(newToken)
End If

Using (wic)
PathFileName = sapuncpath & "\" & FileName
Try
MkDir(sapuncpath & "\xxx")
Dim fOut As New FileStream(PathFileName,
FileMode.OpenOrCreate, FileAccess.Write)
Dim out As New StreamWriter(fOut)
out.Write(Text)
out.Flush()
out.Close()
Catch ex As Exception
MsgBox("Fehler beim Schreiben der SAP Datei." &
vbCrLf & ex.Message, MsgBoxStyle.Critical)
End Try
End using

Wenn ich mich mit LOGON32_LOGON_INTERACTIVE verbinde, kann ich mich gar
nicht anmelden (falscher Benutzername oder Kennwort).

Könnt ihr mir da weiter helfen?

Danke schonmal
Bruno
 

Lesen sie die antworten

#1 Armin Zingler
11/04/2008 - 14:27 | Warnen spam
"Bruno Polder" schrieb
Private Declare Auto Function DuplicateToken Lib "advapi32.dll"
(ByVal token As IntPtr, ByVal impersonationLevel As Int16, _
ByRef hNewToken As IntPtr) As Boolean



Kenne mich im Detail nicht mit dem Thema aus, aber muss das statt Int16
nicht Integer (Int32) sein? Weil SECURITY_IMPERSONATION_LEVEL ist ein
enum, und enum ist lt Doku "same as int", wobei int = 4 Bytes.

Das hier http://pinvoke.net/default.aspx/adv...icateToken scheint
nicht zu stimmen; wenn ich nicht irre.


Armin

Ähnliche fragen