0

我需要先映射,然后再使用 VB.NET 取消映射 2x 驱动器。

映射驱动器时,我还需要传递用户名和密码(因为并非所有用户都具有管理员访问权限)。

但是,不仅以下内容不起作用(无法映射,因此无法取消映射),而且我注意到在映射驱动器时我只能选择传递密码,而不是用户名。

谁能帮我解决这些问题?谢谢。

Private Declare Function WNetAddConnection Lib "mpr.dll" Alias "WNetAddConnectionA" (ByVal lpszNetPath As String,
                                                                                     ByVal lpszPassword As String,
                                                                                     ByVal lpszLocalName As String) As Long
Private Declare Function WNetCancelConnection Lib "mpr.dll" Alias "WNetCancelConnectionA" (ByVal lpszName As String,
                                                                                           ByVal bForce As Long) As Long

Public Function MapDrive(ByVal UNCPath As String, ByVal Password As String, ByVal DriveLetter As String) As Boolean

    Dim MappedResult As Long = WNetAddConnection(UNCPath, Password, DriveLetter)

    Return IIf(MappedResult = 0, True, False)

End Function

Public Function UnmapDrive(ByVal DriveLetter As String) As Boolean

    Dim UnmappedResult As Long = WNetCancelConnection(DriveLetter, 0)

    Return IIf(UnmappedResult = 0, True, False)

End Function
4

1 回答 1

2

您应该切换到使用 WNetAddConnection2/WNetCancelConnection2 函数。前者允许您在调用中指定用户名。以下是我过去成功使用的 PInvoke 签名:

Private 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

Private Declare Function WNetCancelConnection2 Lib "mpr.dll" Alias "WNetCancelConnection2A" _
    (ByVal lpName As String, ByVal dwFlags As Integer, ByVal fForce As Integer) As Integer

Private Declare Function WNetGetLastError Lib "mpr.dll" Alias "WNetGetLastErrorA" _
    (ByRef nError As Integer, ByRef lpErrorBuf As String, ByVal nErrorBufSize As Integer, _
     ByRef lpNamebuf As String, ByVal nNameBufSize As Integer) As Integer

<StructLayout(LayoutKind.Sequential)> _
    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

Private Const ForceDisconnect As Integer = 1
Private Const RESOURCETYPE_DISK As Long = &H1

GetLastError 对于找出映射失败的原因(密码错误等)很有用。

于 2014-01-03T17:03:47.687 回答