Wie Sie programmgesteuert fix eine nicht-kanonische ACL?

Ich habe den folgenden code:

DirectoryInfo directory = new DirectoryInfo(@"C:\Program Files\Company\Product");
if (!directory.Exists) { directory.Create(); }

DirectorySecurity directorySecurity = directory.GetAccessControl();
SecurityIdentifier securityIdentifier = new SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, null);
directorySecurity.AddAccessRule(
    new FileSystemAccessRule(
        securityIdentifier,
        FileSystemRights.Write,
        InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit,
        PropagationFlags.None,
        AccessControlType.Allow));
directory.SetAccessControl(directorySecurity);

Den Aufruf AddAccessRule wirft ein InvalidOperationException mit den folgenden stack trace:

System.InvalidOperationException: This access control list is not in canonical form and therefore cannot be modified.
   at System.Security.AccessControl.CommonAcl.ThrowIfNotCanonical()
   at System.Security.AccessControl.CommonAcl.AddQualifiedAce(SecurityIdentifier sid, AceQualifier qualifier, Int32 accessMask, AceFlags flags, ObjectAceFlags objectFlags, Guid objectType, Guid inheritedObjectType)
   at System.Security.AccessControl.DiscretionaryAcl.AddAccess(AccessControlType accessType, SecurityIdentifier sid, Int32 accessMask, InheritanceFlags inheritanceFlags, PropagationFlags propagationFlags)
   at System.Security.AccessControl.CommonObjectSecurity.ModifyAccess(AccessControlModification modification, AccessRule rule, Boolean& modified)
   at System.Security.AccessControl.CommonObjectSecurity.AddAccessRule(AccessRule rule)
   at System.Security.AccessControl.FileSystemSecurity.AddAccessRule(FileSystemAccessRule rule)

Passiert das nur auf manchen Systemen (ich habe gesehen, Windows XP und Windows 7). In den Situationen, in denen der Fehler Auftritt, anzeigen der Sicherheits-Berechtigungen für das Verzeichnis mithilfe von Windows Explorer verursacht in der Regel eine Meldung angezeigt werden, die mit folgendem text:

Die Berechtigungen sind falsch bestellt, die kann
verursachen einige Einträge unwirksam werden. Drücken Sie OK, um fortzusetzen und zu Sortieren
die Berechtigungen richtig, oder Abbrechen, um die Berechtigungen zurücksetzen.

Klick auf OK an dieser Stelle das problem behoben. Was ist denn hier Los? Wie funktioniert ein system in diesem Zustand, und gibt es eine Möglichkeit zu erkennen/beheben programmatisch (D. H. ohne dass der Benutzer manuell mit dem Explorer zu beheben)?

Update

Ich habe ein wenig mehr Forschung über ACL, welche kanonische form ist, und warum es notwendig ist. Ich bin mir immer noch nicht sicher, wie Sie eine Datei würde normalerweise in diesem Zustand, aber ich fand, dass die Icacls tool kann verwendet werden, um erstellen Sie ein Verzeichnis mit einem nicht-kanonische ACL durch speichern der Berechtigung " Liste, ändern Sie es, out-of-order, und zu restaurieren. Nun brauche ich nur noch eine Möglichkeit, es zu beheben, ohne dass der Benutzer eingreifen muss.

  • Du weißt, du bist in Schwierigkeiten, wenn Sie beginnen, Suche nach Referenzen zu Raymond Chen.
InformationsquelleAutor Kevin Kibler | 2011-11-14
Schreibe einen Kommentar