123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.IO;
- using System.Management;
- using System.Security;
- using System.Security.AccessControl;
- namespace LYFZ.Network
- {
- /// <summary>
- /// 本地共享操作类
- /// </summary>
- public class LocalShared
- {
- public LocalShared() {
-
- }
- /// <summary>
- /// 设置文件夹共享
- /// </summary>
- /// <param name="FolderPath">文件夹完全路径</param>
- /// <param name="shareName">返回共享名</param>
- /// <param name="Remark"></param>
- /// <returns></returns>
- public static string SetFolderShared(string FolderPath, ref string shareName, string Remark = "编程方式开启共享文件夹")
- {
- try
- {
- if (FolderPath.LastIndexOf(System.IO.Path.DirectorySeparatorChar) == FolderPath.Length - 1)
- {
- FolderPath = FolderPath.Substring(0, FolderPath.Length - 1);
- }
- string tempStr = "";
- DirectoryInfo dinfo = new DirectoryInfo(FolderPath);
- if (dinfo.Exists)
- {
- shareName = dinfo.Name;
- if (!shareName.Contains("$"))
- {
- shareName = shareName + "$";
- }
- string CmdStr = "net share " + shareName + "=" + dinfo.FullName + " /grant:everyone,full /grant:guest,full /grant:administrator,full /remark:\"" + Remark + "\" ";
- NetworkConnection.StaticExecuteCmd("net share " + shareName + " /del ");
- tempStr = NetworkConnection.StaticExecuteCmd(CmdStr);
- tempStr = GetExecuteCmdMessage(tempStr);
- }
- else
- {
- tempStr = "你要共享的文件夹不存在!";
- }
- //参数 /grant 只在WIN2003(或以后)的系统上的net share才支持
- SetAccessControl(dinfo.FullName, AccessControlType.Allow);
- return tempStr.Replace("\r", "").Replace("\n", "");
- }
- catch(Exception ex) {
- return "共享失败:"+ex.Message;
- }
- }
- static string GetExecuteCmdMessage(string message)
- {
- try
- {
- return System.Text.RegularExpressions.Regex.Split(message, "&exit")[1];
- }
- catch { return message; }
- }
- /// <summary>
- /// 取消文件夹共享
- /// </summary>
- /// <param name="SharedName">共享名</param>
- /// <returns></returns>
- public static string CanceledFolderSharedComd(string SharedName)
- {
- string tempStr = "";
- string CmdStr = "net share " + SharedName + " /del ";
- tempStr = NetworkConnection.StaticExecuteCmd(CmdStr);
- tempStr = GetExecuteCmdMessage(tempStr);
-
- //参数 /grant 只在WIN2003(或以后)的系统上的net share才支持
- return tempStr.Replace("\r", "").Replace("\n", ""); ;
- }
- /// <summary>
- /// 共享文件夹
- /// </summary>
- public class SharedFolderInfo
- {
- public SharedFolderInfo() { }
- public SharedFolderInfo(string _sharedName, string _folderPath) {
- this.sharedName = _sharedName;
- this.folderPath = _folderPath;
- }
- string sharedName = "";
- /// <summary>
- /// 共享名
- /// </summary>
- public string SharedName
- {
- get { return sharedName; }
- set { sharedName = value; }
- }
- string folderPath = "";
- /// <summary>
- /// 文件夹路径
- /// </summary>
- public string FolderPath
- {
- get { return folderPath; }
- set { folderPath = value; }
- }
- }
- /// <summary>
- /// 检询文件夹是否已共享,如果已共享返回共享名,没有共享返回null
- /// </summary>
- /// <param name="folderPath">检询文件夹</param>
- /// <returns></returns>
- public static string QuerySharedFolder(string folderPath)
- {
- string shareName = "非共享目录";
- if (folderPath.IndexOf("\\\\") == 0)
- {
- shareName = folderPath;
- return shareName;
- }
- if (System.IO.Directory.Exists(folderPath))
- {
- try
- {
- List<SharedFolderInfo> folderList = GetLocalSharedFolderList();
- foreach (SharedFolderInfo fInfo in folderList)
- {
- if (LYFZ.WinAPI.CustomPublicMethod.GetDirectoryPath(fInfo.FolderPath).ToLower()
- .Equals(LYFZ.WinAPI.CustomPublicMethod.GetDirectoryPath(folderPath.ToLower())))
- {
- shareName = fInfo.SharedName;
- }
- }
- }
- catch
- {
- System.IO.DirectoryInfo dirinfo = new DirectoryInfo(folderPath);
- if (dirinfo.Name.Contains("$"))
- {
- shareName = dirinfo.Name;
- }
- else
- {
- shareName = dirinfo.Name + "$";
- }
- // dirinfo.Name;
- }
- }
- else {
- shareName = "此目录不存在";
- }
- return shareName;
- }
- /// <summary>
- /// 获取本机所有共享文件夹
- /// </summary>
- /// <returns></returns>
- public static List<SharedFolderInfo> GetLocalSharedFolderList()
- {
- List<SharedFolderInfo> folderList = new List<SharedFolderInfo>();
- System.Management.ManagementObjectSearcher searcher = new
- System.Management.ManagementObjectSearcher("select * from win32_share");
- foreach (System.Management.ManagementObject share in searcher.Get())
- {
- // tempShare += share["Name"].ToString() + "?" + share["Path"].ToString() + "|"; //名称
- folderList.Add(new SharedFolderInfo(share["Name"].ToString(), share["Path"].ToString()));
- }
- return folderList;
- }
- /// <summary>
- /// 添加共享权限
- /// </summary>
- /// <param name="FolderPath">文件夹路径</param>
- /// <param name="userName">要共享的用户名</param>
- /// <param name="fRights">权限值</param>
- public static void AddSharePermissions(string FolderPath, string userName, FileSystemRights fRights = FileSystemRights.FullControl)
- {
- DirectoryInfo dinfo = new DirectoryInfo(FolderPath);
- if (dinfo.Exists)
- {
- DirectorySecurity dirsecurity = dinfo.GetAccessControl();
- dirsecurity.AddAccessRule(new FileSystemAccessRule(userName, fRights, InheritanceFlags.ContainerInherit, PropagationFlags.InheritOnly, AccessControlType.Allow));
- dinfo.SetAccessControl(dirsecurity);
- }
- }
- /// <summary>
- /// 设置共享权限
- /// </summary>
- /// <param name="FolderPath">文件夹路径</param>
- /// <param name="userName">要共享的用户名</param>
- /// <param name="fRights">权限值</param>
- public static void SetSharePermissions(string FolderPath, string userName, FileSystemRights fRights = FileSystemRights.FullControl)
- {
- DirectoryInfo dinfo = new DirectoryInfo(FolderPath);
- if (dinfo.Exists)
- {
- DirectorySecurity dirsecurity = dinfo.GetAccessControl();
- dirsecurity.SetAccessRule(new FileSystemAccessRule(userName, fRights, InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow));
- dinfo.SetAccessControl(dirsecurity);
- }
- }
- /// <summary>
- /// 设置目录所有用户权限
- /// 设置为所有用户的完全全权
- /// </summary>
- /// <param name="path">目录</param>
- /// <param name="atype">权限,是允许还是绝拒</param>
- public static void SetAccessControl(string path, AccessControlType atype)
- {
- string dirPath = path;
- DirectoryInfo dinfo = new DirectoryInfo(dirPath);
- FileSystemRights fRights = FileSystemRights.FullControl;
- System.Security.AccessControl.DirectorySecurity acc = dinfo.GetAccessControl();
- acc.AddAccessRule(new System.Security.AccessControl.FileSystemAccessRule("Administrators", fRights, System.Security.AccessControl.InheritanceFlags.ObjectInherit, System.Security.AccessControl.PropagationFlags.None, AccessControlType.Allow));
- acc.AddAccessRule(new System.Security.AccessControl.FileSystemAccessRule("Administrator", fRights, System.Security.AccessControl.InheritanceFlags.ObjectInherit, System.Security.AccessControl.PropagationFlags.None, AccessControlType.Allow));
- acc.AddAccessRule(new System.Security.AccessControl.FileSystemAccessRule("Everyone", fRights, System.Security.AccessControl.InheritanceFlags.ObjectInherit, System.Security.AccessControl.PropagationFlags.None, AccessControlType.Allow));
- acc.AddAccessRule(new System.Security.AccessControl.FileSystemAccessRule("Users", fRights, System.Security.AccessControl.InheritanceFlags.ObjectInherit, System.Security.AccessControl.PropagationFlags.None, AccessControlType.Allow));
- acc.AddAccessRule(new System.Security.AccessControl.FileSystemAccessRule("Guests", fRights, System.Security.AccessControl.InheritanceFlags.ObjectInherit, System.Security.AccessControl.PropagationFlags.None, AccessControlType.Allow));
- acc.AddAccessRule(new System.Security.AccessControl.FileSystemAccessRule("Guest", fRights, System.Security.AccessControl.InheritanceFlags.ObjectInherit, System.Security.AccessControl.PropagationFlags.None, AccessControlType.Allow));
- dinfo.SetAccessControl(acc);
- AuthorizationRuleCollection ruleCollection = acc.GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount));
- foreach (FileSystemAccessRule rule in ruleCollection)
- {
- System.Security.AccessControl.FileSystemAccessRule ar = new System.Security.AccessControl.FileSystemAccessRule(rule.IdentityReference, fRights, InheritanceFlags.ObjectInherit, PropagationFlags.None, atype);
- acc.ResetAccessRule(ar);
- dinfo.SetAccessControl(acc);
- }
- }
- /// <summary>
- /// 设置文件夹共享
- /// </summary>
- /// <param name="FolderPath">文件夹路径</param>
- /// <param name="ShareName">共享名</param>
- /// <param name="Description">共享注释</param>
- /// <returns></returns>
- public static int SetFolderShared(string FolderPath, string ShareName, string Description = "编程方式开启共享文件夹")
- {
- try
- {
- ManagementClass managementClass = new ManagementClass("Win32_Share");
- //对于IN和OUT参数创建ManagementBaseObjects
- ManagementBaseObject inParams = managementClass.GetMethodParameters("Create");
- ManagementBaseObject outParams;
- // 设置输入参数
- inParams["Description"] = Description;
- inParams["Name"] = ShareName;
- inParams["Path"] = FolderPath;
- inParams["Type"] = 0x0; // Disk Drive
- outParams = managementClass.InvokeMethod("Create", inParams, null);
- // 请检查是否在方法调用成功
- if ((uint)(outParams.Properties["ReturnValue"].Value) != 0)
- {
- throw new Exception("无法共享目录。");
- }
- }
- catch
- {
- return -1;
- }
- return 0;
- }
- /// <summary>
- /// 取消文件夹共享
- /// </summary>
- /// <param name="ShareName">文件夹的共享名</param>
- /// <returns></returns>
- public int CancelShareNetFolder(string ShareName)
- {
- try
- {
- SelectQuery selectQuery = new SelectQuery("Select * from Win32_Share Where Name = '" + ShareName + "'");
- ManagementObjectSearcher searcher = new ManagementObjectSearcher(selectQuery);
- foreach (ManagementObject mo in searcher.Get())
- {
- mo.InvokeMethod("Delete", null, null);
- }
- }
- catch
- {
- return -1;
- }
- return 0;
- }
- }
- }
|