【问题标题】:How to give permission to dynamically created folders to save files in them in asp.net from c# code behind?如何授予动态创建的文件夹权限,以便从后面的 c# 代码将文件保存在 asp.net 中?
【发布时间】:2013-12-04 15:41:34
【问题描述】:

我正在尝试创建一个安全的文件传输系统,在我的文件服务器中,我有一个 Web 服务,它接收一组文件,并将根据上传文件的用户名和日期时间等参数创建一些目录和子目录文件上传。那么问题来了:

1 - 我必须根据请求动态创建文件夹和子文件夹,并且我能够创建文件夹

2 - 创建上述文件夹后,我想将每个文件保存在它的目录中

3 - 当我尝试使用以下代码保存文件时,我收到 Access is denied 错误消息

                    string RootSavePath = @"C:\SFTFileSharingFolder";
                    string RequestSavePath = RootSavePath + "\\Date " + getShamsiDate().Replace("/", "-") + " Time " + DateTime.Now.Hour.ToString() + "." + DateTime.Now.Minute.ToString() + "." + DateTime.Now.Second.ToString();
                    if (!Directory.Exists(RequestSavePath))
                    {
                        Directory.CreateDirectory(RequestSavePath);
                    }
                    fl.SaveAs(RequestSavePath);

fl 是 FileUpload 控件的 ID

我想知道的:

有什么方法可以授予当前用户和应用程序对动态创建的文件夹的权限 来自后面的c#代码所以文件将被保存而没有错误?

【问题讨论】:

  • 你能用你的代码更新问题吗?
  • @Damith 我更新了问题并放了代码
  • 什么是f1?你如何获得新文件的文件名?
  • @Damith 问题已编辑,fl 是文件上传 ID

标签: c# asp.net security io


【解决方案1】:

假设您的 Web 应用程序在某个帐户下运行(并且不进行模拟),您需要做的就是授予该帐户对您的代码将创建子文件夹的文件夹的完全访问权限。

如果您使用模拟,这意味着代码在经过身份验证的用户的帐户下运行。在这种情况下,您必须授予所有用户对该文件夹的访问权限,或者更确切地说,授予您用于授权访问的 Active Directory 组。

【讨论】:

  • 没有继承等级限制吗?我的意思是如果我想在该文件夹中创建 3 级子文件夹?
  • 如果您的代码创建了这 3 个子文件夹,很好。如果您手动创建它们,您可能需要再次授予主文件夹的完全访问权限,如果您还没有这样做,包括所有子文件夹
  • 为了测试你所说的我在我的本地 IIS 上发布了应用程序,我创建了根文件夹并为 IIS_User 应用了该文件夹的完全权限,我点击了高级按钮并选中了复选框:替换所有子项对象权限......但我得到了那个错误:(我做错了什么吗?
  • 我在 IIS 中托管了 webbapp!我向 IIS_User 应用了权限
  • 有一个简单的测试来查看您的帐户是否正确。只需授予(暂时!)“所有人”组对该文件夹的完全访问权限,然后重试。如果它现在有效,则您之前已将权限授予错误的用户。
【解决方案2】:

我认为是因为 IIS 服务器配置不正确。我想有你的地方可以找到答案Setting up permissions to allow ASP.net code behind to create folders on Server

【讨论】:

    【解决方案3】:

    将创建文件夹的驱动器上的父目录的修改权限授予运行 Web 应用程序/应用程序池的用户

    string RootSavePath = @"C:\SFTFileSharingFolder";
    var serverPath = Path.Combine(RootSavePath , "Date " + getShamsiDate().Replace("/", "-") +
                    " Time " + DateTime.Now.Hour.ToString() + "." +
                    DateTime.Now.Minute.ToString() + "." + 
                    DateTime.Now.Second.ToString());
    
    if (!Directory.Exists(serverPath))
    {
        Directory.CreateDirectory(serverPath);
    }
    
    fl.SaveAs(Path.Combine(serverPath, f1.FileName);
    

    【讨论】:

    • 我想将文件保存在另一个驱动器或文件夹中,而不是应用程序文件夹中!
    猜你喜欢
    • 2020-04-10
    • 2012-12-21
    • 1970-01-01
    • 2011-08-31
    • 2019-06-18
    • 2017-09-05
    • 2013-01-17
    • 2016-06-19
    • 2015-05-01
    相关资源
    最近更新 更多