none
directoryinfo.SetAccessControl ContextSwitchDeadlock RRS feed

  • Discussion générale

  • Bonjour,

    J'ai besoin de vider les ACL sur un dossier d'un serveur distant.

    La fonction tourne sans problème depuis mon poste en pointant sur un serveur proche, mais lorsque je pointe un serveur localisé sur un autre site, la methode SetAccessControl bloque. (ContextSwitchDeadlock was detected dans le débogueur après une longue période)

    Si je lance localement la commande sur ce serveur 'distant', le problème ne se reproduit pas.

    Folderpath est toujours du type : \\monserveur\c$\temp

     

    Voici le code :

      

    Dim DInfo As New DirectoryInfo(FolderPath)
    
    Dim DSecurity As DirectorySecurity = DInfo.GetAccessControl(AccessControlSections.Access)
    
    Dim ItemFSAccessRule As FileSystemAccessRule
    Dim FSAccessRule As Security.AccessControl.AuthorizationRuleCollection = DSecurity.GetAccessRules(True, False, GetType(Security.Principal.SecurityIdentifier))
    
    For Each ItemFSAccessRule In FSAccessRule
     DSecurity.RemoveAccessRule(ItemFSAccessRule)
    Next
    DInfo.SetAccessControl(DSecurity)

     

    Merci de votre aide,

    Osi Mik

    mercredi 7 juillet 2010 16:32

Toutes les réponses

  • Bonjour,

    Est-ce que le code que vous montrez se trouve dans un boucle ? ContextSwitchDeadlock apparait le plus souvent quand la pompe de message Windows s'etouffe...

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS Windows Forms - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    mercredi 7 juillet 2010 19:55
    Modérateur
  •  

    Bonjour,

    Ce code est seul dans une fonction.

    Au moment du blocage, c'est le premier appel à cette fonction et il n'y a pas de boucle.

     

    Par contre, il y a deux actions préparatoires qui fonctionne bien :

    - une fonction setowner pour récupérer le contrôle du répertoire

    - une fonction SetAccessRuleProtection bloquant l'héritage si ce n'est pas déjà fait.

    J'ai essayer en désactivant c'est deux étapes, et le problème est identique.

     

    Je ne comprends pas bien le rapport entre la pompe de message Windows et la distance entre les deux machines.

    Si la réponse à la commande SetAccessControl n'arrive pas, cela peut-il expliquer ce problème ? Il n'y a pas de timeout ?

    Peut-on vérifier l'état de la pompe de message ?

    Y-a-t'il une autre façon de modiffier les ACL d'un répertoire, mieux adapté à un accès à distance ?

     

    Cordialement,

    Eric Osi

    jeudi 8 juillet 2010 08:43
  • Bonjour,

     

    Les permissions  sur le serveur distant ne sont peut-être pas suffisantes pour vous donner la possibilité de modifier les règles d’accès.

    Une solution alternative serait d’utiliser Cacls.exe, mais je ne sais pas si les résultats seront différentes :

     

    http://west-wind.com/weblog/posts/1040.aspx

     

    Cordialement,

    Alex

    ________________

    Publiez un article sur une de ces technologies : Visual Basic, C#, C++, .NET, ASP.NET, SQL Server, Silverlight, SharePoint 2010, SharePoint 2007

    Astuces pour Visual Studio 2010

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, WPF

    Café des usages

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

     

     

     

    vendredi 9 juillet 2010 08:29
  • Bonjour,

    Le programme fonctionne localement

    J'utilise un compte admin du serveurs.

    Avant d'effectuer le SetAccessControl, l'utilisateur s'approprie le répertoire.

    Il n'y a donc pas de problème de droits.

     

    La commande cacls fonctionne mais il ne semble pas gérer les groupes locaux du serveurs distant. (ce qui m'est nécessaire)

     

    Après d'autres testes, le SetAccessControl n'est pas complètement bloqué, mais il prend entre 5 et 20 minutes pour rendre la main.

     

    Cordialement,

    Eric Osi
    vendredi 9 juillet 2010 12:17