VB.NET通过Win32API完成访问共享文件夹功能
VB.NET通过Win32API完成访问共享文件夹功能
VB.NET实现访问网络共享文件夹,使用 WNetAddConnection2A 和 WNetCancelConnection2A。
Imports System
Public Class clsNetworkConnect
#Region "----- Win32API关联 常量 -----"
'------------------------------------------------
' 访问共享文件夹 常量
'------------------------------------------------
Public Const RESOURCE_CONNECTED = &H1
Public Const RESOURCE_GLOBALNET = &H2
Public Const RESOURCE_REMEMBERED = &H3
Public Const RESOURCE_RECENT = &H4
Public Const RESOURCE_CONTEXT = &H5
Public Const RESOURCETYPE_ANY = &H0
Public Const RESOURCETYPE_DISK = &H1
Public Const RESOURCETYPE_PRINT = &H2
Public Const RESOURCETYPE_RESERVED = &H8
Public Const RESOURCETYPE_UNKNOWN = &HFFFFFFFF
Public Const RESOURCEUSAGE_CONNECTABLE = &H1
Public Const RESOURCEUSAGE_CONTAINER = &H2
Public Const RESOURCEUSAGE_NOLOCALDEVICE = &H4
Public Const RESOURCEUSAGE_SIBLING = &H8
Public Const RESOURCEUSAGE_ATTACHED = &H10
Public Const RESOURCEUSAGE_ALL = RESOURCEUSAGE_CONNECTABLE + RESOURCEUSAGE_CONTAINER + RESOURCEUSAGE_ATTACHED
Public Const RESOURCEUSAGE_RESERVED = &H80000000
Public Const RESOURCEDISPLAYTYPE_GENERIC = &H0
Public Const RESOURCEDISPLAYTYPE_DOMAIN = &H1
Public Const RESOURCEDISPLAYTYPE_SERVER = &H2
Public Const RESOURCEDISPLAYTYPE_SHARE = &H3
Public Const RESOURCEDISPLAYTYPE_FILE = &H4
Public Const RESOURCEDISPLAYTYPE_GROUP = &H5
Public Const RESOURCEDISPLAYTYPE_NETWORK = &H6
Public Const RESOURCEDISPLAYTYPE_ROOT = &H7
Public Const RESOURCEDISPLAYTYPE_SHAREADMIN = &H8
Public Const RESOURCEDISPLAYTYPE_DIRECTORY = &H9
Public Const RESOURCEDISPLAYTYPE_TREE = &HA
Public Const RESOURCEDISPLAYTYPE_NDSCONTAINER = &HB
Public Const CONNECT_UPDATE_PROFILE = &H1
'<ErrCodes Connect/DisConnect>
Public Const ERROR_ACCESS_DENIED As Integer = 5 '访问被拒绝。
Public Const ERROR_BAD_DEV_TYPE As Integer = 66 '网络资源的类型不正确。
Public Const ERROR_BAD_NET_NAME As Integer = 67 '找不到网络名称。
Public Const ERROR_ALREADY_ASSIGNED As Integer = 85 '本地设备已经被使用了。
Public Const ERROR_INVALID_PASSWORD As Integer = 86 'PASSWORD错误。
Public Const ERROR_BUSY As Integer = 170 '请求的资源正在被使用。
Public Const ERROR_BAD_DEVICE As Integer = 1200 '指定的设备名无效。
Public Const ERROR_DEVICE_ALREADY_REMEMBERED As Integer = 1202 '这个本地路径已经被其他的网络链接资源占用。
Public Const ERROR_NO_NET_OR_BAD_PATH As Integer = 1203 '没有连接网络或路径错误。
Public Const ERROR_BAD_PROVIDER As Integer = 1204 '指定的网络名无效。
Public Const ERROR_CANNOT_OPEN_PROFILE As Integer = 1205 '网络连接配置文件无法打开。
Public Const ERROR_BAD_PROFILE As Integer = 1206 '网络连接配置文件有损坏。
Public Const ERROR_EXTENDED_ERROR As Integer = 1208 '发生了扩展错误。
Public Const ERROR_SESSION_CREDENTIAL_CONFLICT As Integer = 1219 '不允许多数用户同时连接服务器的共享文件夹。
Public Const ERROR_NO_NETWORK As Integer = 1222 '没有网络。
Public Const ERROR_CANCELLED As Integer = 1223 '操作被用户取消。
'<ErrCodes DisConnect Only>
Public Const ERROR_DEVICE_IN_USE As Integer = 2404 '这个设备上的活动进程正在使用中,无法切断。
Public Const ERROR_NOT_CONNECTED As Integer = 2250 '这个网络无法连接。
Public Const ERROR_OPEN_FILES As Integer = 2401 '网络连接的文件已经被打开。
Public Structure NETRESOURCE
Public dwScope As Integer
Public dwType As Integer
Public dwDisplayType As Integer
Public dwUsage As Integer
Public lpLocalName As String
Public lpRemoteName As String
Public lpComment As String
Public lpProvider As String
End Structure
'连接网络驱动器
Public Declare Function WNetAddConnection2 Lib "mpr.dll" Alias "WNetAddConnection2A" (ByRef lpNetResource As NETRESOURCE, ByVal lpPassword As String, ByVal lpUserName As String, ByVal dwFlags As Integer) As Integer
'切断网络驱动器
Public Declare Function WNetCancelConnection2 Lib "mpr.dll" Alias "WNetCancelConnection2A" (ByVal lpName As String, ByVal dwFlags As Integer, Optional ByVal fForce As Boolean = False) As Boolean
#End Region
#Region "----- メソッド -----"
'<错误消息>
Private m_strErrMsg As String
Public Function Connect(ByVal strServer As String, _
ByVal strUser As String, _
ByVal strPassword As String) As Boolean
Dim dwRet As Integer
Dim objResource As NETRESOURCE
'********************************
'* 设定网络资源
'********************************
objResource.dwScope = RESOURCE_CONNECTED
objResource.dwType = RESOURCETYPE_ANY
objResource.dwDisplayType = RESOURCEDISPLAYTYPE_GENERIC
objResource.dwUsage = RESOURCEUSAGE_CONNECTABLE
objResource.lpComment = Nothing
objResource.lpLocalName = Nothing
objResource.lpProvider = Nothing
objResource.lpRemoteName = strServer
'*******************
'* 通过API连接
'*******************
dwRet = WNetAddConnection2(objResource, strPassword, strUser, 0)
'*******************
'* 确认连接错误
'*******************
If dwRet <> 0 Then
Select Case dwRet
Case ERROR_ACCESS_DENIED
m_strErrMsg = "访问被拒绝。"
Case ERROR_BAD_DEV_TYPE
m_strErrMsg = "网络资源的类型不正确。
Case ERROR_BAD_NET_NAME
m_strErrMsg = "找不到网络名称。"
Case ERROR_ALREADY_ASSIGNED
m_strErrMsg = "本地设备已经被使用了。"
Case ERROR_INVALID_PASSWORD
m_strErrMsg = "PASSWORD错误。"
Case ERROR_BUSY
m_strErrMsg = "请求的资源正在被使用。"
Case ERROR_BAD_DEVICE
m_strErrMsg = "指定的设备名无效。"
Case ERROR_DEVICE_ALREADY_REMEMBERED
m_strErrMsg = "这个本地路径已经被其他的网络链接资源占用。"
Case ERROR_NO_NET_OR_BAD_PATH
m_strErrMsg = "没有连接网络或路径错误。"
Case ERROR_BAD_PROVIDER
m_strErrMsg = "指定的网络名无效。"
Case ERROR_CANNOT_OPEN_PROFILE
m_strErrMsg = "网络连接配置文件无法打开。"
Case ERROR_BAD_PROFILE
m_strErrMsg = "网络连接配置文件有损坏。"
Case ERROR_EXTENDED_ERROR
m_strErrMsg = "发生了扩展错误。"
Case ERROR_SESSION_CREDENTIAL_CONFLICT
m_strErrMsg = "不允许多数用户同时连接服务器的共享文件夹。"
Case ERROR_NO_NETWORK
m_strErrMsg = "没有网络。"
Case ERROR_CANCELLED
m_strErrMsg = "操作被用户取消。"
Case Else
m_strErrMsg = "发生了不明错误。"
End Select
ErrorInfo = m_strErrMsg
Return False
End If
Return True
End Function
Public Function Disconnect(ByVal strServer As String) As Boolean
Dim dwRet As Integer
'*******************
'* 通过API切断
'*******************
dwRet = WNetCancelConnection2(strServer, 0, False)
'*******************
'* 确认切断错误
'*******************
If dwRet <> 0 Then
Select Case dwRet
Case ERROR_DEVICE_IN_USE
m_strErrMsg = "这个设备上的活动进程正在使用中,无法切断。"
Case ERROR_NOT_CONNECTED
m_strErrMsg = "这个网络无法连接。"
Case ERROR_OPEN_FILES
m_strErrMsg = "网络连接的文件已经被打开。"
Case Else
m_strErrMsg = "不明错误。"
End Select
Return False
End If
Return True
End Function
Public Function GetLastError() As String
Return m_strErrMsg
End Function
#End Region
End Class