从共享驱动器运行应用程序时,无效参数被提供套接字异常

时间:2018-05-16 15:35:25

标签: .net sockets exception path shared

直到最近(2018年5月)Windows 10更新,直播还有一段时间。 从共享驱动器工作多年(5+)的我的.NET应用程序开始抛出异常"提供了无效参数"尝试进行任何网络操作时(通过http下载文件或连接到Web服务)。

我搜索了问题,但所有解决方案都是从2012年开始的,它们不再适用了。任何人都知道如何解决它?

PS:我确认问题是共享驱动器(当我将应用程序移动到本地文件夹时没问题)。它与.NET安全性有关

1 个答案:

答案 0 :(得分:0)

我猜想,我经历过类似的事情。安装最后一次Windows更新(2018年5月)后,我编写的WPF应用程序中使用的身份验证方法不再有效。

我找到了两种方法让它再次发挥作用:

  1. 回滚到以前的Windows版本
  2. 将.exe应用程序文件复制到本地目录(例如桌面)
  3. 这不是一个解决方案,而是一种适合我需要的解决方法。

    抛出的异常是:

      

    System.Net.SocketException(0x80004005):提供了无效参数   在System.Net.Sockets.TcpClient..ctor(String hostname,Int32 port)[...]

    应用程序中的Authenticate()方法如下(new TcpClient构造函数行抛出异常):

        public static int Authenticate(string IPAddress, int port, string appInfo, ref string answerStr)
        {
            var encryptor = new Crypto();
    
            var xClient = new TcpClient(IPAddress, port);
            var xStream = xClient.GetStream();
    
            IPHostEntry ipEntry = Dns.GetHostEntry(Environment.MachineName);
            IPAddress[] addr = null;
            var localIP = "";
            addr = ipEntry.AddressList;
    
            foreach (IPAddress xAddr in addr)
            {
                if ((xAddr.AddressFamily == AddressFamily.InterNetwork))
                {
                    localIP = xAddr.ToString();
                    break;
                }
            }
    
            // Send auth request
            string authStr = $"{DateTime.Now.ToString()}|{Environment.UserName}|{Environment.UserDomainName}|{Environment.MachineName}|{localIP}|{appInfo}";
            byte[] authSocket = encryptor.Crypt(authStr);
            Array.Resize(ref authSocket, xClient.SendBufferSize);
            xStream.Write(authSocket, 0, authSocket.Length);
    
            // Read auth answer
            byte[] answerSocket = new byte[xClient.ReceiveBufferSize];
            xStream.Read(answerSocket, 0, answerSocket.Length);
            answerStr = encryptor.DeCrypt(answerSocket);
    
            if (!answerStr.ToUpper().StartsWith("Permission denied"))
            {
                var role = -1;
                var roleStr = answerStr.Split('|')[0];
                Int32.TryParse(roleStr, out role);
    
                answerStr = answerStr.StripBegin(roleStr + "|");
    
                return role;
            }
            else
                return -1;
        }
    

    我希望它有助于解决问题。