【问题标题】:Can not open Excel Workbook in ASP classic with Excel.Application无法使用 Excel.Application 在 ASP 经典中打开 Excel 工作簿
【发布时间】:2017-08-20 11:26:44
【问题描述】:

我有一个 Windows 2016 Server,我已经在其中安装并激活了 Office 2013 64bit。

我有一个经典的 ASP 应用程序,它试图打开这样的 Excel 工作簿:

<%
Set appExcel = CreateObject("Excel.Application")

appExcel.Workbooks.Open("C:\intranet\web\Libro1.xlsx")

%>

我知道 Microsoft 不鼓励这种 Office 自动化,但这是我继承的旧版应用程序,必须设法使其在 Windows 2016 上运行。

如果我将这段代码作为 VBS 脚本执行,则没有问题,但如果我尝试将其作为 ASP 页面执行,我会得到:

Microsoft Office Excel 错误“800a03ec”Microsoft Office Excel 无法访问文件“C:\intranet\web\Libro1.xlsx”。
有几个可能的原因:
• 文件名或路径不存在。
• 该文件正被另一个程序使用。 (...)

我已经放弃了所有建议的原因,我还检查了如果我真的使用了一个不存在的文件,则错误消息是不同的。

我正在以用户“管理员”(我的西班牙语安装中的管理员)身份运行我的 ASP 应用程序池。

我已在组件服务中的 Microsoft Excel DCOM 配置条目权限的所有三个部分中为所有人授予权限。

我已经检查了我的操作系统和我的办公包中安装的更新。

我的想法不多了,欢迎提供任何合理的线索。

【问题讨论】:

    标签: excel vbscript asp-classic com


    【解决方案1】:

    在 IIS 中设置网站的建议

    设置 IIS 网站时需要考虑的事项

    • 匿名访问帐户
    • 应用程序池
    • NTFS 权限

    设置匿名帐户

    • 方法一 - 使用ApplicationPoolIdentity 而不是IUSR

      ApplicationPoolIdentityIIS_IUSRS 安全组中对应IIS AppPool\&lt;AppPoolAccounts&gt; 之一的特殊术语。

      原因是它将安全上下文与应用程序池相关联,而不是让匿名帐户以IUSR 运行,而应用程序池以ApplicationPoolIdentity 运行,留下两个安全上下文来管理。

    • 方法二 - 使用自定义帐户作为应用程序池的标识

      要获得更多控制权,请在应用程序池高级设置中使用自定义帐户代替 ApplicationPoolIdentity。借用方法一,匿名帐户应设置为ApplicationPoolIdentity,因此现在只需管理一个安全上下文。

      与使用IUSR 相比,这种方法的主要好处是您知道自定义帐户的密码,而 IIS 控制IUSR 密码,使得使用它代替ApplicationPoolIdentity 作为应用程序池标识很麻烦。

    分配 NTFS 权限

    警告: UAC (用户帐户控制) 在“Admin Approval Mode”中运行时可以修改 NTFS 权限,请确保设置 User Account Control: Run all administrators in Admin Approval Mode 设置为 @位于Computer settings\Windows settings\Security settings\Local policies\Security options 下的本地组策略中的 987654335@。

    根据将匿名帐户添加到 IIS 网站的方法,应该将两个帐户之一添加到网站根文件夹;

    • 方法一 - IIS_IUSRS(读取权限)
    • 方法二 - 自定义帐户(读取权限)

    在基本级别,网站根文件夹应包含以下权限;

    | User Account       | Permission            | Notes
    | ------------------ | --------------------- | ---------------------
    | Administrators     | Full Control          | For File System access.
    | <IIS Anonymous>    | Read & Execute        | Either IIS_IUSRS or a Custom Account.
    

    不要继承权限

    建议在网站根文件夹上禁用继承,以阻止父权限向下传播并覆盖任何现有权限,这可能是一项昂贵的恢复工作。

    【讨论】:

      【解决方案2】:

      终于找到问题所在了。

      根据有关 DCOM 权限的一些指示,我使用“组件服务”工具配置了“Microsoft.Excel”DCOM 配置权限。但这还不够。

      今天我看到除了“权限”选项卡之外,还有一个“身份”选项卡。默认情况下,它选择使用“初始用户”,我希望它是运行 IIS 应用程序池的用户。我已经用一个“真实”用户执行了池,所以我没想到这会相关,但是当我更改它并选择一个特定用户时,一切都开始工作了。

      所以总结一下我的解决方案是:

      • 打开“组件服务管理”
      • 在“DCOM 配置”部分找到与“Microsoft.Excel”相关的条目,然后右键单击“属性”。
      • 在“身份”选项卡中设置一个“真实”用户,该用户将在使用互操作 API 时运行 Excel。
      • 在“权限”选项卡中调整权限,使您在身份选项卡中设置的用户拥有所需的权限

      希望这能给任何人一些线索。

      【讨论】:

      • 你还在用Administrador作为你的ApplicationPoolIdentity吗?如果是这样,我不会推荐它,因为它会带来安全风险。
      • 不,不,我使用的是“NetworkServices”。我只是在故障排除期间使用“管理员”来查看它是否有任何不同。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-12
      • 2013-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多