Question

Je parcours de manière récursive de nombreux répertoires Certains d’entre eux (comme D: \ $ RECYCLE.BIN \ S-1-5-20 ) me donnent un System.UnauthorizedAccessException . Je suppose que je peux juste le comprendre et passer à autre chose, mais je préférerais le comprendre d'avance.

Donc, quand j’ai un objet DirectoryInfo . Comment voir si je suis autorisé à GetDirectories () et éventuellement à Supprimer () ?

Était-ce utile?

La solution

Si vous avez l'intention de le supprimer, essayez de le supprimer puis poursuivez (en gérant l'exception comme il convient).

Si vous effectuez une vérification, puis une suppression, si celle-ci devrait pouvoir être supprimée, il est possible que le système de fichiers soit soumis à une condition de concurrence, même minime. Ceci s’applique à la plupart des opérations d’accès aux fichiers / répertoires. La plupart des opérations de système de fichiers sont conçues pour être atomiques et déplacer cette logique dans un code utilisateur en conflit avec cette atomicité et il faudrait toujours gérer une éventuelle exception levée.

Autres conseils

J'ai construit le code suivant. S'il vous plaît, voyez si cela aide:

//using System.IO;
//using System.Security.AccessControl;
//using System.Security.Principal;

string[] directories = Directory.GetDirectories(
    Path.Combine(Environment.CurrentDirectory, @"..\.."), 
    "*", SearchOption.AllDirectories);
foreach (string directory in directories)
{
    DirectoryInfo info = new DirectoryInfo(directory);
    DirectorySecurity security = info.GetAccessControl();
    Console.WriteLine(info.FullName);
    foreach (FileSystemAccessRule rule in 
             security.GetAccessRules(true, true, typeof(NTAccount)))
    {
        Console.WriteLine("\tIdentityReference = {0}", rule.IdentityReference);
        Console.WriteLine("\tInheritanceFlags  = {0}", rule.InheritanceFlags );
        Console.WriteLine("\tPropagationFlags  = {0}", rule.PropagationFlags );
        Console.WriteLine("\tAccessControlType = {0}", rule.AccessControlType);
        Console.WriteLine("\tFileSystemRights  = {0}", rule.FileSystemRights );
        Console.WriteLine();
    }
}

Résultat:

D:\Projects\ConsoleApplication1\bin
    IdentityReference = BUILTIN\Administrators
    InheritanceFlags  = ContainerInherit, ObjectInherit
    PropagationFlags  = None
    AccessControlType = Allow
    FileSystemRights  = FullControl

Notez que les propriétés IdentityReference et FileSystemRights ; vous devriez probablement tester votre liste de contrôle d'accès actuelle contre eux avant d'essayer de supprimer un répertoire.

Je pense que vous devrez écrire votre propre méthode GetDirectories () . récursivement les obtient à l'intérieur.

Cet article de Microsoft contient un bon article sur la façon de le faire, avec un peu de vous pouvez le nettoyer pour utiliser les listes génériques et l’adapter à votre solution.

En termes simples, System.IO.Directory.GetDirectories () échouera chaque fois qu'il obtiendra l'une de ces exceptions.

Un code similaire à celui-ci (copié ci-dessus) devrait vous aider à démarrer

    List<String> directories = new List<String>();
    void DirSearch(string sDir) 
    {
        try 
        {
            foreach (string d in Directory.GetDirectories(sDir)) 
            {
                //foreach (string f in Directory.GetFiles(d, txtFile.Text)) 
                //{
                //    
                //}
                // use this to search for files recursivly.
                directories.Add(d);
                DirSearch(d);
            }
        }
        catch (System.Exception excpt) 
        {
            Console.WriteLine(excpt.Message);
        }
    }

Une fois que vous avez votre liste de répertoires, vous pouvez ensuite effectuer des opérations dessus. Avec certains mods, la méthode ci-dessus doit vous assurer que vous disposez des autorisations en lecture sur tous les éléments de la liste.

J'ai trouvé cela en essayant de résoudre le problème ...

On dirait que c'est lié, mais que le code n'est pas maintenu, je ne l'ai pas essayé

http: //technolog.nl/blogs/eprogrammer/archive/2009/06/18/Howto_3A00_-Properly-use-the-AccessCheck-API.aspx

salutations

Mario

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top