C#通过用户名与密码访问共享目录

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Runtime.InteropServices;
  6.  
  7. namespace FileTools
  8. {
  9. public class NetworkShareConnect
  10. {
  11.  
  12. #region WNetUseConnection枚举参数
  13. //dwScope
  14. const int RESOURCE_CONNECTED = 0x00000001;
  15. const int RESOURCE_GLOBALNET = 0x00000002;
  16. const int RESOURCE_REMEMBERED = 0x00000003;
  17.  
  18. //dwType
  19. const int RESOURCETYPE_ANY = 0x00000000;
  20. const int RESOURCETYPE_DISK = 0x00000001;
  21. const int RESOURCETYPE_PRINT = 0x00000002;
  22.  
  23. //dwDisplayType
  24. const int RESOURCEDISPLAYTYPE_GENERIC = 0x00000000;
  25. const int RESOURCEDISPLAYTYPE_DOMAIN = 0x00000001;
  26. const int RESOURCEDISPLAYTYPE_SERVER = 0x00000002;
  27. const int RESOURCEDISPLAYTYPE_SHARE = 0x00000003;
  28. const int RESOURCEDISPLAYTYPE_FILE = 0x00000004;
  29. const int RESOURCEDISPLAYTYPE_GROUP = 0x00000005;
  30.  
  31. //dwUsage
  32. const int RESOURCEUSAGE_CONNECTABLE = 0x00000001;
  33. const int RESOURCEUSAGE_CONTAINER = 0x00000002;
  34.  
  35. //dwFlags
  36. const int CONNECT_INTERACTIVE = 0x00000008;
  37. const int CONNECT_PROMPT = 0x00000010;
  38. const int CONNECT_REDIRECT = 0x00000080;
  39. const int CONNECT_UPDATE_PROFILE = 0x00000001;
  40. const int CONNECT_COMMANDLINE = 0x00000800;
  41. const int CONNECT_CMD_SAVECRED = 0x00001000;
  42.  
  43. const int CONNECT_LOCALDRIVE = 0x00000100;
  44. #endregion
  45.  
  46. #region Errors参数
  47. const int NO_ERROR = ;
  48.  
  49. const int ERROR_ACCESS_DENIED = ;
  50. const int ERROR_ALREADY_ASSIGNED = ;
  51. const int ERROR_BAD_DEVICE = ;
  52. const int ERROR_BAD_NET_NAME = ;
  53. const int ERROR_BAD_PROVIDER = ;
  54. const int ERROR_CANCELLED = ;
  55. const int ERROR_EXTENDED_ERROR = ;
  56. const int ERROR_INVALID_ADDRESS = ;
  57. const int ERROR_INVALID_PARAMETER = ;
  58. const int ERROR_INVALID_PASSWORD = ;
  59. const int ERROR_MORE_DATA = ;
  60. const int ERROR_NO_MORE_ITEMS = ;
  61. const int ERROR_NO_NET_OR_BAD_PATH = ;
  62. const int ERROR_NO_NETWORK = ;
  63.  
  64. const int ERROR_BAD_PROFILE = ;
  65. const int ERROR_CANNOT_OPEN_PROFILE = ;
  66. const int ERROR_DEVICE_IN_USE = ;
  67. const int ERROR_NOT_CONNECTED = ;
  68. const int ERROR_OPEN_FILES = ;
  69.  
  70. private struct ErrorClass
  71. {
  72. //定义错误类结构体
  73. public int num;
  74. public string message;
  75. public ErrorClass(int num, string message)
  76. {
  77. this.num = num;
  78. this.message = message;
  79. }
  80. }
  81.  
  82. //连接失败信息汇总
  83. private static ErrorClass[] ERROR_LIST = new ErrorClass[] {
  84. new ErrorClass(ERROR_ACCESS_DENIED, "Error: Access Denied"),
  85. new ErrorClass(ERROR_ALREADY_ASSIGNED, "Error: Already Assigned"),
  86. new ErrorClass(ERROR_BAD_DEVICE, "Error: Bad Device"),
  87. new ErrorClass(ERROR_BAD_NET_NAME, "Error: Bad Net Name"),
  88. new ErrorClass(ERROR_BAD_PROVIDER, "Error: Bad Provider"),
  89. new ErrorClass(ERROR_CANCELLED, "Error: Cancelled"),
  90. new ErrorClass(ERROR_EXTENDED_ERROR, "Error: Extended Error"),
  91. new ErrorClass(ERROR_INVALID_ADDRESS, "Error: Invalid Address"),
  92. new ErrorClass(ERROR_INVALID_PARAMETER, "Error: Invalid Parameter"),
  93. new ErrorClass(ERROR_INVALID_PASSWORD, "Error: Invalid Password"),
  94. new ErrorClass(ERROR_MORE_DATA, "Error: More Data"),
  95. new ErrorClass(ERROR_NO_MORE_ITEMS, "Error: No More Items"),
  96. new ErrorClass(ERROR_NO_NET_OR_BAD_PATH, "Error: No Net Or Bad Path"),
  97. new ErrorClass(ERROR_NO_NETWORK, "Error: No Network"),
  98. new ErrorClass(ERROR_BAD_PROFILE, "Error: Bad Profile"),
  99. new ErrorClass(ERROR_CANNOT_OPEN_PROFILE, "Error: Cannot Open Profile"),
  100. new ErrorClass(ERROR_DEVICE_IN_USE, "Error: Device In Use"),
  101. new ErrorClass(ERROR_EXTENDED_ERROR, "Error: Extended Error"),
  102. new ErrorClass(ERROR_NOT_CONNECTED, "Error: Not Connected"),
  103. new ErrorClass(ERROR_OPEN_FILES, "Error: Open Files"),
  104. };
  105.  
  106. private static string getErrorForNumber(int errNum)
  107. {
  108. //遍历获得错误代码
  109. foreach (ErrorClass er in ERROR_LIST)
  110. {
  111. if (er.num == errNum) return er.message;
  112. }
  113. return "Error: Unknown, " + errNum;
  114. }
  115. #endregion
  116.  
  117. //调用系统函数WNetUseConnection
  118. //用于连接共享
  119. [DllImport("Mpr.dll")]
  120. private static extern int WNetUseConnection(
  121. IntPtr hwndOwner,
  122. NETRESOURCE lpNetResource,
  123. string lpPassword,
  124. string lpUserID,
  125. int dwFlags,
  126. string lpAccessName,
  127. string lpBufferSize,
  128. string lpResult
  129. );
  130. //用于删除连接
  131. [DllImport("Mpr.dll")]
  132. private static extern int WNetCancelConnection2(
  133. string lpName,
  134. int dwFlags,
  135. bool fForce
  136. );
  137.  
  138. [StructLayout(LayoutKind.Sequential)]
  139. private class NETRESOURCE
  140. {
  141. public int dwScope = ;
  142. public int dwType = ;
  143. public int dwDisplayType = ;
  144. public int dwUsage = ;
  145. public string lpLocalName = "";//映射到本地的盘符,如"Z:"。不做驱动器映射,可为空
  146. public string lpRemoteName = "";//共享的网络路径
  147. public string lpComment = "";
  148. public string lpProvider = "";
  149. }
  150.  
  151. /// <summary>
  152. /// 连接共享
  153. /// </summary>
  154. /// <param name="remoteUNC">共享网络路径</param>
  155. /// <param name="username">登录用户名</param>
  156. /// <param name="password">密码</param>
  157. /// <returns></returns>
  158. public static string connectToShare(string remoteUNC, string username, string password)
  159. {
  160. return connectToRemote(remoteUNC, username, password, false);
  161. }
  162.  
  163. /// <summary>
  164. /// 没用户密码连接
  165. /// </summary>
  166. /// <param name="remoteUNC">共享网络路径</param>
  167. /// <returns></returns>
  168. public static string connectToShare(string remoteUNC)
  169. {
  170. return connectToRemote(remoteUNC, "", "", true);
  171. }
  172.  
  173. private static string connectToRemote(string remoteUNC, string username, string password, bool promptUser)
  174. {
  175. NETRESOURCE nr = new NETRESOURCE
  176. {
  177. dwType = RESOURCETYPE_DISK,
  178. lpRemoteName = remoteUNC
  179. };
  180.  
  181. int ret;
  182. if (promptUser)
  183. ret = WNetUseConnection(IntPtr.Zero, nr, "", "", CONNECT_INTERACTIVE | CONNECT_PROMPT, null, null, null);
  184. else
  185. ret = WNetUseConnection(IntPtr.Zero, nr, password, username, , null, null, null);
  186.  
  187. if (ret == NO_ERROR) return null;
  188. return getErrorForNumber(ret);
  189. }
  190.  
  191. public static string disconnectRemote(string remoteUNC)
  192. {
  193. int ret = WNetCancelConnection2(remoteUNC, CONNECT_UPDATE_PROFILE, false);
  194. if (ret == NO_ERROR) return null;
  195. return getErrorForNumber(ret);
  196. }
  197.  
  198. }
  199. }
  200.  

测试:

  1. string _Server=this.txtServer.Text.Trim();
  2. string _ID=this.txtID.Text.Trim();
  3. string _Password=this.txtPassword.Text.Trim();
  4.  
  5. string _ConnMsg = NetworkShareConnect.connectToShare(_Server, _ID, _Password);
  6. if (_ConnMsg == null)
  7. {
  8.  
  9. this.myGroupBox_Green1.BackColor = Color.FromName("Green");
  10. this.lblMessage.Text = "连接成功,正在上传文件至服务器...";
  11. FileHelper.MoveFiles(this.txtPath.Text, _Server, true, true);
  12. }
  13. else
  14. {
  15. this.myGroupBox_Green1.BackColor = Color.FromName("Red");
  16. this.lblMessage.Text = "错误:检测到无法连接至服务器.";
  17.  
  18. this.timer1.Enabled = false;
  19. this.btnStart.Enabled = true;
  20. this.btnStart.Text = "Start";
  21. }

C#通过用户名与密码访问共享目录的更多相关文章

  1. Windows Server 2008下共享资源访问走捷径 (不用用户名 和 密码 访问共享)

    1. 启用来宾帐号2. 共享目录添加“Guest”帐号3. “gpedit.msc”,打开对应系统的组策略编辑窗口;在该编辑窗口的左侧显示区域,依次展开“本地计算机策略”/“计算机配置”/“Windo ...

  2. 服务器资源共享--IIS站点/虚拟目录中访问共享目录(UNC)

    本文重点描述如何使用IIS访问共享资源来架设站点或执行 ASP.Net 等脚本. 通常情况下,拥有多台服务器的朋友在使用IIS建立站点的时候,会遇到如何把多台服务器的资源合并到一起的问题.如何让A服务 ...

  3. ubuntu下的Samba配置:使每个用户可以用自己的用户名和密码登录自己的home目录

    http://blog.csdn.net/fly_qj/article/details/21744797 1.先要安装Samba sudo apt-get install samba openssh- ...

  4. Apache:如何访问共享目录

    环境说明:Apache的版本是2.4.10,共享目录有两种情况,一种是windows server的目录共享,还有一种是linux的NAS.无论访问哪一种共享目录,都需要用户名和密码. 问题说明:如何 ...

  5. Windows 之 删除保存的共享凭据(用户名和密码)

    当我们在访问Windows共享文件夹或者NAS网络共享盘的时候,Windows会提示输入访问共享所需要的用户名和密码,如果我们勾选了“记住我的凭据”,Windows 就会将认证凭据保存到计算机中,以方 ...

  6. TortoiseGit:记住用户名和密码

    1.背景: 我们在使用 tortoisegit 工具时会无可避免的经常性 pull 和 push,这时通常要输入用户名和密码,由于麻烦,就有人提出了记住用户名和密码的需求... ... 2.设置: [ ...

  7. svn客户端重新设置用户名和密码

    在第一次使用TortoiseSVN从服务器CheckOut的时候,会要求输入用户名和密码,这时输入框下面有个选项是保存认证信息,如果选了这个选项,那么以后就不用每次都输入一遍用户名密码了. 不过,如果 ...

  8. TortoiseGit 连接oschina不用每次输入用户名和密码的方法

    每次git clone 和push 都要输入用户名和密码.虽然安全,但在本机上每次都输有些麻烦,如何记住用户名和密码呢? 在网上看了各种方法,太杂,很多可能环境不一样,一直行不通.最后找到一种有效的方 ...

  9. TortoiseSVN客户端重新设置用户名和密码

    TortoiseSVN客户端重新设置用户名和密码 在第一次使用TortoiseSVN从服务器CheckOut的时候,会要求输入用户名和密码,这时输入框下面有个选项是保存认证信息,如果选了这个选项,那么 ...

随机推荐

  1. Vuejs学习笔记(一)

    1)    vue.js 的 主要功能 1.模板渲染 2.模块化 3.扩展功能:路由,Ajax 2)    vue.js 模板渲染之双向绑定示例 message 绑定到了 input 对象,所有在in ...

  2. jquery中,使用append增加新元素时,新增元素的绑定监听事件失效的解决办法

    $("outerSelector").on("eventType","innerSelector",function(){}); 举例:如果 ...

  3. 一个用SAM维护多个串的根号特技

    一个用SAM维护多个串的根号特技 基本介绍 在多个串的字符串题中,往往会出现一类题需要用到某个子串是否在一些母串中出现.此时对于 \(\text{parent}\) 树的 \(\text{right} ...

  4. 01背包-dp

    一 问题分析 二 代码实现 package Dp_0_1_bag; import java.io.BufferedWriter; import java.io.FileWriter; import j ...

  5. Linux服务部署--Java(二)

    八.Maven安装配置 1. 下载 wget http://mirrors.cnnic.cn/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3. ...

  6. java中打开文件流后要关闭后重新打开

    记录错误,打开文件流一定要关闭并重新打开文件流,不然取的文件内容永远是第一次取的文件内容: /** * 读取配置文件 */ private Properties readProperties() { ...

  7. css selector 用法

    html.css('a::attr(href)').extract()

  8. plsql 工具怎样导出 oracle 表结构

    一.双击 plsql 工具,输入登陆用户.登陆密码以及登陆数据库名称,如下图: 二.菜单 Tools --> Export User Objects...,如下图: 三.进入导出界面后,可以选择 ...

  9. asp.net mvc ViewData 和 ViewBag区别,TempData

    ViewData 和 ViewBag都是页面级别的生命周期,TempData--Passing data between the current and next HTTP requests Temp ...

  10. [原创]移动安全测试框架MobSF介绍

    [原创]移动安全测试框架MobSF介绍 1 mobsf简介 Mobile Security Framework (移动安全框架) 是一款智能.集成型.一体化的开源移动应用(Android/iOS)自动 ...