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

WNetAddConnection2返回错误86但net use可正常连接Windows NT4共享如何解决

问题原因

你代码里有两个核心问题导致调用失败:

  1. NETRESOURCE结构体未初始化
    你只赋值了4个成员,剩下的dwScope、dwUsage、dwDisplayType等成员都是栈上的垃圾值,WNetAddConnection2执行时会读取这些无效值,导致参数解析错误。
  2. 编码不匹配
    WNetAddConnection2默认跟随项目配置调用宽字符版本(WNetAddConnection2W),但你传入的远程路径、用户名、密码都是ANSI编码的char*类型,函数会把ANSI字符串当成宽字符串解析,自然会识别为错误密码,抛出错误码86。
    另外你贴的代码里std::string remote行末尾漏了分号,应该是粘贴失误。

修正方案

你可以选择以下任意一种方案修复:

方案1:明确调用ANSI版本接口(适配你现有字符串类型)

#include <windows.h>
#include <iostream>
#include <cstring>

int main() {
    NETRESOURCE nr;
    // 先清零整个结构体,避免无效值
    memset(&nr, 0, sizeof(nr));
    std::string remote{"\\\\192.168.178.22\\c$"};
    nr.dwType = RESOURCETYPE_ANY;
    nr.lpLocalName = NULL;
    nr.lpRemoteName = remote.data();
    nr.lpProvider = NULL;

    // 明确调用ANSI版本的接口,匹配传入的char*参数
    auto res = WNetAddConnection2A(&nr, "test", "User", 0);

    if (res == NO_ERROR) {
        std::cout << "Connected\n";
    } else {
        std::cout << "Error code: " << res << '\n';
    }
}

方案2:全部使用宽字符类型匹配默认Unicode接口

#include <windows.h>
#include <iostream>
#include <cstring>

int main() {
    NETRESOURCE nr;
    memset(&nr, 0, sizeof(nr));
    std::wstring remote{L"\\\\192.168.178.22\\c$"};
    nr.dwType = RESOURCETYPE_ANY;
    nr.lpLocalName = NULL;
    nr.lpRemoteName = remote.data();
    nr.lpProvider = NULL;

    auto res = WNetAddConnection2W(&nr, L"test", L"User", 0);

    if (res == NO_ERROR) {
        std::wcout << L"Connected\n";
    } else {
        std::cout << "Error code: " << res << '\n';
    }
}

为什么net use可以连接成功

net use命令内部调用WNet系列接口时,会自动完成结构体初始化、编码适配、老版本SMB协议协商等操作,不会出现你手写代码里的参数错误问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 08:24:03