2010-08-17 15 views
9

Je reçois de ce code ci-dessous un double FileSystemAccessRule:GetAccessRules en double, FileSystemAccessRule entrées de

C:\inetpub\wwwroot\AspInfo\Account 
BUILTIN\IIS_IUSRS : Allow : ReadAndExecute, Synchronize 
BUILTIN\IIS_IUSRS : Allow : -1610612736 
NT SERVICE\TrustedInstaller : Allow : FullControl 
NT SERVICE\TrustedInstaller : Allow : 268435456 

et je ne peux pas travailler ce ou pourquoi il est.

Et les permissions étant affichés ne correspondent pas à ce que je peux voir les propriétés de FileManager de fichier. Par exemple, comment puis-je trouver l'autorisation "List Folder Contents" de cette itération ou similaire. Si quelqu'un connaît un exemple dans les docs .NET, il serait utile.

protected void directoryInfo() 
{ 
    var di = new DirectoryInfo(Server.MapPath("/")); 
    foreach (DirectoryInfo dir in di.GetDirectories()) 
    { 
    Response.Write(dir.FullName + "<br/>"); 
    DirectorySecurity ds = dir.GetAccessControl(); 
    foreach (FileSystemAccessRule fsar in ds.GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount))) 
    { 
     string userName = fsar.IdentityReference.Value; 
     string userRights = fsar.FileSystemRights.ToString(); 
     string userAccessType = fsar.AccessControlType.ToString(); 
     Response.Write(userName + " : " + userAccessType + " : " + userRights + "<br/>"); 
    } 
    } 
} 

Répondre

13

Vous obtiendrez des entrées de règles distinctes pour les règles héritées et pour les règles définies explicitement sur ce dossier. Il existe également une différence en fonction des paramètres de propagation de chaque règle. Par exemple, vous pouvez avoir un ensemble d'autorisations configurées pour se propager aux sous-dossiers et un ensemble différent pour les fichiers dans le dossier. Votre code obtient également les règles d'audit (SACL) sur le dossier où vous semblez juste vouloir les autorisations d'accès (DACL).

Essayez ceci:

protected void directoryInfo() 
{ 
    var di = new DirectoryInfo(Server.MapPath("/")); 
    foreach (DirectoryInfo dir in di.GetDirectories()) 
    { 
    Response.Write(dir.FullName + "<br/>"); 
    DirectorySecurity ds = dir.GetAccessControl(AccessControlSections.Access); 
    foreach (FileSystemAccessRule fsar in ds.GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount))) 
    { 
     string userName = fsar.IdentityReference.Value; 
     string userRights = fsar.FileSystemRights.ToString(); 
     string userAccessType = fsar.AccessControlType.ToString(); 
     string ruleSource = fsar.IsInherited ? "Inherited" : "Explicit"; 
     string rulePropagation = fsar.PropagationFlags.ToString(); 
     string ruleInheritance = fsar.InheritanceFlags.ToString(); 
     Response.Write(userName + " : " + userAccessType + " : " + userRights + " : " + ruleSource + " : " + rulePropagation + " : " + ruleInheritance + "<br/>"); 
    } 
    } 
} 

L'autorisation ReadAndExecute vous voyez comprend l'autorisation "Liste Contenu du dossier". Vous pouvez vérifier les autorisations individuelles en utilisant l'indicateur approprié dans l'énumération FileSystemRights. Par exemple:

if (fsar.FileSystemRights && FileSystemRights.ListDirectory) 
    Console.WriteLine("Has List Directory permission"); 
+0

L'évaluation '' utilisation de if' FileSystemRights' est pas autorisée. – Thomas

+0

Doit pouvoir simplement vérifier 'if (FileSystemRights.ListDirectory) {...}'. https://msdn.microsoft.com/en-us/library/system.security.accesscontrol.filesystemrights(v=vs.110).aspx Vous ne devriez pas avoir à voir si vous avez 'FileSystemRights' sur un répertoire donné - si vous êtes dans la boucle, vous avez des répertoires. Si vous avez des répertoires, vous avez les propriétés 'FileSystemAccessRule'. Si vous êtes dans la boucle des propriétés 'FileSystemAccessRule', vous aurez des propriétés' FileSystemRights', garanties. – vapcguy

+0

@vapcguy Comment cela exclut-il les éléments FileSystemAuditRule? – Chalky