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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fand ich die Lösung in einem MSDN-blog-Beitrag: Sagen wwhhhaaaat? - Die access control Liste ist nicht kanonisch. Grundsätzlich müssen Sie für die Konstruktion einer neuen Zugriffssteuerungsliste mit den Berechtigungen, aber in der richtigen kanonischen Reihenfolge:
RegistrySecurity
als gut, da es erbtNativeObjectSecurity
.