C# 文件夹共享和权限设置

li_east_fai 2014-06-04 03:41:39
我想实现:文件夹共享后 给文件夹添加用户、并给他添加权限 查看或者更改 有谁做过啊 能给我发个源代码吗?网上好多帖子页看了 有点晕。 我用的是 C# web
...全文
384 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
li_east_fai 2014-06-05
  • 打赏
  • 举报
回复
非常感谢 。
呱呱_瓜瓜 2014-06-04
  • 打赏
  • 举报
回复
以上就是全部代码了
呱呱_瓜瓜 2014-06-04
  • 打赏
  • 举报
回复

public enum MethodStatus : uint
    {
        Success = 0, 	//Success
        AccessDenied = 2, 	//Access denied
        UnknownFailure = 8, 	//Unknown failure
        InvalidName = 9, 	//Invalid name
        InvalidLevel = 10, 	//Invalid level
        InvalidParameter = 21, 	//Invalid parameter
        DuplicateShare = 22, 	//Duplicate share
        RedirectedPath = 23, 	//Redirected path
        UnknownDevice = 24, 	//Unknown device or directory
        NetNameNotFound = 25 	//Net name not found
    }

    public enum ShareType : uint
    {
        DiskDrive = 0x0, 	//Disk Drive
        PrintQueue = 0x1, 	//Print Queue
        Device = 0x2, 	//Device
        IPC = 0x3, 	//IPC
        DiskDriveAdmin = 0x80000000, 	//Disk Drive Admin
        PrintQueueAdmin = 0x80000001, 	//Print Queue Admin
        DeviceAdmin = 0x80000002, 	//Device Admin
        IpcAdmin = 0x80000003 	//IPC Admin
    }
    public enum AccessPrivileges : uint
    {
        /// <summary>
        /// 列出文件夹/读取数据
        /// </summary>
        FILE_READ_DATA = 0x00000001,
        /// <summary>
        /// 创建文件/写入数据
        /// </summary>
        FILE_WRITE_DATA = 0x00000002,
        /// <summary>
        /// 创建文件夹/附加数据
        /// </summary>
        FILE_APPEND_DATA = 0x00000004,
        /// <summary>
        /// 读取扩展属性
        /// </summary>
        FILE_READ_EA = 0x00000008,
        /// <summary>
        /// 写入扩展属性
        /// </summary>
        FILE_WRITE_EA = 0x00000010,
        /// <summary>
        /// 遍历文件夹/执行文件
        /// </summary>
        FILE_EXECUTE = 0x00000020,
        /// <summary>
        /// 删除子文件夹及文件
        /// </summary>
        FILE_DELETE_CHILD = 0x00000040,
        /// <summary>
        /// 读取属性
        /// </summary>
        FILE_READ_ATTRIBUTES = 0x00000080,
        /// <summary>
        /// 写入属性
        /// </summary>
        FILE_WRITE_ATTRIBUTES = 0x00000100,
        /// <summary>
        /// 删除
        /// </summary>
        DELETE = 0x00010000,
        /// <summary>
        /// 读取权限
        /// </summary>
        READ_CONTROL = 0x00020000,
        /// <summary>
        /// 更改权限
        /// </summary>
        WRITE_DAC = 0x00040000,
        /// <summary>
        /// 取得所有权
        /// </summary>
        WRITE_OWNER = 0x00080000,
        /// <summary>
        /// 无任何权限
        /// </summary>
        SYNCHRONIZE = 0x00100000,
        /// <summary>
        /// 所有权限
        /// </summary>
        Full = AccessPrivileges.DELETE | AccessPrivileges.FILE_APPEND_DATA | AccessPrivileges.FILE_DELETE_CHILD | AccessPrivileges.FILE_EXECUTE
        | AccessPrivileges.FILE_READ_ATTRIBUTES | AccessPrivileges.FILE_READ_DATA | AccessPrivileges.FILE_READ_EA | AccessPrivileges.FILE_WRITE_ATTRIBUTES
        | AccessPrivileges.FILE_WRITE_DATA | AccessPrivileges.FILE_WRITE_EA | AccessPrivileges.READ_CONTROL | AccessPrivileges.SYNCHRONIZE
        | AccessPrivileges.WRITE_DAC | AccessPrivileges.WRITE_OWNER
    }

    enum AceFlags : uint
    {
        NonInheritAce = 0,
        ObjectInheritAce = 1,
        ContainerInheritAce = 2,
        NoPropagateInheritAce = 4,
        InheritOnlyAce = 8,
        InheritedAce = 16
    }

    [Flags]
    enum AceType : uint
    {
        AccessAllowed = 0,
        AccessDenied = 1,
        Audit = 2
    }
 public class UserPrivileges
    {
        public string UserAccount { get; set; }
        public List<String> Privileges { get; set; }
        public string Domain { get; set; }
        public object ObjPrivileges
        {
            get;
            set;
        }
    }
呱呱_瓜瓜 2014-06-04
  • 打赏
  • 举报
回复
以前做过类似的 也是web设置文件夹共享权限的, 仅供参考

public class ShareHelper
    {
        static string[] filedesc = {"FILE_READ_DATA", "FILE_WRITE_DATA", "FILE_APPEND_DATA", "FILE_READ_EA",

"FILE_WRITE_EA", "FILE_EXECUTE", "FILE_DELETE_CHILD", "FILE_READ_ATTRIBUTES",

"FILE_WRITE_ATTRIBUTES", " ", " ", " ",

" ", " ", " ", " ",

"DELETE ", "READ_CONTROL", "WRITE_DAC", "WRITE_OWNER",

"SYNCHRONIZE ", " ", " "," ",

"ACCESS_SYSTEM_SECURITY", "MAXIMUM_ALLOWED", " "," ",

"GENERIC_ALL", "GENERIC_EXECUTE", "GENERIC_WRITE","GENERIC_READ"};

        private ManagementObject mWinShareObject;

        private ShareHelper(ManagementObject obj) { mWinShareObject = obj; }

        #region Wrap Win32_Share properties
        public uint AccessMask
        {
            get { return Convert.ToUInt32(mWinShareObject["AccessMask"]); }
        }

        public bool AllowMaximum
        {
            get { return Convert.ToBoolean(mWinShareObject["AllowMaximum"]); }
        }

        public string Caption
        {
            get { return Convert.ToString(mWinShareObject["Caption"]); }
        }

        public string Description
        {
            get { return Convert.ToString(mWinShareObject["Description"]); }
        }

        public DateTime InstallDate
        {
            get { return Convert.ToDateTime(mWinShareObject["InstallDate"]); }
        }

        public uint MaximumAllowed
        {
            get { return Convert.ToUInt32(mWinShareObject["MaximumAllowed"]); }
        }

        public string Name
        {
            get { return Convert.ToString(mWinShareObject["Name"]); }
        }

        public string Path
        {
            get { return Convert.ToString(mWinShareObject["Path"]); }
        }

        public string Status
        {
            get { return Convert.ToString(mWinShareObject["Status"]); }
        }

        public ShareType Type
        {
            get { return (ShareType)Convert.ToUInt32(mWinShareObject["Type"]); }
        }
        #endregion

        #region Wrap Methods
        /// <summary>
        /// 删除共享
        /// </summary>
        /// <returns></returns>
        public MethodStatus Delete()
        {
            object result = mWinShareObject.InvokeMethod("Delete", new object[] { });
            uint r = Convert.ToUInt32(result);

            return (MethodStatus)r;
        }

        /// <summary>
        /// 创建共享
        /// </summary>
        /// <param name="path"></param>
        /// <param name="name"></param>
        /// <param name="type"></param>
        /// <param name="maximumAllowed"></param>
        /// <param name="description"></param>
        /// <param name="password"></param>
        /// <returns></returns>
        public static MethodStatus Create(string path, string name, ShareType type, uint maximumAllowed, string description, string password)
        {
            ManagementClass mc = new ManagementClass("Win32_Share");
            object[] parameters = new object[] { path, name, (uint)type, maximumAllowed, description, password, null };

            object result = mc.InvokeMethod("Create", parameters);
            uint r = Convert.ToUInt32(result);

            return (MethodStatus)r;
        }

        #endregion

        public static IList<ShareHelper> GetAllShares()
        {
            IList<ShareHelper> result = new List<ShareHelper>();
            ManagementClass mc = new ManagementClass("Win32_Share");
            ManagementObjectCollection moc = mc.GetInstances();

            foreach (ManagementObject mo in moc)
            {
                ShareHelper share = new ShareHelper(mo);
                result.Add(share);
            }

            return result;
        }

        public static ShareHelper GetNamedShare(string name)
        {
            // Not a very efficient implementation obviously, but heck... This is sample code. ;)
            IList<ShareHelper> shares = GetAllShares();

            foreach (ShareHelper s in shares)
                if (s.Name == name)
                    return s;

            return null;
        }

        public static MethodStatus SetPrivileges(string path, List<UserPrivileges> listPrivilege)
        {
            ManagementObject mo = new ManagementObject(string.Format("Win32_LogicalFileSecuritySetting.Path='{0}'", path));
            ManagementBaseObject outParams = mo.InvokeMethod("GetSecurityDescriptor", null, null);

            if ((uint)outParams.Properties["ReturnValue"].Value != 0)
            {
                return MethodStatus.NetNameNotFound;
            }
            ManagementBaseObject Descriptor = (ManagementBaseObject)outParams.Properties["Descriptor"].Value;

            List<ManagementBaseObject> newDacl = new List<ManagementBaseObject>();

            foreach (UserPrivileges up in listPrivilege)
            {

                ManagementClass trustee = new ManagementClass("win32_trustee");
                trustee.Properties["Name"].Value = up.UserAccount;
                trustee.Properties["Domain"].Value = null;


                ManagementClass ace = new ManagementClass("win32_ace");
                ace.Properties["AccessMask"].Value = up.ObjPrivileges; //AccessPrivileges.FileReadData | AccessPrivileges.FileReadAttributes | AccessPrivileges.FileReadEA
                //| AccessPrivileges.ReadControl | AccessPrivileges.FileExecute;
                ace.Properties["AceFlags"].Value = AceFlags.ObjectInheritAce | AceFlags.ContainerInheritAce | AceFlags.NoPropagateInheritAce;
                ace.Properties["AceType"].Value = AceType.AccessAllowed;
                ace.Properties["Trustee"].Value = trustee;
                newDacl.Add(ace);
            }
            ManagementBaseObject inParams = mo.GetMethodParameters("SetSecurityDescriptor");
            Descriptor.Properties["Dacl"].Value = newDacl.ToArray();


            inParams["Descriptor"] = Descriptor;
            ManagementBaseObject ret = mo.InvokeMethod("SetSecurityDescriptor", inParams, null);

            uint returnValue = (uint)ret.Properties["ReturnValue"].Value;
            return (MethodStatus)returnValue;
        }

        public static List<UserPrivileges> GetPrivileges(string path)
        {
            List<UserPrivileges> list = new List<UserPrivileges>();
            ManagementPath mPath = new ManagementPath();
            mPath.Server = ".";
            mPath.NamespacePath = @"root\cimv2";
            mPath.RelativePath = @"Win32_LogicalFileSecuritySetting.Path='" + path + "'"; // using tmp as folder name

            ManagementObject lfs = new ManagementObject(mPath);

            ManagementBaseObject outParams = lfs.InvokeMethod("GetSecurityDescriptor", null, null);
            if (((uint)(outParams.Properties["ReturnValue"].Value)) == 0)
            {

                ManagementBaseObject Descriptor = ((ManagementBaseObject)(outParams.Properties["Descriptor"].Value));

                ManagementBaseObject[] DaclObject = ((ManagementBaseObject[])(Descriptor.Properties["Dacl"].Value));

                foreach (ManagementBaseObject mbo in DaclObject)
                {
                    UserPrivileges up = new UserPrivileges();
                    ManagementBaseObject Trustee = ((ManagementBaseObject)(mbo["Trustee"]));
                    up.Domain = Trustee.Properties["Domain"].Value == null ? "" : Trustee.Properties["Domain"].Value.ToString();
                    up.UserAccount = Trustee.Properties["Name"].Value.ToString();


                    UInt32 mask = (UInt32)mbo["AccessMask"];

                    int[] m = { (int)mask };

                    BitArray ba = new BitArray(m);

                    int i = 0;

                    IEnumerator baEnum = ba.GetEnumerator();
                    up.Privileges = new List<string>();
                    while (baEnum.MoveNext())
                    {

                        if ((bool)baEnum.Current)

                            up.Privileges.Add(filedesc[i].Trim());

                        i++;

                    }
                    list.Add(up);
                }



            }

            List<UserPrivileges> listNew = new List<UserPrivileges>();
            foreach (var up in list)
            {
                UserPrivileges upNew=listNew.Where(x => x.UserAccount == up.UserAccount).FirstOrDefault();
                if (upNew!=null)
                {
                    upNew.Privileges.AddRange(up.Privileges);
                    upNew.Privileges=upNew.Privileges.Distinct().ToList();
                }
                else
                {
                    listNew.Add(up);
                }
            }
            return listNew; ;
        }
    }
1. 实现了对文件、文件夹的复制、粘贴、剪切、删除功能; 2.实现了对文件夹的双击打开、对多种类型的文件的双击打开查看功能; 3.实现了主窗体左边驱动器树形视图(显示各驱动器及内部各文件夹列表)、右边文件列表视图(显示当前文件夹下所包含的文件和下一级文件夹)的显示,以及两者的联动显示。左右窗体间设有分隔条,拖动可改变左右窗体大小。文件列表视图中包含了名称、修改日期、类型、大小四个字段; 4.实现了在主窗体右边文件列表视图进行右键时弹出的上下文菜单,该菜单会根据当前是否选中某一文件项而将菜单项加以调整。例如,右键时,若当前没有选中文件项,则可以显示出“查看”、“新建文件”、“新建文件夹”等菜单项;但是若当前选中了某一文件项,则可以显示出“复制”、“剪切”、“重命名”等菜单项; 5. 实现了主窗体地址栏、状态栏的显示和隐藏可以由用户控制; 6. 实现了文件、文件夹属性的查看; 7.实现了对当前计算机的进程、线程简单管理功能; 8. 实现了在当前路径下“返回上一级目录”的功能; 9. 实现了在主窗体上方地址栏直接输入文件路径,然后直接回车查看该路径下的文件列表的功能; 10. 实现了对当前计算机文件、文件夹的监控功能。可定制化程度较高,既可以实现对特定路径的监控,也可以实现对具体磁盘驱动器的监控,甚至是全盘监控。监控过程中的日志均高亮显示在监控窗口中,也支持将日志保存到特定路径; 11. 将重命名功能加以改进,实现了类似windows的”选定->再单击->出现重命名状态->进行重命名“功能; 12. 实现了对当前计算机的文件/文件夹权限管理功能。权限管理包括:完全控制、修改、读取和执行、列出文件夹内容、读取、写入共6个模块; 13.实现了”最近访问“的功能,用户可以在该功能区找到最近使用的文件,并双击打开查看; 14.实现了新建文件功能,用户可以根据自己的需要在弹出的窗口中输入文件的全名(包括“文件名+拓展名”),从而新建各种类型的文件; 15.实现了用户在主窗体右边文件列表中的历史访问路径的前进、后退功能; 16.实现了对文件/文件夹的快速搜索功能(基于多线程)。使用时先在地址栏输入特定文件路径(或者直接进入特定文件路径),然后直接在主窗体上方搜索框中输入你所要搜索的文件名或关键字,最后回车即可在当前文件列表区中显示出搜索到的结果,搜索到的文件/文件夹支持直接双击查看或编辑。实测时,比windows自带的文件/文件夹搜索功能快一点。 ....... 支持开源精神,需要详细了解这个Demo的朋友可以移步: https://github.com/Yuziquan/MyFileManager 欢迎star~~~

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧