如何创建文件夹并同时指定它们的访问权限?

时间:2009-04-03 10:21:19

标签: asp.net iis filesystems

我有一个Windows窗体应用程序,它作为ASP.NET Web应用程序的一种管理模块。 Web应用程序服务于多个国家/地区,并且在将新国家/地区添加到应用程序数据时会创建文件夹。

不幸的是,在新添加的国家/地区,当我去尝试在文件夹中写入文件时,我遇到了Web应用程序的异常:

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

使用ASP.NET模拟的Web应用程序,很明显默认的IIS用户(MACHINENAME \ IUSR_MACHINENAME)没有写入文件夹的权限。

如何在创建文件夹时为默认IIS用户授予权限?

我理解

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

应该这样做,但我不明白如何在DirectorySecurity对象上指定登录名。

2 个答案:

答案 0 :(得分:2)

授予创建目录和文件(读/写/修改/ ...)到工作进程组(sysname\iis_wpg)到您要创建新目录的父目录的权限。确保您已将权限设置为应用于this folder, subfolders, and files,然后将为您创建的新文件夹继承权限,您无需专门应用这些权限。我建议不要为所有App_Data执行此操作,而是建议创建一个特定的子目录,并仅授予该子目录的权限。如果您在框上运行多个应用程序,则可能需要为要运行的应用程序创建新用户,更改工作进程组的ID,并仅授予该特定用户的权限。

答案 1 :(得分:-1)

这是我最终使用的解决方案:

        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); 
        }