问题来源:
ASP.NET Web应用程序中,在服务器端打开一个Microsoft Excel文档,并对其操作,需要访问Microsoft Excel应用程序COM组件。对项目添加引用“Microsoft Office 10.0”,输入相应代码后编译成功,运行时ASP.NET框架提示错误。
相关代码:
Excel.ApplicationClass app;
app = new Excel.ApplicationClass();
// 打开工作簿进行数据操作
app.Quit();
错误信息:
{color3}“/manager”应用程序中的服务器错误。
--------------------------------------------------------------------------------
拒绝访问。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
异常详细信息: System.UnauthorizedAccessExcept
未授权此 ASP.NET 进程访问所请求的资源。出于安全原因,默认的 ASP.NET 进程标识为“{machinename}ASPNET”,它只具有有限的特权。请考虑授予该 ASP.NET 进程标识访问此资源的权限。
若要授予 ASP.NET 对文件的写访问权,请在资源管理器中右击该文件,选择“属性”,然后选择“安全”选项卡。单击“添加”以添加“{machinename}ASPNET”用户。突出显示此 ASP.NET 帐户,在“允许”列中选中“写”框。
{/color}
分析原因:
默认情况下,ASP.NET应用程序依托的进程aspnet_wp将以“ASPNET”账户(此账户属于系统的Users用户组,其访问权限比较低)。
首先考虑运行过程中,aspnet_wp进程对其可能访问的文件系统资源是否拥有足够的权限。
但是,Web应用程序、类库以及Office运行时文件所存放的驱动器文件系统格式都是FAT32,排除了因NTFS文件系统的安全设置所引起的权限限制。
其次考虑到,系统的COM组件安全设定也能对相应账号的访问权限产生影响。
解决方法:
打开组件服务管理程序(“控制面板”->“管理工具”->“组件服务”),在“组件服务”->“计算机”->“我的电脑”->“DCOM配置”中找到“Microsoft Excel 应用程序”。
右击此节点,选择“属性”,选择“安全性”页,在“启动权限”和“访问权限”中分别选择“自定义”并点击“编辑”按钮,在“启动权限”和“访问权限”对话框内添加系统ASPNET账户(“<机器名>ASPNET”),打开“启动”和“访问”的允许权限,确认并关闭对话框。
问题反思:
系统的安全设定不仅仅只有文件资源,组件的安全性设置也相当重要。
Windows提供了“组件服务”管理程序进行对COM、DCOM、COM+组件的设置。
对.NET程序集的安全配置,安装过.NET框架的系统可以通过“管理工具”内的“Microsoft .NET Framework Configuration”和“Microsoft .NET Framework Wizard”进行。
检索COM 类工厂中CLSID 为 {00024500-0000-0000-C000-000000000046}的组件时失败
Asp.Net里面调用Microsoft Excel Application DCOM 组件出错最终解决方法:
1: 在"开始"->"运行"中输入dcomcnfg.exe启动"组件服务"
2: 依次双击"组件服务"->"计算机"->"我的电脑"->"DCOM配置"
3: 在"DCOM配置"中找到"Microsoft Excel 应用程序"(Microsoft Excel Application),在它上面点击右键,然后点击"属性",弹出"Microsoft Excel 应用程序属性"对话框
4: 点击"标识"标签,选择"交互式用户"
5: 点击"安全"标签,在"启动和激活权限"上点击"自定义",然后点击对应的"编辑"按钮,在弹出的"安全性"对话框中填加
一个"ASP.net"用户(注意要选择本计算机名),并给它赋予"本地启动"和"本地激活"权限.
6: 依然是"安全"标签,在"访问权限"上点击"自定义",然后点击"编辑",在弹出的"安全性"对话框中也填加一个"ASP.net"、 (EveryOne 或者NETWORK SERVICE )用户,然后赋予"本地访问"权限
7:点击“位置” ,选中 在数据所在的计算机上运行程序 和 在此计算机上运行程序
这样,我们便配置好了相应的Excel的DCOM权限.
注意:这是在WINxp上配置的,在2003上,ASP.net用户改为NETWORK SERVICE用户。
重新启动IIS。即可解决问题