【问题标题】:WNetAddConnection2 fails but net use succeedsWNetAddConnection2 失败但网络使用成功
【发布时间】:2015-02-05 17:14:28
【问题描述】:

我正在尝试使用 WNetAddConnection2 连接到网络资源,但它失败并出现错误代码 ERROR_BAD_NET_NAME(错误代码 67)。

但是如果使用相同的用户名和密码的“net use”命令,它会成功。

有什么线索吗?

public class NETRESOURCE
    {
        public int dwScope;
        public int dwType;
        public int dwDisplayType;
        public int dwUsage;
        public string LocalName;
        public string RemoteName;
        public string Comment;
        public string Provider;
    }
    [DllImport("mpr.dll")]
    public static extern int WNetAddConnection2(NETRESOURCE netResource, string password, string username, int flags);

    public class ServerConnect
    {
        private string serverName;
        private string userName;
        private string password;
        public int nResult;

        public ServerConnect()
        {
            serverName = "";
            userName = "";
            password = "";
            nResult = -1;
        }
        public void SetConnectionParam(string serName, string uName, string pwd)
        {
            serverName = serName;
            userName = uName;
            password = pwd;
        }

        public void Connect()
        {
            NETRESOURCE myResource = new NETRESOURCE();
            myResource.dwScope = 0;
            myResource.dwType = 0x00000001; //RESOURCETYPE_DISK
            myResource.dwDisplayType = 0;
            myResource.LocalName = "";
            myResource.RemoteName = serverName;
            myResource.dwUsage = 0;
            myResource.Comment = "";
            myResource.Provider = "";
            nResult = WNetAddConnection2(myResource, password, userName, 0);     


        }
    };

    public void ConnectToDataServer(string serverName)
    {
        ServerConnect oConnect = new ServerConnect();
        oConnect.SetConnectionParam(serverName, @"Domain\username", @"password");
        Thread connectionThread = new Thread(new ThreadStart(oConnect.Connect));
        connectionThread.Start();
        while (!connectionThread.IsAlive) ;// Wait till thread starts and Alive
        int nCount = 0;
        while (connectionThread.IsAlive)
        {
            Thread.Sleep(500);
            nCount++;
            if (nCount == 10) // wait for 5 secs
            {
                //WriteLine(this, "Failed to Connect to to server " + serverName , LogStatus.Error);
                connectionThread.Abort();
                Thread.Sleep(1000);
            }
        }
        //WriteLine(this, oConnect.nResult.ToString(), LogStatus.Success);
    }
    public void ConnectToServer()
    {

        ConnectToDataServer(@"\\ServerName");
}

【问题讨论】:

  • ERROR_BAD_NET_NAME 与用户名/密码无关,而是在找不到计算机/服务器的网络名称时抛出。
  • 我明白这一点。但是 net use 似乎找到了该名称并成功运行。
  • 好的,很抱歉。我不确定,因为您的问题有点暗示您专注于用户名/密码而不是计算机名称。

标签: c# network-programming


【解决方案1】:

首先,我们需要查看您的代码,因为 WNetAddConnection2 是一个 Windows 函数,因此 P/Invoked 和 P/Invoke 操作总是非常非常麻烦。

假设您已正确调用,可能存在权限问题(如果您运行的是 Windows 8,则尤其如此)。尝试在 luanch VS 时确保Run as Administrator,因为这通常会将相同的凭据扩展到正在执行的应用程序,而控制台通常具有不同的权限。

【讨论】:

  • 感谢您的回复。我用代码编辑了我的帖子。我在一个线程中运行 WNetAddConnection2 以确保如果它需要永远可以中止它。我正在以管理员权限运行此应用程序。我在管理命令窗口上发出“net use”
猜你喜欢
  • 2015-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多