2009-02-20 7 views
12

Die Implementierer für die Produktionsänderung für unsere IT-Gruppe wurden beauftragt, die Sicherheit für alle verschiedenen Objekte in unserer Gruppe zu überprüfen, hauptsächlich um sicherzustellen, dass Personen, die gegangen sind Unsere Mitarbeiter haben keine Zugriff auf unsere Serverfreigaben, Webverzeichnisse, SQL-Datenbanken usw. Wir haben vor kurzem den SQL-Teil abgeschlossen und haben ein wiederverwendbares Skript, das jährlich (oder mit beliebiger Häufigkeit) ausgeführt werden kann wir kommen auf). Es funktionierte großartig und wir überprüften 20 Datenbanken auf 10 oder so Servern mit ein paar Minuten.Verwenden von C#, um eine Liste der ACLs für Server und zugeordnete Laufwerke zu erhalten

Jetzt, für den Server Zeug. Ich habe eine Anwendung, die ich in C# mit .NET 2.0 geschrieben habe, die rekursiv eine Liste von Verzeichnissen scannt und die ACLs in eine Textdatei ablegt. Das funktioniert hervorragend. Auf dem lokalen Computer. UNC und zugeordnete Pfade funktionieren nicht. Ich erhalte die folgende Ausnahmebedingungsnachricht: Der Prozess besitzt nicht die Berechtigung 'SeSecurityPrivilege', die für diesen Vorgang erforderlich ist.

Auf dieser Linie:

DirectorySecurity DirSec = di.GetAccessControl(AccessControlSections.All); 

Wo di ein Directory Objekt aus einem Directory [] Array aufgezählt ist.

Wir werden nicht in der Lage sein, das SeSecurityPrivilege-Privileg zu erhalten. Ich denke jedoch nicht, dass dies notwendig sein sollte. Ich kann den Ordner öffnen und mit der rechten Maustaste auf Eigenschaften klicken und auf die Registerkarte Sicherheit klicken und sie in der GUI anzeigen. I sollte in der Lage sein, auch programmgesteuert darauf zuzugreifen.

Irgendwelche Gedanken darüber, wie ich diesen Codeabschnitt ändern kann, um die Berechtigungen für den Zielordner zu erhalten?

private void CheckSecurity(DirectoryInfo[] DIArray) 
{ 
    foreach (DirectoryInfo di in DIArray) 
    { 
     DirectorySecurity DirSec = di.GetAccessControl(AccessControlSections.All); 
     string sAccessInfo = string.Empty; 

     foreach (FileSystemAccessRule FSAR in DirSec.GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount))) 
     { 
      sAccessInfo += GetAceInformation(FSAR); 
     } 

     if (sAccessInfo != string.Empty) 
     { 
      // Write info to text file 
     } 
    } 
} 

private string GetAceInformation(FileSystemAccessRule ace) 
{ 
    StringBuilder info = new StringBuilder(); 
    string line = string.Format("Account: {0}", ace.IdentityReference.Value); 
    info.AppendLine(line); 
    line = string.Format("Type: {0}", ace.AccessControlType); 
    info.AppendLine(line); 
    line = string.Format("Rights: {0}", ace.FileSystemRights); 
    info.AppendLine(line); 
    line = string.Format("Inherited ACE: {0}", ace.IsInherited); 
    info.AppendLine(line); 
    return info.ToString(); 
} 

Edit: Wie würde ich die Remote-Ordner für die Lese attrib in der ACL zu überprüfen, wenn es darauf, die „GetAccessControl()“ Methode für den Stammordner fehlschlägt? (Wenn ich \ server \ path übergebe, wird beim Abrufen der Info für \ server \ path fehlgeschlagen).

Das Benutzerkonto ist ein Domänenkonto und ich habe Berechtigungen zum Lesen der Dateistruktur. Ich kann die Sicherheit von den Eigenschaften des Ordners/der Dateien sehen.

Ich werde den Prozessmonitor auschecken, aber ich bin mir nicht sicher, ob ich es auf dem Server ausführen kann (ich bin kein Administrator auf den fraglichen Servern).

+1

Diese Frage/Codebeispiel wirklich sehr hilfreich war immer den Fehler stoppen. Ich habe diesen Code verwendet, um einen Datei-Erlaubnis-Monitor für eines unserer internen Systeme zu erstellen. –

Antwort

17

Sie erhalten den Fehler wegen der Registerkarte "Auditing", obwohl ich ziemlich sicher bin, dass Sie wirklich auf den Bildschirm zugreifen möchten, sind die Daten auf der Registerkarte "Berechtigungen". Das SeSecurityPrivilege steuert den Zugriff auf die SACL.

Try Ändern

DirectorySecurity DirSec = di.GetAccessControl(AccessControlSections.All); 

zu

DirectorySecurity DirSec = di.GetAccessControl(AccessControlSections.Access); 

dann sollten Sie

+0

Duh! Ich weiß nicht, warum ich diese anderen Aufzählungen nicht mehr durchgesehen habe. Ich werde das morgen versuchen und sehen, was ich bekomme. Vielen Dank! – bdwakefield

+0

Das hat den Trick gemacht, danke! – bdwakefield

+0

Gut, ich war ein bisschen besorgt, da ich den Fehler selbst nicht bekommen konnte ... – uzbones

1

Überprüfen Sie, ob der Remote-Ordner dem Benutzer den Code Read Attributes in der ACL gewährt.

Denken Sie auch daran, dass die Berechtigungen auf den Remote-Computern (Server) aufgelöst werden, sodass die lokale Gruppe (Benutzer und Administratoren) möglicherweise nicht das auf dem Client ausgeführte Benutzerkonto enthält.

Wenn Sie Process Monitor auf dem Server ausführen (gefiltert zu den fraglichen Ordnern/Dateien), können Details zur Ursache des Fehlers beitragen.

+0

Siehe Hinweis oben in Bearbeitung. – bdwakefield

+0

Hmmm ... ohne Administratorrechte wirst du seltsamen Berechtigungen ausgeliefert sein und/oder Debugging sehr schwierig finden. – Richard

Verwandte Themen