none
C#修改文件夹权限 RRS feed

  • 问题

  • 您好,我想使用C#实现给文件夹添加用户并设置权限代码如下

     protected void Button1_Click(object sender, EventArgs e)

        {

            DirectoryInfo dir = new DirectoryInfo(@"K:\txt");

            DirectorySecurity ds = dir.GetAccessControl(AccessControlSections.All);

            //继承设置

            bool ok;

            InheritanceFlags iflag = new InheritanceFlags();

            iflag = InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit;

            FileSystemAccessRule arules = new FileSystemAccessRule("Jiang", FileSystemRights.FullControl, iflag, PropagationFlags.None, AccessControlType.Allow);

            ds.ModifyAccessRule(AccessControlModification.Add, arules, out ok);

            dir.SetAccessControl(ds);

            if (ok)

                Response.Write("修改成功");

            else

                Response.Write("修改失败");

     

        }

    运行时出现如下错误:System.Security.Principal.IdentityNotMappedException: 未能转换部分或所有标识引用。请问这是为什么呢

    2011年6月18日 14:15

全部回复

  • 你好,可以尝试添加机器名或域名,比如

    new FileSystemAccessRule(@"YourDomain\Jiang", FileSystemRights.FullControl, iflag, PropagationFlags.None, AccessControlType.Allow);

    2011年6月21日 1:57
    版主
  •  我已经把代码改成

    FileSystemAccessRule arules = new FileSystemAccessRule(@"PC-20100513GUNC\Jiang", FileSystemRights.FullControl, iflag, PropagationFlags.None, AccessControlType.Allow);

    还是一样的错误[IdentityNotMappedException: 未能转换部分或所有标识引用。]
      System.Security.Principal.NTAccount.Translate(IdentityReferenceCollection sourceAccounts, Type targetType, Boolean forceSuccess) +2058424
      System.Security.Principal.NTAccount.Translate(Type targetType) +100
      System.Security.AccessControl.CommonObjectSecurity.ModifyAccess(AccessControlModification modification, AccessRule rule, Boolean& modified) +105
      System.Security.AccessControl.ObjectSecurity.ModifyAccessRule(AccessControlModification modification, AccessRule rule, Boolean& modified) +118
      testimg.Button1_Click(Object sender, EventArgs e) in k:\sdfsdf\Solution1\Web\testimg.aspx.cs:48
      System.Web.UI.WebControls.Button.OnClick(EventArgs e) +111
      System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +110
      System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
      System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
      System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +36
      System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1565
    2011年6月21日 16:19
  • 有其他的办法吗,谢谢了!!!!
    2011年6月24日 9:52
  • 我刚才也遇到这个问题了,只有两个string参数有可能出问题,我用的是win7,前面的路径,没有加计机名,直接用D:\myFoder,在程序被中断的时候,下面的窗口里可以看到这个路径是被正确读取到DirectoryInfo里的,root和parent都正确,所以这个变量不可能有问题

    我开始用的用户名是文件夹的属性窗口安全标签里的“组或用户名”里的小括号中的,就是像这样子:@"Domain/Users",我把这个参数改成了:Users,程序就可以正确执行了

     

    不过我现在修改后的权限,不是写在属性窗口的安全标签里,我加入WriteData权限,这个权限是设置在特殊里,显示为:创建文件/写入数据,<不是继承的>,应用于只有该文件夹,和平时直接在安全标签里设置写入权限有点不同。


    在哪里摔倒就在哪里自己爬起来
    2011年7月20日 7:49
  • 补充一下那天回复的最后一句话,后来不记的补充完了

     

    属性的安全标签里那几项权限,是特殊设置里的多个权限组合,比如写入权限,就是以下4个的组合:

    创建文件/写入数据

    创建文件夹/附加数据

    写入属性

    写入扩展属性

     

    如果要设置一个和安全标签里一样子的写入权限,就要设置上面4个权限,而且要设置应用于此文件夹、子文件夹和文件,像这样子:

    AddAccessRule(new FileSystemAccessRule(Account, Rights, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, ControlType));

     

    在这里可以找到每一种权限的定义:http://msdn.microsoft.com/zh-cn/library/system.security.accesscontrol.filesystemrights

     

    还有设置应用于时用到的InheritanceFlags Enumeration:

    http://msdn.microsoft.com/en-us/library/system.security.accesscontrol.inheritanceflags(v=VS.100).aspx


    在哪里摔倒就在哪里自己爬起来
    2011年7月23日 2:17