Impossible de modifier les autorisations ACL en C # sur le répertoire CommonAppDataPath

StackOverflow https://stackoverflow.com/questions/1440149

  •  10-07-2019
  •  | 
  •  

Question

J'essaie donc de modifier les autorisations du groupe BUILTIN \ Users pour qu'elles disposent au moins du droit d'accès Modifier le système de fichiers. Malheureusement, mes tentatives d’utilisation du code ci-dessous produisent une liste de contrôle d’accès inchangée.

            SecurityIdentifier usersSecurityIdentifier = ntAccount.Translate(typeof(SecurityIdentifier)) as SecurityIdentifier;
            DirectorySecurity directorySecurity = Directory.GetAccessControl(source.FullName);
            FileSystemAccessRule accessRule 
                = new FileSystemAccessRule(@"BUILTIN\Users", FileSystemRights.FullControl, AccessControlType.Allow);

            directorySecurity.ModifyAccessRule(AccessControlModification.Add,
                accessRule,
                out modified);

            Console.WriteLine(modified);

Modified indique la valeur true dans tous les cas, mais les permanentes ne sont pas mises à jour lorsque vous les consultez dans les propriétés du dossier.

J'ai également essayé d'ajouter une règle d'accès pour un identifiant SecurityIdentifier qui ne possédait pas déjà de liste de contrôle d'accès pour le répertoire utilisant un code similaire, mais uniquement AddAccessRule au lieu de modifier. Bien que le nouveau SecurityIdentifier apparaisse dans la liste des permanentes du répertoire, il ne dispose pas de l’accès indiqué.

Je tente de modifier l'accès à un répertoire propriétaire dans Environment.SpecialFolders.CommonApplicationData dont un compte d'administrateur est le propriétaire. J'essaie également de modifier la liste de contrôle d'accès en tant qu'administrateur.

Quelqu'un at-il une idée de ce qui ne va pas dans le code ci-dessus ou des ressources qui peuvent me permettre de définir correctement la liste de contrôle d'accès en utilisant les classes natives .NET natives?

Était-ce utile?

La solution

J'ai compris cela avec l'aide d'un ami qui travaille chez Microsoft. En fait, le processus que j'utilisais pour définir la liste de contrôle d'accès était précis. Je interprétais les résultats de manière incorrecte. Fondamentalement, il n’ya aucun problème à définir la liste de contrôle d’accès sur un répertoire de cette manière, à condition que vous agissiez en tant qu’administrateur lorsque vous essayez d’apporter les modifications.

Les autorisations précises pour le dossier étaient disponibles pour l'affichage (sous Vista) par:

  1. Faites un clic droit sur le dossier en question et sélectionnez les propriétés
  2. Sélectionnez l'onglet Sécurité
  3. Cliquez sur Avancé
  4. Cliquez sur Modifier
  5. Sélectionnez l'entité pour laquelle vous souhaitez afficher les autorisations, puis cliquez sur Modifier.

C'est la partie qui me manquait. Des autorisations sont déjà définies pour le chemin CommonApplicationData pour l'entité BUILTIN \ Users. Donc, après avoir exécuté mon code, je me retrouve avec deux entités. On dit lu & amp; Execute et l'autre dit Permissions spéciales. Lorsque je modifie l'entité avec des autorisations spéciales, je constate en réalité que BUILTIN \ Utilisateurs ont accès au répertoire.

Je recherchais vraiment BUILTIN \ Users pour avoir accès au répertoire et à tous ses dossiers et objets enfants. Voici un extrait de code de ce que j'ai fini par utiliser. J'ai pu confirmer que mon code fonctionnait à la fois au moyen d'un harnais de test et d'une inspection manuelle des listes ACL de fichiers et de répertoires.

DirectorySecurity directorySecurity = Directory.GetAccessControl(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData));
FileSystemAccessRule accessRule
    = new FileSystemAccessRule(@"BUILTIN\Users", FileSystemRights.FullControl, 
        InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, 
        PropagationFlags.None, 
        AccessControlType.Allow);

bool modified=false;
directorySecurity.ModifyAccessRule(AccessControlModification.Add,
    accessRule,
    out modified);

if (modified)
{
    source.Create(directorySecurity);
}
else
{
    source.Create();
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top