2009-04-03 8 views
0

J'ai une application Windows Forms qui sert de sorte de module d'administration pour une application Web ASP.NET. L'application Web dessert plusieurs pays et des dossiers sont créés lorsque de nouveaux pays sont ajoutés aux données de l'application.Comment créer des dossiers et spécifier des autorisations d'accès sur eux en même temps?

Malheureusement les pays nouvellement ajoutés, je INTRODUISE une exception à l'application Web lorsque je vais essayer d'écrire des fichiers dans les dossiers:

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

Avec l'application Web en utilisant ASP.NET l'usurpation d'identité, il est évident que l'utilisateur IIS par défaut (MACHINENAME \ IUSR_MACHINENAME) n'a aucune autorisation pour écrire dans le dossier.

Comment accorder l'autorisation à l'utilisateur IIS par défaut lors de la création du dossier?

Je comprends que

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

devrait le faire, mais je ne comprends pas comment spécifier le journal sur le nom de l'objet DirectorySecurity.

Répondre

2

Accordez la permission de créer des répertoires et des fichiers (lecture/écriture/modification/...) dans le groupe de processus de travail (sysname\iis_wpg) vers le répertoire parent où vous souhaitez créer les nouveaux répertoires. Assurez-vous que vous avez défini les autorisations à appliquer à this folder, subfolders, and files, puis les autorisations seront héritées pour les nouveaux dossiers que vous créez et vous n'aurez pas besoin de les appliquer spécifiquement. Plutôt que de le faire pour l'ensemble de App_Data, je suggère de créer un sous-répertoire spécifique et d'accorder uniquement des autorisations sur ce sous-répertoire. Si vous avez plusieurs applications en cours d'exécution sur la boîte, vous pouvez créer un nouvel utilisateur pour que l'application s'exécute en tant que, modifiez l'ID du groupe de processus de travail et accordez uniquement l'autorisation à cet utilisateur spécifique.

-1

C'est la solution je finalement:

 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

Ce n'est pas une bonne solution, car le répertoire a d'abord que les autorisations par défaut, qui sont ensuite remplacés. En principe, il est possible de détourner le répertoire en changeant son propriétaire pour verrouiller le créateur d'origine. Pour un exemple de la façon de spécifier DirectorySecurity dans le cadre de CreateSubDirectory, voir http://stackoverflow.com/questions/1532014/file-permissions-do-not-inherit-directory-permissions –

Questions connexes