2010-02-16 6 views
7

J'ai remarqué que si vous modifiez les paramètres de sécurité pour un répertoire particulier, vous pouvez rendre ce dossier non plus "navigable" dans Windows. En particulier, la modification de l'autorisation "Lire" pour les administrateurs à "Refuser" rendra ce dossier inaccessible.Lire Autorisations à un répertoire en C#

La question que j'ai maintenant, est comment puis-je comprendre cela dans le code? Je me suivant se rapproche, mais il est toujours pas droit:

/// <summary> 
/// Takes in a directory and determines if the current user has read access to it (doesn't work for network drives) 
/// THIS IS VERY HACKY 
/// </summary> 
/// <param name="dInfo">directoryInfo object to the directory to examine</param> 
/// <returns>true if read access is available, false otherwise</returns> 
public static bool IsDirectoryReadable(DirectoryInfo dInfo) 
{ 
    try 
    { 
     System.Security.AccessControl.DirectorySecurity dirSec = dInfo.GetAccessControl(); 
     System.Security.Principal.WindowsIdentity self = System.Security.Principal.WindowsIdentity.GetCurrent(); 
     System.Security.Principal.WindowsPrincipal selfGroup = new System.Security.Principal.WindowsPrincipal(self); 
     // Go through each access rule found for the directory 
     foreach (System.Security.AccessControl.FileSystemAccessRule ar in dirSec.GetAccessRules(true, true, typeof(System.Security.Principal.SecurityIdentifier))) 
     { 
      if (selfGroup.IsInRole((System.Security.Principal.SecurityIdentifier)ar.IdentityReference)) 
      { 
       // See if the Read right is included 
       if ((ar.FileSystemRights & System.Security.AccessControl.FileSystemRights.Read) == System.Security.AccessControl.FileSystemRights.Read) 
       { 
        if (ar.AccessControlType == System.Security.AccessControl.AccessControlType.Allow) 
        { 
         // If all of the above are true, we do have read access to this directory 
         return true; 
        } 
        else 
        { 
         return false; 
        } 
       } 
      } 
     } 
     // If we didn't find anything 
     return false; 
    } 
    catch 
    { 
     // If anything goes wrong, assume false 
     return false; 
    } 
} 

Je suis étroite avec ce qui précède, mais je manque encore quelque chose d'énorme. Si je fais un clic droit sur un dossier pour définir les permissions, je vois (dans mon exemple) 3 groupes ou noms d'utilisateurs: "Administrators, myUserName et SYSTEM". Si je mets le "Read" à Deny pour "Administrators" ou "myUserName" je ne peux plus parcourir le répertoire. Si je ne mets que "System" à "Deny", je peux toujours le parcourir.

Il semble y avoir une sorte de hiérarchie d'autorisations implicite, où myUserName ou Administrator remplace le groupe/utilisateur SYSTEM.

Le code ci-dessus recherche le premier Autoriser pour "Lire" il trouve pour mon identité d'utilisateur et renvoie true. Je pourrais aussi écrire du code qui cherche le premier "Deny" pour Read et retourne false.

Je peux définir un dossier à lire - "Refuser" pour SYSTEM et Lire - "Autoriser" pour les deux autres comptes et toujours lire le dossier. Si je change le code pour rechercher Deny et qu'il rencontre d'abord l'identité de l'utilisateur SYSTEM, ma fonction retournera "false", qui est ... false. Il pourrait très bien être lu - "Autoriser" pour les deux autres comptes. Le problème que je n'arrive toujours pas à comprendre est, comment puis-je déterminer quelle permission d'identité d'utilisateur a la priorité sur tous les autres?

+2

Le compte SYSTEM est juste un compte normal, ne le traitez pas spécialement. Il est utilisé par les services. –

Répondre

3

Cela devient très difficile car les ACL permettent l'héritage, mais ils ont aussi un modèle d'accès le plus restrictif. En d'autres termes, si vous avez un DENY n'importe où dans votre chaîne d'utilisateurs à une ressource, peu importe combien d'autres groupes peuvent vous donner un ALLOW, vous êtes refusé. There is a good article on the subect on MSDN.

2

Le groupe système est lié au processus d'E/S et n'est pas directement lié à votre compte d'utilisateur. C'est ce que l'O/S utiliserait pour accéder au système de fichiers s'il n'y avait pas de contexte utilisateur. Puisque votre application fonctionne en tant que votre "nom d'utilisateur" les permissions viennent de lui et les groupes dans lesquels il est. Ne pensez pas que vous devez vérifier System dans ce cas à moins que je manque quelque chose. Gardez à l'esprit que Directory.Exists() vérifie également que vous disposez des autorisations nécessaires pour lire le répertoire.

+0

J'ai "Lecture" et "Contenu de la liste" défini sur Refuser pour mon utilisateur actuel pour un répertoire. Je ne peux pas double-cliquer sur ce répertoire. Si j'essaie (myDirectoryInfo.Exists), il apparaît comme "vrai". Hmmm ... Ne semble pas fonctionner ... Ne fonctionne pas non plus avec (Directory.Exists()) – Nick

+0

Intéressant, dit * Si vous n'avez pas au moins une permission en lecture seule pour le répertoire, les Exists method retournera false. * Peut-être cela signifie-t-il lire les permissions dans le dossier parent puisque vous pouvez voir le répertoire mais pas le contenu de celui-ci. –

0

Le problème n'est pas une hiérarchie d'autorisations. Le problème est que votre code renvoie true ou false en fonction du premier rôle correspondant. Vous devez vraiment évaluer toutes les autorisations.

J'ai récemment eu à faire face à ce problème ... J'ai posté mon code here.

+0

"La ressource que vous recherchez a été supprimée, son nom a été modifié ou est temporairement indisponible." Pourriez-vous l'afficher comme une réponse réelle, comme les directives SO vous le demander? –

Questions connexes