You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET中NetworkCredential验证失败:用户名或密码错误求助

解决NetworkCredential访问共享文件夹报“用户名或密码错误”的问题

你的问题核心出在三个关键错误点上:

  • NetworkCredential的domain参数传错了:你把共享文件夹路径当成了domain,实际上这里应该填目标主机的域名、机器名或者IP地址
  • 认证类型选择错误:Windows文件共享默认使用NTLM或Negotiate协议,而非Basic
  • DirectoryInfo不支持读取CredentialCache凭据:这个类不会自动关联CredentialCache中的认证信息,需要先手动建立网络连接

修复后代码示例

首先需要导入Windows API用于建立网络连接:

Imports System.Runtime.InteropServices

Public Class Form1
    ' 导入WNetAddConnection2 API,用于建立网络连接
    <DllImport("mpr.dll", CharSet:=CharSet.Unicode, SetLastError:=True)>
    Private Shared Function WNetAddConnection2(ByRef lpNetResource As NETRESOURCE, ByVal lpPassword As String, ByVal lpUserName As String, ByVal dwFlags As Integer) As Integer
    End Function

    ' 导入WNetCancelConnection2 API,用于断开网络连接
    <DllImport("mpr.dll", CharSet:=CharSet.Unicode, SetLastError:=True)>
    Private Shared Function WNetCancelConnection2(ByVal lpName As String, ByVal dwFlags As Integer, ByVal fForce As Boolean) As Integer
    End Function

    ' 定义网络资源结构体
    Private 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 RESOURCETYPE_DISK As Integer = &H1
    Private Const CONNECT_UPDATE_PROFILE As Integer = &H1

    Private Sub TestSharedFolderAccess()
        ' 示例变量
        Dim fromDir As String = "\\10.10.10.4\d$\Test\FromDirectory"
        Dim toDir As String = "\\100.11.5.37\d$\Test\ToDirectory"

        Dim fromDirUser As String = "admin"
        Dim fromDirPwd As String = "Test1234"
        Dim fromDomain As String = "10.10.10.4" ' 目标主机IP或机器名

        Dim toDirUser As String = "admin"
        Dim toDirPwd As String = "Test1234"
        Dim toDomain As String = "100.11.5.37"

        ' 建立到fromDir的网络连接
        Dim nrFrom As NETRESOURCE = New NETRESOURCE()
        nrFrom.dwType = RESOURCETYPE_DISK
        nrFrom.lpRemoteName = fromDir.Substring(0, fromDir.IndexOf("\", 2)) ' 提取主机地址部分:\\10.10.10.4
        nrFrom.lpProvider = Nothing

        Dim connectResult As Integer = WNetAddConnection2(nrFrom, fromDirPwd, $"{fromDomain}\{fromDirUser}", 0)
        If connectResult <> 0 Then
            MsgBox($"连接源文件夹失败,错误码:{connectResult}")
            Return
        End If

        ' 测试访问源文件夹
        Try
            Dim dir As New DirectoryInfo(fromDir)
            For Each fi As FileInfo In dir.GetFiles("*.*")
                MessageBox.Show(fi.ToString())
            Next
        Catch ex As IOException
            MsgBox(ex.Message)
        Finally
            ' 用完后断开连接,避免凭据残留
            WNetCancelConnection2(nrFrom.lpRemoteName, CONNECT_UPDATE_PROFILE, False)
        End Try

        ' 同理可实现toDir的连接与文件复制逻辑
        ' ...
    End Sub
End Class

关键修改说明

  1. 修正domain参数:使用目标主机的IP作为domain,用户名格式改为domain\username(本地账户用机器名/IP,域账户用域名)
  2. 改用WNetAddConnection2建立连接:这是Windows原生的网络连接API,能正确传递凭据并建立共享访问会话,后续DirectoryInfo即可正常访问
  3. 添加断开连接逻辑:避免程序退出后残留无效网络连接,影响后续访问

额外注意事项

  • 若目标主机属于域环境,domain需填写域名而非IP
  • 确保目标主机开启SMB服务,防火墙允许445、139端口访问
  • 生产环境请勿硬编码凭据,建议从加密存储(如数据库加密字段)读取
  • 若出现错误码,可查询Windows系统错误码对照表定位具体问题

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 08:15:14