.net 尝试连接到networkshare时句柄无效
我有一个程序需要把数据放到网络共享上。在某些情况下,用户无法通过其帐户访问,需要提供登录凭据 我的想法是让程序弹出windows凭据屏幕,以便用户可以登录(就像用户通过windows资源管理器打开共享时一样) 我找到了.net 尝试连接到networkshare时句柄无效,.net,vb.net,winapi,.net,Vb.net,Winapi,我有一个程序需要把数据放到网络共享上。在某些情况下,用户无法通过其帐户访问,需要提供登录凭据 我的想法是让程序弹出windows凭据屏幕,以便用户可以登录(就像用户通过windows资源管理器打开共享时一样) 我找到了WNetUseConnectionAPI,该API允许登录到共享,而无需对其进行映射,并且它具有提供提示的选项 这是我正在使用的代码: Public Class frmMain Private Const CONNECT_INTRERACTIVE = &H8
WNetUseConnection
API,该API允许登录到共享,而无需对其进行映射,并且它具有提供提示的选项
这是我正在使用的代码:
Public Class frmMain
Private Const CONNECT_INTRERACTIVE = &H8
Private Const CONNECT_PROMPT = &H10
Private Const RESOURCETYPE_DISK = &H1
Private Structure NETRESOURCE
Public dwScope As Long
Public dwType As Long
Public dwDisplayType As Long
Public dwUsage As Long
Public lpLocalName As String
Public lpRemoteName As String
Public lpComment As String
Public lpProvider As String
End Structure
Private Declare Function WNetUseConnection Lib "mpr.dll" _
Alias "WNetUseConnectionA" ( _
ByVal hwndOwner As Long, _
ByRef lpNetResource As NETRESOURCE, _
ByVal lpUsername As String, _
ByVal lpPassword As String, _
ByVal dwFlags As Long, _
ByVal lpAccessName As String, _
ByRef lpBufferSize As Long, _
ByRef lpResult As Long) _
As Long
Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim resource As New NETRESOURCE
Dim success As Long
Dim ErrInfo As Long
With resource
.dwType = RESOURCETYPE_DISK
.lpLocalName = vbNullString
.lpRemoteName = "\\server\folder\"
.lpProvider = vbNullString
End With
ErrInfo = WNetUseConnection(Me.Handle, resource, "", "", CONNECT_INTRERACTIVE Or CONNECT_PROMPT, vbNull, vbNull, success)
Console.WriteLine(ErrInfo)
Dim errorMessage As String
errorMessage = New Win32Exception().Message
Console.WriteLine(errorMessage)
End Sub
我得到的错误是:
句柄无效(代码2091649073639)
有什么方法可以让它工作吗?您发布的代码似乎有几个问题:
->HWND
IntPtr
->LPDWORD
IntPtr
->DWORD
(我还看到使用了UInt32
)Integer
IntPtr
允许运行时根据机器体系结构使用32位或64位指针DWORD
s始终为32位,即使在64位计算机上也是如此。另见:.lpRemoteName=“\\server\folder\”
应该是
.lpRemoteName=“\\server\folder”
buffer
参数以使代码正常工作。如果没有它,WNetUseConnection
函数总是返回ERROR\u MORE\u DATA
,这意味着缓冲区太小谢谢你的回答。明天我会试试你的建议,如果行得通,我会告诉你的。
Imports System.ComponentModel
Imports System.Text
Public Class frmMain
Private Const CONNECT_INTRERACTIVE = &H8
Private Const CONNECT_PROMPT = &H10
Private Const RESOURCETYPE_DISK = &H1
Private Structure NETRESOURCE
Public dwScope As UInt32
Public dwType As UInt32
Public dwDisplayType As UInt32
Public dwUsage As UInt32
Public lpLocalName As String
Public lpRemoteName As String
Public lpComment As String
Public lpProvider As String
End Structure
Private Declare Function WNetUseConnection Lib "mpr.dll" _
Alias "WNetUseConnectionA" ( _
ByVal hwndOwner As IntPtr, _
ByRef lpNetResource As NETRESOURCE, _
ByVal lpPassword As String, _
ByVal lpUsername As String, _
ByVal dwFlags As UInt32, _
ByVal lpAccessName As StringBuilder, _
ByRef lpBufferSize As IntPtr, _
ByRef lpResult As IntPtr) _
As UInt32
Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim resource As New NETRESOURCE
Dim success As Long
Dim ErrInfo As Long
Const BUFFERSIZE As Integer = 1024
Dim buffer As New StringBuilder(BUFFERSIZE)
With resource
.dwType = RESOURCETYPE_DISK
.lpLocalName = vbNullString
.lpRemoteName = "\\server\folder"
.lpProvider = vbNullString
End With
ErrInfo = WNetUseConnection(Me.Handle, resource, "", "", CONNECT_INTRERACTIVE Or CONNECT_PROMPT, buffer, BUFFERSIZE, success)
If ErrInfo > 0 Then
Dim winExcept As New Win32Exception()
LogMsg(winExcept.Message)
Else
LogMsg("all good")
End If
End Sub
Private Sub LogMsg(ByVal msg As String)
System.Diagnostics.Debug.WriteLine(msg)
MsgBox(msg)
End Sub
End Class