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

原文: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);
        }
    }

 

测试:

 

注意:断开共享后,系统缓存还在,没能即时失去连接,在1-3分钟内仍然可以访问共享。

有时候要注销才能失去连接,原因未明 %>_<%

时间: 2024-07-30 17:00:33

C# 带用户密码访问网络共享的相关文章

德国电信遭攻击,超过千万用户无法访问网络

       近日,德国电信遭遇网络攻击导致超过90万路由器无法连接互联网,造成大量用户无法访问网络. 断网时间始于当地时间11月27日(周日)17:00左右.德国电信在周一12:00发文表示,大约有2千万用户的问题已得以解决,但仍有用户反映问题依旧. 受此事件影响的用户已超过千万,具体影响范围如图所示: 图片来自:Allestoerugen.de 由于路由器无法连接网络,受影响的用户不仅无法正常连接互联网,也无法使用这些路由器来连接电话和电视服务. 采取快速补救措施 目前德国电信已经联合路由器

Win7访问局域网共享提示没有权限的解决方法

  在局域网环境下,想要实现数据共享功能,通常我们会开启网络共享,来让局域网内的计算机用户共享网络但在近期有部分用户在访问网络共享时,系统提示没有权限使用网络资源,对于该问题很多用户不知道如何解决,故此小编在这里为带提供了详细的操作方法,下面我们来了解下吧! 解决方法: 删除"拒绝从网络访问这台计算机"里面的Gu 1.在屏幕的左下角点开[开始]----在搜索程序和文件那个文本框里输入gpedit.msc,然后回车. 2.弹出如下图的对话框,依次展开----计算机配置---windos

windows 7 wifi无线网络共享设置图文详解

这篇文章是对win7自带wifi win7无线网络共享设置图文方法(网上的,比较细)的简化,我做好bat和exe文件,直接可以使用:看详情: 文件下载地址:http://down.51cto.com/data/639857 有想法的童鞋可以自己改动密码哦,呵呵,自己琢磨把,文件都给你们了 默认的ssid:wlanjiejie 密码:jiejie123@123 主机设置如下:) e( ~6 V7 }+ t* e 1.以管理员身份运行: 然后再打开"网络和共享中心"--"更改适配

DOS下也能访问网络!网上邻居偏方秘笈两则

如果Windows突然不能正常启动了,而必需的文件保存在网上邻居中的共享资源内,是不是不能访问了呢? 利用Windows内的网上邻居命令来访问是不能在DOS下操作的,这是否让你束手无策了呢?其实DOS系统有自己的网络访问命令,它就是NET命令,用户必须要在DOS命令提示符下输入"NET VIEW ABC"命令(其中ABC表示网上邻居中的共享计算机名字),再回车执行,就能查看共享计算机ABC上的资源文件了:要是大家输入"NET USEF:abcdef"命令的话,就可以

Windows XP的网络访问和共享设置

由于Windows XP构成操作系统网络设置和Windows 2000完全一样,但还是出现了根本不能访问的情况,笔者认为这主要是因为XP的安全设置和2000不一样所导致.针对这个问题笔者在网上查了一些资料,并将各种网上提供的常见解决方法做了相应测试,现在整理介绍给大家,希望能对遇到此问题的网友有所帮助,并请高手继续指点. 首先,这里不考虑物理联接和其它问题,只谈及策略问题.此外,请安装相应的协议并正确的设置IP地址,同时尽量把计算机设置在一个工作组内且具有相同网段的IP地址. 其次,网上对于出现

设置windows共享后不能通过用户名密码访问怎么办

  今日由于客户需要在服务器上做了一个共享文件夹,新建了一个用户,用于服务器生成数据提供给对端读取用.服务器是win2003但在设置了共享之后从网络输入新建的用户名密码无法访问,如图: 在记得以前看过一个资料上说这种情况需要进入策略组中在"本地安全设置"--"本地策略"--"安全选项"中,将"网络访问:本地账户的共享和安全模式"改为"经典-本地用户已自己的身份验证". 但是进入系统里看了一下,我已经是这种设

电脑添加网络共享打印机时,提示“拒绝访问”等信息,无法添加打印机

添加网络共享打印机时,提示"拒绝访问"等信息,无法添加打印机. 原因分析: 由于被共享的打印机,用户权限设置不足导致此问题.解决方案: 打开打印机属性或者共享界面 如果其中没有everyone用户,则添加此用户并且赋予打印权限     故障现象: 添加网络共享打印机时,提示"拒绝访问"等信息,无法添加打印机 原因分析: 由于被共享的打印机,用户权限设置不足导致此问题.解决方案: 打开打印机属性或者共享界面: 如果其中没有everyone用户,则添加此用户并且赋予打印

让Windows 2008网络共享访问驶上高速路

在信息爆炸的时代,无论规模大的单位还是规模小的单位,都已经组建了与各自单位规模相对应的局 域网网络;单位中的许多重要资源常常需要通过网络让每一位员工进行共享访问,这样不但能够有效节约 办公费用,而且还能大大提升日常办公效率.原本访问共享资源是一个简单得不值一提的话题,可是到了 Windows Server 2008系统环境下,我们发现共享访问操作有必要"旧题新唱";这不,借助下面的几则访 问秘籍,我们可以轻轻松松地让Windows Server 2008共享访问驶上高速路! 1. 启用

天翼好网络,专注宽带20年 带用户走向更好未来

http://www.aliyun.com/zixun/aggregation/33721.html">2014年,是中国 互联网发展的第20个年头.20年来,中国电信一直站在推动互联网 快速发展的前端,成为全国"覆盖面最广,信号 最好.价格最低.速度最快的"的网络公司.   起步:电话线打造传奇起点   众所周知,中国电信的前身是中国邮电,电信是从原来中国邮电局分离出来的.最初上上网只能靠电话线,而电话线最初的经营者就是中国电信.电信背负的不仅是企业的生存问题,更是让