c# - DirectorySecurity establece permisos especiales, mientras que FileSecurity no
.net permissions (2)
Examine los siguientes dos bloques de código:
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);
y
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);
Uno esperaría que hicieran exactamente lo mismo, solo uno para un directorio y uno para un archivo. Y, de alguna manera, lo hacen. En ambos casos, el objeto del sistema de archivos en cuestión cambia de manera que DOMAIN / USERGROUP tenga los permisos efectivos de control total.
Sin embargo, la parte extraña es que cuando haces clic derecho en un archivo y ves la seguridad, ves esto:
y cuando haces clic derecho en una carpeta y ves la seguridad, ves esto:
Si luego voy a Avanzado-> Permisos efectivos-> Seleccionar (DOMINIO / USERGROUP), se muestra que los permisos efectivos para la carpeta, para ese grupo, son Control total (se marcan todos los casilleros, no solo el cuadro de control total) . Eso sería aún más extraño).
Mi pregunta es, ¿por qué hay una diferencia en el efecto de una implementación casi idéntica y alguien sabe cómo replicar el efecto de aplicar permisos a los archivos?
Aquí hay algo que puedes probar con Logan para agregar permisos a un archivo
prueba este código si ayuda
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);
}
La diferencia es la relevancia de los indicadores de propagación para la seguridad del directorio.
var accessRule = new FileSystemAccessRule(
identity: group,
fileSystemRights: FileSystemRights.FullControl,
type: AccessControlType.Allow,
inheritanceFlags: InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit,
propagationFlags: PropagationFlags.None);
Tenga en cuenta la configuración de inheritanceFlags
. Si no se especifica, el valor predeterminado es none, que se clasifica como "especial".