IIS 应用程序无法访问路径,尽管授予“所有人”访问权限

本文关键字:访问 所有人 权限 访问权 应用程序 路径 IIS | 更新日期: 2023-09-27 18:21:52

IIS 应用程序似乎在写入临时文件夹时遇到问题(需要使用 Excel 互操作(。

对路径"C:''Temp''temp_file_name.xlsx"的访问被拒绝。

异常

详细信息:系统。未经授权访问异常:访问 路径"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 文件夹以允许特殊组"每个人"完全访问......

可能缺少什么?

编辑:

我忘了提!

当我使用管理帐户登录站点时,该应用程序可以正常工作。但是,任何其他帐户(尽管已成功登录到 IIS 站点(都无权访问该文件夹。同样,奇怪的是我已经授予"每个人"完全访问权限,但它仍然不起作用。

有问题的应用程序是 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

审核报告中指定的用户被授予对该文件夹的完全访问权限

IIS 应用程序无法访问路径,尽管授予“所有人”访问权限

这里有

一些想法...

  • 显然,让每个人都可以访问该文件夹是不好的。应检查应用程序池工作的凭据。例如,如果是"应用程序池标识",则只需向名为 IUSR 的用户授予对该文件夹的访问权限。

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

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

  • 最终,您可能希望更改 Temp 文件夹的位置。您使用的是 C#,因此如下所示:

    System.IO.Path.GetTempPath()

可以做到这一点,因为IIS已经有一个预定义的路径,仅用于这些目的,您将在其中具有写入访问权限。不用说,这比使用会带来严重安全风险的C:'Temp更好。

我建议您授予应用程序池的管理员权限。 它将解决您的所有问题。

好的,虽然我仍然不知道为什么在所描述的场景中我无法访问该文件夹,但关闭 IIS 应用程序的模拟访问会有所帮助。

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