2009-04-03 5 views
0

Ich habe eine Windows Forms-Anwendung, die als eine Art Verwaltungsmodul für eine ASP.NET-Webanwendung dient. Die Webanwendung dient mehreren Ländern, und Ordner werden erstellt, wenn den Anwendungsdaten neue Länder hinzugefügt werden.Wie erstellen Sie Ordner und legen gleichzeitig Zugriffsberechtigungen für sie fest?

Leider auf den neu hinzugekommenen Länder, die ich mit der Web-Anwendung in eine Ausnahme ausgeführt, wenn ich gehen und versuchen, Dateien in den Ordner zu schreiben:

System.UnauthorizedAccessException: Access to the path 'C:\...' is denied. 

Mit der Web-Anwendung mit ASP.NET Identitätswechsel, es ist offensichtlich, dass der Standard-IIS-Benutzer (MACHINENAME \ IUSR_MACHINENAME) keine Berechtigungen zum Schreiben in den Ordner hat.

Wie gewähre ich die Berechtigung der Standard-IIS-Benutzer beim Erstellen von Ordnern?

Ich verstehe, dass

System.IO.Directory.CreateDirectory(string path, DirectorySecurity directorySecurity) 

dies tun sollte, aber ich verstehe nicht, wie das Protokoll auf Namen auf dem DirectorySecurity Objekt angeben.

Antwort

2

Erteilen Sie die Berechtigung zum Erstellen von Verzeichnissen und Dateien (Lesen/Schreiben/Ändern/...) für die Worker-Prozessgruppe (sysname\iis_wpg) im übergeordneten Verzeichnis, in dem Sie die neuen Verzeichnisse erstellen möchten. Stellen Sie sicher, dass Sie die Berechtigungen für die Anwendung auf this folder, subfolders, and files festgelegt haben. Die Berechtigungen werden dann für neue Ordner übernommen, die Sie erstellen, und Sie müssen sie nicht speziell anwenden. Anstatt dies für alle App_Data zu tun, würde ich vorschlagen, ein bestimmtes Unterverzeichnis zu erstellen und nur Berechtigungen für dieses Unterverzeichnis zu erteilen. Wenn Sie mehrere Apps auf der Box ausführen möchten, möchten Sie möglicherweise einen neuen Benutzer für die Anwendung erstellen, der ausgeführt werden soll. Ändern Sie die ID der Workerprozessgruppe, und erteilen Sie nur diesem Benutzer die Berechtigung.

-1

Dies ist die Lösung, die ich schließlich verwendet:

 if (!Directory.Exists(path)) 
     { 
      Directory.CreateDirectory(path); 
      DirectoryInfo info = new DirectoryInfo(path); 
      DirectorySecurity security = info.GetAccessControl(); 

      security.AddAccessRule(new FileSystemAccessRule(logonName, FileSystemRights.FullControl, InheritanceFlags.ContainerInherit, PropagationFlags.None, AccessControlType.Allow)); 
      security.AddAccessRule(new FileSystemAccessRule(logonName, FileSystemRights.FullControl, InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow)); 

      info.SetAccessControl(security); 
     } 
+1

Dies ist keine gute Lösung, da das Verzeichnis zunächst nur Standardberechtigungen hat, die dann ersetzt werden. Im Prinzip ist es möglich, das Verzeichnis zu entführen, indem man seinen Besitzer ändert, um den ursprünglichen Ersteller zu sperren. Ein Beispiel für die Angabe von DirectorySecurity als Teil des CreateSubDirectory finden Sie unter http://stackoverflow.com/questions/1532014/file-permissions-do-not-inherit-directory-permissions –

Verwandte Themen