询问者
C#修改文件夹权限

问题
-
您好,我想使用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: 未能转换部分或所有标识引用。请问这是为什么呢
全部回复
-
我已经把代码改成
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
-
我刚才也遇到这个问题了,只有两个string参数有可能出问题,我用的是win7,前面的路径,没有加计机名,直接用D:\myFoder,在程序被中断的时候,下面的窗口里可以看到这个路径是被正确读取到DirectoryInfo里的,root和parent都正确,所以这个变量不可能有问题
我开始用的用户名是文件夹的属性窗口安全标签里的“组或用户名”里的小括号中的,就是像这样子:@"Domain/Users",我把这个参数改成了:Users,程序就可以正确执行了
不过我现在修改后的权限,不是写在属性窗口的安全标签里,我加入WriteData权限,这个权限是设置在特殊里,显示为:创建文件/写入数据,<不是继承的>,应用于只有该文件夹,和平时直接在安全标签里设置写入权限有点不同。
在哪里摔倒就在哪里自己爬起来 -
补充一下那天回复的最后一句话,后来不记的补充完了
属性的安全标签里那几项权限,是特殊设置里的多个权限组合,比如写入权限,就是以下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
在哪里摔倒就在哪里自己爬起来