• C# 带用户密码访问网络共享


    调用WNetUseConnection API

    函数详细参数参考:https://msdn.microsoft.com/en-us/library/windows/desktop/aa385482(v=vs.85).aspx

    C# 调用WNetUseConnection连接共享类的代码:

    NetworkShareConnect.cs

    //引入命名空间
    //using System.Runtime.InteropServices;
    
    public class NetworkShareConnect
        {
            #region WNetUseConnection枚举参数
            //dwScope
            const int RESOURCE_CONNECTED = 0x00000001;
            const int RESOURCE_GLOBALNET = 0x00000002;
            const int RESOURCE_REMEMBERED = 0x00000003;
    
            //dwType
            const int RESOURCETYPE_ANY = 0x00000000;
            const int RESOURCETYPE_DISK = 0x00000001;
            const int RESOURCETYPE_PRINT = 0x00000002;
    
            //dwDisplayType
            const int RESOURCEDISPLAYTYPE_GENERIC = 0x00000000;
            const int RESOURCEDISPLAYTYPE_DOMAIN = 0x00000001;
            const int RESOURCEDISPLAYTYPE_SERVER = 0x00000002;
            const int RESOURCEDISPLAYTYPE_SHARE = 0x00000003;
            const int RESOURCEDISPLAYTYPE_FILE = 0x00000004;
            const int RESOURCEDISPLAYTYPE_GROUP = 0x00000005;
    
            //dwUsage
            const int RESOURCEUSAGE_CONNECTABLE = 0x00000001;
            const int RESOURCEUSAGE_CONTAINER = 0x00000002;
    
            //dwFlags
            const int CONNECT_INTERACTIVE = 0x00000008;
            const int CONNECT_PROMPT = 0x00000010;
            const int CONNECT_REDIRECT = 0x00000080;
            const int CONNECT_UPDATE_PROFILE = 0x00000001;
            const int CONNECT_COMMANDLINE = 0x00000800;
            const int CONNECT_CMD_SAVECRED = 0x00001000;
    
            const int CONNECT_LOCALDRIVE = 0x00000100;
            #endregion
    
            #region Errors参数
            const int NO_ERROR = 0;
    
            const int ERROR_ACCESS_DENIED = 5;
            const int ERROR_ALREADY_ASSIGNED = 85;
            const int ERROR_BAD_DEVICE = 1200;
            const int ERROR_BAD_NET_NAME = 67;
            const int ERROR_BAD_PROVIDER = 1204;
            const int ERROR_CANCELLED = 1223;
            const int ERROR_EXTENDED_ERROR = 1208;
            const int ERROR_INVALID_ADDRESS = 487;
            const int ERROR_INVALID_PARAMETER = 87;
            const int ERROR_INVALID_PASSWORD = 1216;
            const int ERROR_MORE_DATA = 234;
            const int ERROR_NO_MORE_ITEMS = 259;
            const int ERROR_NO_NET_OR_BAD_PATH = 1203;
            const int ERROR_NO_NETWORK = 1222;
    
            const int ERROR_BAD_PROFILE = 1206;
            const int ERROR_CANNOT_OPEN_PROFILE = 1205;
            const int ERROR_DEVICE_IN_USE = 2404;
            const int ERROR_NOT_CONNECTED = 2250;
            const int ERROR_OPEN_FILES = 2401;
    
            private struct ErrorClass
            {
                //定义错误类结构体
                public int num;
                public string message;
                public ErrorClass(int num, string message)
                {
                    this.num = num;
                    this.message = message;
                }
            }
    
    
            //连接失败信息汇总
            private static ErrorClass[] ERROR_LIST = new ErrorClass[] {
                new ErrorClass(ERROR_ACCESS_DENIED, "Error: Access Denied"), 
                new ErrorClass(ERROR_ALREADY_ASSIGNED, "Error: Already Assigned"), 
                new ErrorClass(ERROR_BAD_DEVICE, "Error: Bad Device"), 
                new ErrorClass(ERROR_BAD_NET_NAME, "Error: Bad Net Name"), 
                new ErrorClass(ERROR_BAD_PROVIDER, "Error: Bad Provider"), 
                new ErrorClass(ERROR_CANCELLED, "Error: Cancelled"), 
                new ErrorClass(ERROR_EXTENDED_ERROR, "Error: Extended Error"), 
                new ErrorClass(ERROR_INVALID_ADDRESS, "Error: Invalid Address"), 
                new ErrorClass(ERROR_INVALID_PARAMETER, "Error: Invalid Parameter"), 
                new ErrorClass(ERROR_INVALID_PASSWORD, "Error: Invalid Password"), 
                new ErrorClass(ERROR_MORE_DATA, "Error: More Data"), 
                new ErrorClass(ERROR_NO_MORE_ITEMS, "Error: No More Items"), 
                new ErrorClass(ERROR_NO_NET_OR_BAD_PATH, "Error: No Net Or Bad Path"), 
                new ErrorClass(ERROR_NO_NETWORK, "Error: No Network"), 
                new ErrorClass(ERROR_BAD_PROFILE, "Error: Bad Profile"), 
                new ErrorClass(ERROR_CANNOT_OPEN_PROFILE, "Error: Cannot Open Profile"), 
                new ErrorClass(ERROR_DEVICE_IN_USE, "Error: Device In Use"), 
                new ErrorClass(ERROR_EXTENDED_ERROR, "Error: Extended Error"), 
                new ErrorClass(ERROR_NOT_CONNECTED, "Error: Not Connected"), 
                new ErrorClass(ERROR_OPEN_FILES, "Error: Open Files"), 
            };
    
            private static string getErrorForNumber(int errNum)
            {
                //遍历获得错误代码
                foreach (ErrorClass er in ERROR_LIST)
                {
                    if (er.num == errNum) return er.message;
                }
                return "Error: Unknown, " + errNum;
            }
            #endregion
    
            //调用系统函数WNetUseConnection
            //用于连接共享
            [DllImport("Mpr.dll")]
            private static extern int WNetUseConnection(
                IntPtr hwndOwner,
                NETRESOURCE lpNetResource,
                string lpPassword,
                string lpUserID,
                int dwFlags,
                string lpAccessName,
                string lpBufferSize,
                string lpResult
                );
            //用于删除连接
            [DllImport("Mpr.dll")]
            private static extern int WNetCancelConnection2(
                string lpName,
                int dwFlags,
                bool fForce
                );
    
            [StructLayout(LayoutKind.Sequential)]
            private class NETRESOURCE
            {
                public int dwScope = 0;
                public int dwType = 0;
                public int dwDisplayType = 0;
                public int dwUsage = 0;
                public string lpLocalName = "";//映射到本地的盘符,如"Z:"。不做驱动器映射,可为空
                public string lpRemoteName = "";//共享的网络路径
                public string lpComment = "";
                public string lpProvider = "";
            }
    
            /// <summary>
            /// 连接共享
            /// </summary>
            /// <param name="remoteUNC">共享网络路径</param>
            /// <param name="username">登录用户名</param>
            /// <param name="password">密码</param>
            /// <returns></returns>
            public static string connectToShare(string remoteUNC, string username, string password)
            {
                return connectToRemote(remoteUNC, username, password, false);
            }
    
            /// <summary>
            /// 没用户密码连接
            /// </summary>
            /// <param name="remoteUNC">共享网络路径</param>
            /// <returns></returns>
            public static string connectToShare(string remoteUNC)
            {
                return connectToRemote(remoteUNC, "", "", true);
            }
    
            private static string connectToRemote(string remoteUNC, string username, string password, bool promptUser)
            {
                NETRESOURCE nr = new NETRESOURCE
                {
                    dwType = RESOURCETYPE_DISK,
                    lpRemoteName = remoteUNC
                };
    
                int ret;
                if (promptUser)
                    ret = WNetUseConnection(IntPtr.Zero, nr, "", "", CONNECT_INTERACTIVE | CONNECT_PROMPT, null, null, null);
                else
                    ret = WNetUseConnection(IntPtr.Zero, nr, password, username, 0, null, null, null);
    
                if (ret == NO_ERROR) return null;
                return getErrorForNumber(ret);
            }
    
            public static string disconnectRemote(string remoteUNC)
            {
                int ret = WNetCancelConnection2(remoteUNC, CONNECT_UPDATE_PROFILE, false);
                if (ret == NO_ERROR) return null;
                return getErrorForNumber(ret);
            }
        }

    测试:

  • 相关阅读:
    Encrypted Handshake Message
    RSAParameters Struct
    What if JWT is stolen?
    What's the difference between JWTs and Bearer Token?
    RSA Algorithm Example
    第18届Jolt大奖结果公布
    Ruby on rails开发从头来(windows)(三十六) 调试技巧
    Ruby on rails开发从头来(四十二) ActiveRecord基础(主键和ID)
    YouTube开放基础技术架构 让用户建自家YouTube
    Ruby on rails开发从头来(四十) ActiveRecord基础(Boolean属性)
  • 原文地址:https://www.cnblogs.com/eagle-chan/p/4246001.html
Copyright © 2020-2023  润新知