Directory.CreateDirectory访问路径被拒绝?

时间:2012-02-25 13:08:21

标签: c# permissions access-control create-directory

enter image description here

我有服务器 - 客户端应用程序,它是文件管理器
我的问题是,当我进入一个需要访问控制的文件夹,如系统文件夹,它变为只读,但我需要移动/删除或创建新文件夹,我怎么能获得这样做的权限?

这是我在服务器端创建新文件夹的方法

public void NewFolder(string path)
    {
        try
        {
            string name = @"\New Folder";
            string current = name;
            int i = 0;
            while (Directory.Exists(path + current))
            {
                i++;
                current = String.Format("{0} {1}", name, i);
            }
            Directory.CreateDirectory(path + current);
            Explore(path); //this line is to refresh the items in the client side after creating the new folder
        }
        catch (Exception e)
        {
            sendInfo(e.Message, "error");
        }
    }

7 个答案:

答案 0 :(得分:4)

如果要删除目录只读属性,请使用:http://social.msdn.microsoft.com/Forums/en/vblanguage/thread/cb75ea00-f9c1-41e5-ac8e-296c302827a4

如果要访问系统文件夹,可以以本地管理员身份运行程序。

答案 1 :(得分:4)

驱动器上经常有目录,即使具有管理员权限的用户也无法访问。名为“HDDRecovery”的目录很可能像这样麻烦。当然,它包含敏感数据,可帮助用户从磁盘故障中恢复。适合此类别的另一个目录是“c:\ system volume information”,它包含还原点数据。

管理员可以更改此类文件夹的权限。但当然,这并不能解决实际问题,也不是明智之举。您的用户不能也不应该。一定要编写处理此类权限问题的代码,只需捕获IOExeption即可。从不显示设置了Hidden或System属性的目录,从而使用户免于麻烦。他们是“不要惹我”的属性。

答案 2 :(得分:3)

我也遇到了与此类似的问题,但我能够手动浏览Windows资源管理器并创建目录。

但是,我的笔记本电脑上的VS中运行的网络应用程序通过我的本地IIS托管,而不是VS的内置IIS交易,触发了拒绝访问的问题。

因此,当我在代码中遇到错误时,我深入研究了System.Environment对象中的更多数据并找到了用户,当然这是我的应用程序在IIS中运行的应用程序池。

因此,我打开了IIS并打开了相关应用程序池的高级设置,并将标识更改为在网络服务下运行。单击确定。 “cmd - > iisreset”是一个很好的衡量标准。再试一次应用程序,然后成功!!!!

答案 3 :(得分:1)

创建目录时遇到了同样的问题。我使用了DirectorySecurity,如下所示:

DirectorySecurity securityRules = new DirectorySecurity();
securityRules.AddAccessRule(new FileSystemAccessRule(@"Domain\AdminAccount1", FileSystemRights.Read, AccessControlType.Allow));
securityRules.AddAccessRule(new FileSystemAccessRule(@"Domain\YourAppAllowedGroup", FileSystemRights.FullControl, AccessControlType.Allow));

DirectoryInfo di = Directory.CreateDirectory(path + current, securityRules);

另请注意Hans Passant's answer所解释的安全性。

详情请见MSDN

完整的代码:

public void NewFolder(string path)
{
    try
    {
        string name = @"\New Folder";
        string current = name;
        int i = 0;
        while (Directory.Exists(path + current))
        {
            i++;
            current = String.Format("{0} {1}", name, i);
        }
        //Directory.CreateDirectory(path + current);
        DirectorySecurity securityRules = new DirectorySecurity();
        securityRules.AddAccessRule(new FileSystemAccessRule(@"Domain\AdminAccount1", FileSystemRights.Read, AccessControlType.Allow));
        securityRules.AddAccessRule(new FileSystemAccessRule(@"Domain\YourAppAllowedGroup", FileSystemRights.FullControl, AccessControlType.Allow));

        DirectoryInfo di = Directory.CreateDirectory(path + current, securityRules);

        Explore(path); //this line is to refresh the items in the client side after creating the new folder
    }
    catch (Exception e)
    {
        sendInfo(e.Message, "error");
    }
}

答案 4 :(得分:1)

我在此代码中遇到了类似的问题(asp.net MVC vs2017):

Directory.CreateDirectory(“〜/ temp”);

这是我的解决方法:

System.IO.Directory.CreateDirectory (System.Web.HttpContext.Current.Server.MapPath(“〜/ temp”));

答案 5 :(得分:0)

我怀疑当你在客户端/服务器模式下运行应用程序时,服务器部分需要以管理员身份运行,除了可能删除只读或系统标志之外,还需要能够做你想做的事。

那就是说,我同意@HansPassant-听起来你想做的事情是不明智的。

答案 6 :(得分:0)

<强>解决: 使用以下代码在远程服务器上创建的目录&amp;设置。

  

共享文件夹并在Advance中提供完全权限   在文件夹中设置。

DirectoryInfo di = Directory.CreateDirectory(@"\\191.168.01.01\Test\Test1");

测试是目标文件夹,在哪里创建新的Test1文件夹(目录)