检查以下两段代码:
System.Security.AccessControl.DirectorySecurity dsec = System.IO.Directory.GetAccessControl(str);
System.Security.Principal.NTAccount group= new System.Security.Principal.NTAccount("DOMAIN","USERGROUP");
System.Security.AccessControl.FileSystemAccessRule myrule = new System.Security.AccessControl.FileSystemAccessRule(group,System.Security.AccessControl.FileSystemRights.FullControl, System.Security.AccessControl.AccessControlType.Allow);
dsec.SetAccessRule(myrule);
System.IO.Directory.SetAccessControl(str,dsec);
和
System.Security.AccessControl.FileSecurity fsec = System.IO.File.GetAccessControl(file);
System.Security.Principal.NTAccount group= new System.Security.Principal.NTAccount("DOMAIN","USERGROUP");
System.Security.AccessControl.FileSystemAccessRule myrule = new System.Security.AccessControl.FileSystemAccessRule(group,System.Security.AccessControl.FileSystemRights.FullControl, System.Security.AccessControl.AccessControlType.Allow);
fsec.SetAccessRule(myrule);
System.IO.File.SetAccessControl(file,fsec);
人们会期望他们两者做同样的事情,只有一个到一个目录,一个到一个文件。并且,在某些方面,他们这样做。在这两种情况下,有问题的文件系统对象都会更改,以使DOMAIN \ USERGROUP具有完全控制的有效权限。
然而,奇怪的是,当您右键单击文件并查看安全性时,您会看到:
当您右键单击文件夹并查看安全性时,您会看到:
如果我转到Advanced-> Effective Permissions-> Select(DOMAIN \ USERGROUP),则表明该组文件夹的有效权限为完全控制(所有框都被选中,而不是只是完整的控制盒。这甚至更奇怪了。
我的问题是,为什么几乎相同的实现的效果有差异,有没有人知道如何复制应用权限到文件的效果?
答案 0 :(得分:11)
区别在于传播标志与目录安全性的相关性。
var accessRule = new FileSystemAccessRule(
identity: group,
fileSystemRights: FileSystemRights.FullControl,
type: AccessControlType.Allow,
inheritanceFlags: InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit,
propagationFlags: PropagationFlags.None);
请注意inheritanceFlags
设置。如果未指定,则默认为none,将其归类为“special”。
答案 1 :(得分:0)
您可以尝试使用Logan来添加文件的权限
如果有帮助,请尝试此代码
public static bool CheckReadWriteAccces(string filePath, System.Security.AccessControl.FileSystemRights fileSystemRights)
{
FileInfo fileInfo = new FileInfo(filePath);
string str = System.Security.Principal.WindowsIdentity.GetCurrent().Name.ToUpper();
foreach (System.Security.AccessControl.FileSystemAccessRule rule in fileInfo.GetAccessControl().GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount)))
{
if (str == rule.IdentityReference.Value.ToUpper())
return ((rule.AccessControlType == System.Security.AccessControl.AccessControlType.Allow) && (fileSystemRights == (rule.FileSystemRights & fileSystemRights)));
}
return false;
}
/// <summary>
/// Make a file writteble
/// </summary>
/// <param name="path">File name to change</param>
public static void MakeWritable(string path)
{
if (!File.Exists(path))
return;
File.SetAttributes(path, File.GetAttributes(path) & ~FileAttributes.ReadOnly);
}