尝试连接到Networkshare时句柄无效

不是

我有一个程序需要将数据放在网络共享上。在某些情况下,用户无法通过其帐户进行访问,因此需要提供凭据才能登录。

我的想法是让程序弹出Windows凭据屏幕,以便用户可以登录(例如用户何时通过Windows资源管理器打开共享)。

我找到了WNetUseConnection可以在不映射共享的情况下登录共享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)。

有没有办法让这个工作?

x x

您发布的代码似乎存在一些问题:

  1. 您的P / Invoke类型需要进行调整。以下是本机Windows类型及其相应的VB .Net对应版本:

    • HWND -> IntPtr
    • LPDWORD -> IntPtr
    • DWORD-> UInt32(我也看过Integer用过)

    使用IntPtr允许运行时使用32位或64位指针,具体取决于计算机体系结构。DWORDs始终为32位,即使在64位计算机上也是如此。另请参见:Visual C ++:具有32位和64位代码的DWORD有多大?

  2. P / Invoke签名的用户名和密码参数颠倒了。密码参数实际上应该是第一个。在您的情况下,这无关紧要,因为系统会提示用户输入此信息。但是,当您稍后尝试传递这些值时,可能会很重要...

  3. 远程共享不应带有尾部反斜杠

    .lpRemoteName = "\\server\folder\"

    应该

    .lpRemoteName = "\\server\folder"

  4. 最后,我必须添加buffer参数才能使代码正常工作。没有它,该WNetUseConnection函数将始终返回ERROR_MORE_DATA,这意味着缓冲区太小。

这是我使用的完整代码(在Windows 8 64位,Windows 7 32位上测试):

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

尝试连接到 vTiger 时凭据无效

尝试连接到Google API的Google Oauth时无效的JWT

尝试连接到Cosmos Gui时,Idm用户无效

ngrok尝试连接到React开发服务器时无效的主机头

Redigo:尝试连接到池时无效的内存地址或nil指针取消引用

尝试使用包含点字符的TNS别名连接到Oracle时出现“无效的连接字符串格式”错误

连接到 SSID 时 Swift 密码无效

尝试连接到RabbitMQ时出现IncompatibleProtocolError

尝试从 quarkus 连接到 keycloak 时出错

尝试使用TLS'LDAP结果代码201“ ErrorNetwork”:无效的数据包格式“连接到LDAP时出错

使用SetConsoleWindowInfo时无效的句柄

尝试连接到蓝牙服务器时连接被拒绝

尝试连接到服务器时,Sshutle连接被拒绝

尝试连接到Kubernetes中的服务时连接被拒绝

尝试执行任何需要处理的操作时,无法修复WinAPI中的“无效句柄”错误

将Mylyn连接到Gitlab问题时无效的TLS证书

语法错误:连接到 wallaroo 时语法无效

尝试连接到Jacorb命名服务时出错

MassTransit尝试在其关闭时无限连接到RabbitMQ

尝试连接到数据库时遇到错误 08001

尝试连接到服务器时算法协商失败

尝试连接到MongoDB的Docker实例时出现MongoServerSelectionError

尝试连接到 HBase 时出现 java.lang.NumberFormatException

尝试远程连接到 InfluxDB 时出现 502 网关错误

尝试从本地NodeJS应用连接到AWS DocumentDB时超时

尝试连接到SQL Server 2014时出现SSL错误

ReferenceError:尝试连接到 postgres 时未定义用户

尝试从Java连接到Https URL时出现401错误

尝试从Gitea连接到AD服务器时出错