尝试从asp.net应用程序写入文件时System.UnauthorizedAccessException

时间:2013-12-13 20:25:56

标签: c# asp.net .net iis permissions

编辑:我找到了解决方案。我曾经以为在尝试编写要比较的文件时会生成错误,实际上它是在我尝试读取要比较的文件时生成的。我在为比较可执行文件调用的命令中出现语法错误,导致结果文件未生成。当我尝试读取不存在的文件时,我看到了访问冲突(是的,我应该检查文件是否存在)。我有问题让BC生成比较(由于某种原因,完全相同的命令从命令提示符起作用,但从C#运行时不起作用),但我会在必要时将其作为一个单独的问题。

我正在开发一个.net应用程序,用于比较构建之间的代码更改。

我尝试添加的应用程序的一部分超出了比较,生成了两个代码块的html比较。

为了做到这一点,我从代码中生成文件(请注意,我知道文件名对于多个用户会有冲突问题,我稍后会解决这个问题),然后从命令行调用beyond compare可执行文件。我使用以下代码生成文件:

//write the code to a local disk file
            System.IO.File.WriteAllText(@workingFolder + "\\File1.txt", (String)dataRow["OldMethodCode"]);
            System.IO.File.WriteAllText(@workingFolder + "\\File2.txt", (String)dataRow["NewMethodCode"]);

workingFolder的值是:“C:\ inetpub \ wwwroot”

我遇到的问题是,当运行此代码并尝试创建这些文件时,我得到以下异常:

  

[UnauthorizedAccessException:访问路径'C:\ inetpub \ wwwroot'   被拒绝。] System.IO .__ Error.WinIOError(Int32 errorCode,String   maybeFullPath)+216 System.IO.FileStream.Init(String path,FileMode   模式,FileAccess访问,Int32权限,布尔useRights,FileShare   share,Int32 bufferSize,FileOptions选项,SECURITY_ATTRIBUTES   secAttrs,String msgPath,Boolean bFromProxy,Boolean useLongPath,   Boolean checkHost)+1430 System.IO.FileStream..ctor(String path,   FileMode模式,FileAccess访问,FileShare共享,Int32 bufferSize,   FileOptions选项,String msgPath,Boolean bFromProxy,Boolean   useLongPath,Boolean checkHost)+214
  System.IO.StreamReader..ctor(String path,Encoding encoding,Boolean   detectEncodingFromByteOrderMarks,Int32 bufferSize,Boolean checkHost)   +187 System.IO.File.InternalReadAllText(String path,Encoding encoding,Boolean checkHost)+90
  _Default.gridView_SelectedIndexChanged(Object _sender,EventArgs e)+1024 System.Web.UI.WebControls.GridView.HandleEvent(EventArgs e,Boolean causeValidation,String validationGroup)+1241
  System.Web.UI.Page.ProcessRequestMain(布尔   includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint)   3804

我已经尝试了很多方法来解决这个问题。与任何问题一样,您可能会忘记所有选项,但我认为这些选项成功率最高(但没有成功):

  • 将networkService添加为wwwroot文件夹的完全权限
  • 将具有完全权限的所有人添加到wwwroot文件夹
  • 将应用程序池管理的管道模式更改为经典
  • 将应用程序池设置为与自定义用户一起运行,并为该用户授予对该文件夹的完全权限
  • 提供几乎所有与该文件夹相关的完全权限的其他用户
  • 将文件夹移动到wwwroot之外的另一个本地目录并指向该文件夹,并使用该文件夹尝试以上所有内容。

在所有情况下,我似乎无法创建文件,更不用说访问它来运行比较。

是否有人提供有关如何解决此问题的建议,或提供不需要文件创建的替代/更好的比较方法?

谢谢!

2 个答案:

答案 0 :(得分:0)

产生错误......

使用以下代码创建一个Web应用程序并在主机目录“C:\ inetpub \ wwwroot \”中写入文件

 string WorkingFolder = System.Configuration.ConfigurationManager.AppSettings["FolderPath"];
    protected void Page_Load(object sender, EventArgs e)
    {
        string s = "abcdefghijklmnopqrstuvwxyz";
        System.IO.File.WriteAllText(WorkingFolder + @"\File1.txt", s);
    }

我在默认应用程序池下发布和部署应用程序。我的默认应用程序池使用 域用户\ IIS_IUSRS帐户。默认情况下我只有Read&执行“C:\ inetpub \ wwwroot \”文件夹的访问权限。我收到以下错误..,

Source Error: 

第14行:{    第15行:string s =“abcdefghijklmnopqrstuvwxyz”;    第16行:System.IO.File.WriteAllText(WorkingFolder + @“\ File1.txt”,s);    第17行:}    第18行:}

Source File: D:\Working Samples\IISCheck\IISCheck\Default.aspx.cs    Line: 16 

堆栈追踪:

[UnauthorizedAccessException: Access to the path 'C:\inetpub\wwwroot\File1.txt' is    denied.]
  System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) +10555843
System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights,  Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options,  SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy) +2580
System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy) +138
System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options) +98
System.IO.StreamWriter..ctor(String path, Boolean append, Encoding encoding, Int32 bufferSize) +139
System.IO.StreamWriter..ctor(String path, Boolean append, Encoding encoding) +17 
System.IO.File.WriteAllText(String path, String contents, Encoding encoding) +60IISCheck._Default.Page_Load(Object sender, EventArgs e) in D:\Working Samples\IISCheck\IISCheck\Default.aspx.cs:16
System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +25
System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +42
System.Web.UI.Control.OnLoad(EventArgs e) +132
System.Web.UI.Control.LoadRecursive() +66
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +2428

现在我将IIS_IUSRS的完全控制权限授予“C:\ Inetpub \ wwwroot”目录.... 它工作,并能够写入文件....

Double检查文件夹访问权限。绝对可以写.. 我正在使用IIS7.5

答案 1 :(得分:0)

好的,这实际上是后来在代码中引起的。当我尝试读取报告时错误正在触发,该报告实际上尚未生成。

我在从C#运行时生成报告时遇到问题(完全相同的命令在命令提示符下运行)但是如果有必要,我会就此问一个单独的问题。