LocalShared.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.IO;
  6. using System.Management;
  7. using System.Security;
  8. using System.Security.AccessControl;
  9. namespace LYFZ.Network
  10. {
  11. /// <summary>
  12. /// 本地共享操作类
  13. /// </summary>
  14. public class LocalShared
  15. {
  16. public LocalShared() {
  17. }
  18. /// <summary>
  19. /// 设置文件夹共享
  20. /// </summary>
  21. /// <param name="FolderPath">文件夹完全路径</param>
  22. /// <param name="shareName">返回共享名</param>
  23. /// <param name="Remark"></param>
  24. /// <returns></returns>
  25. public static string SetFolderShared(string FolderPath, ref string shareName, string Remark = "编程方式开启共享文件夹")
  26. {
  27. try
  28. {
  29. if (FolderPath.LastIndexOf(System.IO.Path.DirectorySeparatorChar) == FolderPath.Length - 1)
  30. {
  31. FolderPath = FolderPath.Substring(0, FolderPath.Length - 1);
  32. }
  33. string tempStr = "";
  34. DirectoryInfo dinfo = new DirectoryInfo(FolderPath);
  35. if (dinfo.Exists)
  36. {
  37. shareName = dinfo.Name;
  38. if (!shareName.Contains("$"))
  39. {
  40. shareName = shareName + "$";
  41. }
  42. string CmdStr = "net share " + shareName + "=" + dinfo.FullName + " /grant:everyone,full /grant:guest,full /grant:administrator,full /remark:\"" + Remark + "\" ";
  43. NetworkConnection.StaticExecuteCmd("net share " + shareName + " /del ");
  44. tempStr = NetworkConnection.StaticExecuteCmd(CmdStr);
  45. tempStr = GetExecuteCmdMessage(tempStr);
  46. }
  47. else
  48. {
  49. tempStr = "你要共享的文件夹不存在!";
  50. }
  51. //参数 /grant 只在WIN2003(或以后)的系统上的net share才支持
  52. SetAccessControl(dinfo.FullName, AccessControlType.Allow);
  53. return tempStr.Replace("\r", "").Replace("\n", "");
  54. }
  55. catch(Exception ex) {
  56. return "共享失败:"+ex.Message;
  57. }
  58. }
  59. static string GetExecuteCmdMessage(string message)
  60. {
  61. try
  62. {
  63. return System.Text.RegularExpressions.Regex.Split(message, "&exit")[1];
  64. }
  65. catch { return message; }
  66. }
  67. /// <summary>
  68. /// 取消文件夹共享
  69. /// </summary>
  70. /// <param name="SharedName">共享名</param>
  71. /// <returns></returns>
  72. public static string CanceledFolderSharedComd(string SharedName)
  73. {
  74. string tempStr = "";
  75. string CmdStr = "net share " + SharedName + " /del ";
  76. tempStr = NetworkConnection.StaticExecuteCmd(CmdStr);
  77. tempStr = GetExecuteCmdMessage(tempStr);
  78. //参数 /grant 只在WIN2003(或以后)的系统上的net share才支持
  79. return tempStr.Replace("\r", "").Replace("\n", ""); ;
  80. }
  81. /// <summary>
  82. /// 共享文件夹
  83. /// </summary>
  84. public class SharedFolderInfo
  85. {
  86. public SharedFolderInfo() { }
  87. public SharedFolderInfo(string _sharedName, string _folderPath) {
  88. this.sharedName = _sharedName;
  89. this.folderPath = _folderPath;
  90. }
  91. string sharedName = "";
  92. /// <summary>
  93. /// 共享名
  94. /// </summary>
  95. public string SharedName
  96. {
  97. get { return sharedName; }
  98. set { sharedName = value; }
  99. }
  100. string folderPath = "";
  101. /// <summary>
  102. /// 文件夹路径
  103. /// </summary>
  104. public string FolderPath
  105. {
  106. get { return folderPath; }
  107. set { folderPath = value; }
  108. }
  109. }
  110. /// <summary>
  111. /// 检询文件夹是否已共享,如果已共享返回共享名,没有共享返回null
  112. /// </summary>
  113. /// <param name="folderPath">检询文件夹</param>
  114. /// <returns></returns>
  115. public static string QuerySharedFolder(string folderPath)
  116. {
  117. string shareName = "非共享目录";
  118. if (folderPath.IndexOf("\\\\") == 0)
  119. {
  120. shareName = folderPath;
  121. return shareName;
  122. }
  123. if (System.IO.Directory.Exists(folderPath))
  124. {
  125. try
  126. {
  127. List<SharedFolderInfo> folderList = GetLocalSharedFolderList();
  128. foreach (SharedFolderInfo fInfo in folderList)
  129. {
  130. if (LYFZ.WinAPI.CustomPublicMethod.GetDirectoryPath(fInfo.FolderPath).ToLower()
  131. .Equals(LYFZ.WinAPI.CustomPublicMethod.GetDirectoryPath(folderPath.ToLower())))
  132. {
  133. shareName = fInfo.SharedName;
  134. }
  135. }
  136. }
  137. catch
  138. {
  139. System.IO.DirectoryInfo dirinfo = new DirectoryInfo(folderPath);
  140. if (dirinfo.Name.Contains("$"))
  141. {
  142. shareName = dirinfo.Name;
  143. }
  144. else
  145. {
  146. shareName = dirinfo.Name + "$";
  147. }
  148. // dirinfo.Name;
  149. }
  150. }
  151. else {
  152. shareName = "此目录不存在";
  153. }
  154. return shareName;
  155. }
  156. /// <summary>
  157. /// 获取本机所有共享文件夹
  158. /// </summary>
  159. /// <returns></returns>
  160. public static List<SharedFolderInfo> GetLocalSharedFolderList()
  161. {
  162. List<SharedFolderInfo> folderList = new List<SharedFolderInfo>();
  163. System.Management.ManagementObjectSearcher searcher = new
  164. System.Management.ManagementObjectSearcher("select * from win32_share");
  165. foreach (System.Management.ManagementObject share in searcher.Get())
  166. {
  167. // tempShare += share["Name"].ToString() + "?" + share["Path"].ToString() + "|"; //名称
  168. folderList.Add(new SharedFolderInfo(share["Name"].ToString(), share["Path"].ToString()));
  169. }
  170. return folderList;
  171. }
  172. /// <summary>
  173. /// 添加共享权限
  174. /// </summary>
  175. /// <param name="FolderPath">文件夹路径</param>
  176. /// <param name="userName">要共享的用户名</param>
  177. /// <param name="fRights">权限值</param>
  178. public static void AddSharePermissions(string FolderPath, string userName, FileSystemRights fRights = FileSystemRights.FullControl)
  179. {
  180. DirectoryInfo dinfo = new DirectoryInfo(FolderPath);
  181. if (dinfo.Exists)
  182. {
  183. DirectorySecurity dirsecurity = dinfo.GetAccessControl();
  184. dirsecurity.AddAccessRule(new FileSystemAccessRule(userName, fRights, InheritanceFlags.ContainerInherit, PropagationFlags.InheritOnly, AccessControlType.Allow));
  185. dinfo.SetAccessControl(dirsecurity);
  186. }
  187. }
  188. /// <summary>
  189. /// 设置共享权限
  190. /// </summary>
  191. /// <param name="FolderPath">文件夹路径</param>
  192. /// <param name="userName">要共享的用户名</param>
  193. /// <param name="fRights">权限值</param>
  194. public static void SetSharePermissions(string FolderPath, string userName, FileSystemRights fRights = FileSystemRights.FullControl)
  195. {
  196. DirectoryInfo dinfo = new DirectoryInfo(FolderPath);
  197. if (dinfo.Exists)
  198. {
  199. DirectorySecurity dirsecurity = dinfo.GetAccessControl();
  200. dirsecurity.SetAccessRule(new FileSystemAccessRule(userName, fRights, InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow));
  201. dinfo.SetAccessControl(dirsecurity);
  202. }
  203. }
  204. /// <summary>
  205. /// 设置目录所有用户权限
  206. /// 设置为所有用户的完全全权
  207. /// </summary>
  208. /// <param name="path">目录</param>
  209. /// <param name="atype">权限,是允许还是绝拒</param>
  210. public static void SetAccessControl(string path, AccessControlType atype)
  211. {
  212. string dirPath = path;
  213. DirectoryInfo dinfo = new DirectoryInfo(dirPath);
  214. FileSystemRights fRights = FileSystemRights.FullControl;
  215. System.Security.AccessControl.DirectorySecurity acc = dinfo.GetAccessControl();
  216. acc.AddAccessRule(new System.Security.AccessControl.FileSystemAccessRule("Administrators", fRights, System.Security.AccessControl.InheritanceFlags.ObjectInherit, System.Security.AccessControl.PropagationFlags.None, AccessControlType.Allow));
  217. acc.AddAccessRule(new System.Security.AccessControl.FileSystemAccessRule("Administrator", fRights, System.Security.AccessControl.InheritanceFlags.ObjectInherit, System.Security.AccessControl.PropagationFlags.None, AccessControlType.Allow));
  218. acc.AddAccessRule(new System.Security.AccessControl.FileSystemAccessRule("Everyone", fRights, System.Security.AccessControl.InheritanceFlags.ObjectInherit, System.Security.AccessControl.PropagationFlags.None, AccessControlType.Allow));
  219. acc.AddAccessRule(new System.Security.AccessControl.FileSystemAccessRule("Users", fRights, System.Security.AccessControl.InheritanceFlags.ObjectInherit, System.Security.AccessControl.PropagationFlags.None, AccessControlType.Allow));
  220. acc.AddAccessRule(new System.Security.AccessControl.FileSystemAccessRule("Guests", fRights, System.Security.AccessControl.InheritanceFlags.ObjectInherit, System.Security.AccessControl.PropagationFlags.None, AccessControlType.Allow));
  221. acc.AddAccessRule(new System.Security.AccessControl.FileSystemAccessRule("Guest", fRights, System.Security.AccessControl.InheritanceFlags.ObjectInherit, System.Security.AccessControl.PropagationFlags.None, AccessControlType.Allow));
  222. dinfo.SetAccessControl(acc);
  223. AuthorizationRuleCollection ruleCollection = acc.GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount));
  224. foreach (FileSystemAccessRule rule in ruleCollection)
  225. {
  226. System.Security.AccessControl.FileSystemAccessRule ar = new System.Security.AccessControl.FileSystemAccessRule(rule.IdentityReference, fRights, InheritanceFlags.ObjectInherit, PropagationFlags.None, atype);
  227. acc.ResetAccessRule(ar);
  228. dinfo.SetAccessControl(acc);
  229. }
  230. }
  231. /// <summary>
  232. /// 设置文件夹共享
  233. /// </summary>
  234. /// <param name="FolderPath">文件夹路径</param>
  235. /// <param name="ShareName">共享名</param>
  236. /// <param name="Description">共享注释</param>
  237. /// <returns></returns>
  238. public static int SetFolderShared(string FolderPath, string ShareName, string Description = "编程方式开启共享文件夹")
  239. {
  240. try
  241. {
  242. ManagementClass managementClass = new ManagementClass("Win32_Share");
  243. //对于IN和OUT参数创建ManagementBaseObjects
  244. ManagementBaseObject inParams = managementClass.GetMethodParameters("Create");
  245. ManagementBaseObject outParams;
  246. // 设置输入参数
  247. inParams["Description"] = Description;
  248. inParams["Name"] = ShareName;
  249. inParams["Path"] = FolderPath;
  250. inParams["Type"] = 0x0; // Disk Drive
  251. outParams = managementClass.InvokeMethod("Create", inParams, null);
  252. // 请检查是否在方法调用成功
  253. if ((uint)(outParams.Properties["ReturnValue"].Value) != 0)
  254. {
  255. throw new Exception("无法共享目录。");
  256. }
  257. }
  258. catch
  259. {
  260. return -1;
  261. }
  262. return 0;
  263. }
  264. /// <summary>
  265. /// 取消文件夹共享
  266. /// </summary>
  267. /// <param name="ShareName">文件夹的共享名</param>
  268. /// <returns></returns>
  269. public int CancelShareNetFolder(string ShareName)
  270. {
  271. try
  272. {
  273. SelectQuery selectQuery = new SelectQuery("Select * from Win32_Share Where Name = '" + ShareName + "'");
  274. ManagementObjectSearcher searcher = new ManagementObjectSearcher(selectQuery);
  275. foreach (ManagementObject mo in searcher.Get())
  276. {
  277. mo.InvokeMethod("Delete", null, null);
  278. }
  279. }
  280. catch
  281. {
  282. return -1;
  283. }
  284. return 0;
  285. }
  286. }
  287. }