尽管给予“Everyone”访问权限,IIS应用程序仍无法访问路径

时间:2013-07-11 09:32:18

标签: c# iis-7

IIS应用程序似乎无法写入临时文件夹(需要使用Excel Interop)。

  

拒绝访问路径'C:\ Temp \ temp_file_name.xlsx'。

     

异常详细信息:System.UnauthorizedAccessException:访问   路径'C:\ Temp \ temp_file_name.xlsx'被拒绝。

这是堆栈跟踪:

 [UnauthorizedAccessException: Access to the path 'C:\Temp\temp_file_name.xlsx' is denied.]
    System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) +10550675
    System.IO.File.InternalCopy(String sourceFileName, String destFileName, Boolean overwrite) +863
    System.IO.File.Copy(String sourceFileName, String destFileName) +12
    ExcelOperations.FileHelper.CopyFile(String sourcePath, String destinationPath) +477
    WebExtensions.PersonalPriceListDataExchange.CreateNewQueryBtn_Click(Object sender, EventArgs e) +427
    System.Web.UI.WebControls.Button.OnClick(EventArgs e) +115
    System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +140
    System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +29
    System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +2981

现在,从各方面来看,这看起来像是典型的“缺乏权限”的情况,但我已经修改了Temp文件夹以允许特殊组“Everyone”完全访问...

可能缺少什么?

修改

我忘了提及!

使用管理帐户登录网站时,应用程序工作正常。但是,任何其他帐户(尽管成功登录IIS站点)无权访问该文件夹。同样,奇怪的是我已经授予“Everyone”完全访问权限,而且它仍然无效。

有问题的应用程序是MS CRM 4.0扩展(驻留在CRM ISV文件夹中,因此它是一个子网站),使用与CRM本身相同的应用程序池。但是,如果这与CRM本身有任何关联,我有一些疑问。我认为这可能是IIS /权限问题。

编辑2:

我在我的应用程序中添加了一段简单的代码:

        throw new Exception(Page.User.Identity.Name + " " + HttpContext.Current.User.Identity.Name);

显然,这会抛出当前使用的身份的当前名称。身份很好 - 即它是属于域的普通用户。我甚至可以添加此特定用户并授予他对该文件夹的权限,仍然无法。 :(

编辑3:

我已开启审核临时文件夹。

以下是结果(我必须编辑一些信息):

A handle to an object was requested.

Subject:
Security ID:        -the domain and login of the currently logged user-
Account Name:       -the current username-
Account Domain:     -the current domain-
Logon ID:       0x5e3194d

Object:
Object Server:      Security
Object Type:        File
Object Name:        C:\Temp\temp_file_name.xlsx
Handle ID:      0x0

Process Information:
Process ID:     0x13f0
Process Name:       C:\Windows\System32\inetsrv\w3wp.exe

Access Request Information:
Transaction ID:     {00000000-0000-0000-0000-000000000000}
Accesses:       DELETE
            READ_CONTROL
            SYNCHRONIZE
            ReadData (or ListDirectory)
            WriteData (or AddFile)
            AppendData (or AddSubdirectory or CreatePipeInstance)
            WriteEA
            ReadAttributes
            WriteAttributes

Access Reasons:     DELETE: Unknown or unchecked
            READ_CONTROL:   Unknown or unchecked
            SYNCHRONIZE:    Unknown or unchecked
            ReadData (or ListDirectory):    Unknown or unchecked
            WriteData (or AddFile): Denied by Integrity Policy check
            AppendData (or AddSubdirectory or CreatePipeInstance):  Unknown or unchecked
            WriteEA:    Unknown or unchecked
            ReadAttributes: Unknown or unchecked
            WriteAttributes:    Unknown or unchecked

Access Mask:        0x130197
Privileges Used for Access Check:   -
Restricted SID Count:   0

审核报告中指定的用户可以完全访问该文件夹

4 个答案:

答案 0 :(得分:2)

以下是一些想法......

  • 显然,让Everyone访问该文件夹是不好的。您应该检查应用程序池正在运行的凭据。例如,如果它是“应用程序池标识”,您只需要授予用户名为IUSR的用户访问该文件夹。

  • 其中一个奇怪的错误是您看到的错误也可能是尝试写入空文件(零字节)的结果。我记得有“权限”问题,实际上事实证明是零字节文件写入。

  • 应用程序用户登录如何更改服务访问的行为很奇怪 - 您是否正在进行模拟?即你传播Windows登录服务?如果是这样 - 可能是错误是因为用户来自另一个域。例如,如果用户来自域MYDOM,我认为Everyone组也必须来自该域(请注意,还有“本地域”,例如您的PC名称 - 例如,MYPC \ Administrator是本地用户与MYDOMAIN \ Administrator没有任何关系。

  • 最终,您可能想要更改Temp文件夹的位置。你正在使用C#,所以像:

    System.IO.Path.GetTempPath()

可以做到这一点,因为IIS已经有一个预定义的路径,只是为了你有写访问权限的目的。毋庸置疑,这比使用C:\Temp更好,这会带来严重的安全风险。

答案 1 :(得分:0)

我建议您为您的apppool授予管理员权限。它会解决你所有的问题。

答案 2 :(得分:0)

好的,虽然我仍然不知道为什么我在前面描述的场景中无法访问该文件夹,但是关闭了IIS应用程序的模拟访问权限。

答案 3 :(得分:0)

您是否同时启用了匿名和Windows身份验证?将有助于解释为什么它在假冒关闭时起作用。