在32及64位系统中拒绝访问 ProgID: "excel.application"及配置Microsoft Excel Application权限解决方案

最近在服务器和本地调用delphi写的导出Excel 的webservices,出现一系列配置和权限问题,现在一一记录下来。

Error 信息:

“/”应用程序中的服务器错误。
--------------------------------------------------------------------------------
 拒绝访问。, ProgID: "excel.application" 
说明: 执行当前 Web 请求期间,出现未经处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 

异常详细信息: System.Web.Services.Protocols.SoapHeaderException: 拒绝访问。, ProgID: "excel.application"

源错误: 

行 159:        [return: System.Xml.Serialization.SoapElementAttribute("return")]
行 160:        public string xxxx(string tbdatasource, string tshipmentbh, string toutbh, string serverpath) {
行 161:            object[] results = this.Invoke("xxxx", new object[] {
行 162:                        tbdatasource,
行 163:                        tshipmentbh, 

源文件: d:\WebApplication4\WebApplication4\Web References\WebReference\Reference.cs    行: 161 

堆栈跟踪: 

[SoapHeaderException: 拒绝访问。, ProgID: "excel.application"]
   System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, 
Stream responseStream, Boolean asyncCall) +507386
   System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters) +215
   WebApplication4.WebReference.Imainservice.jianzhen(String tbdatasource, String tshipmentbh, String toutbh, String serverpath) in 
d:\WebApplication4\WebApplication4\Web References\WebReference\Reference.cs:161
   WebApplication4.WebForm1.Page_Load(Object sender, EventArgs e) in d:\WebApplication4\WebApplication4\WebForm1.aspx.cs:16
   System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +51
   System.Web.UI.Control.OnLoad(EventArgs e) +92
   System.Web.UI.Control.LoadRecursive() +54
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +772
 
--------------------------------------------------------------------------------
版本信息: Microsoft .NET Framework 版本:4.0.30319; ASP.NET 版本:4.0.30319.34237 


32位系统处理方法:

1)。开始--〉运行--〉cmd 或者直接在WIN7以上版本开始中里面的搜索输入

2)。命令提示符下面,输入comexp.msc,会直接打开组件服务

3)。点击组件服务=》计算机=》我的电脑=》DCOM配置 =》找到 Microsoft Excel Application(前提需要安装office,如果你的系统是64位请往下看64位系统的配置方法)

4)。 在"DCOM配置"中找到"Microsoft Excel Application",在它上面点击右键,然后点击"属性",弹出"Microsoft Excel 应用程序属性"对话框,然后点击标识=》选择交互式用户。


5)。点击"安全"标签,在"启动和激活权限"上点击"自定义",然后点击对应的"编辑"按钮,在弹出的"启动和激活权限"对话框中填加一个"NETWORK SERVICE"和"Everyone"用户,并给它赋予"本地启动"和"本地激活"权限

6)。依然是"安全"标签,在"访问权限"上点击"自定义",然后点击"编辑",在弹出的"访问权限"对话框中也填加一个"NETWORK SERVICE"和"Everyone"用户,然后赋予"本地访问"权限.

7)。依然是"安全"标签,在"配置权限"上点击"自定义",然后点击"编辑",在弹出的"更改配置权限"对话框中也填加一个"NETWORK SERVICE"和"Everyone"用户,然后赋予"读取"权限.

8)。重启IIS服务。测试结束。

9)。如果你本机或者服务器安装了office 2003 然后又安装了 office2007兼容包的话请参考下图设置。(ps:需要同事设置Office 2007 工作薄的相关权限)


X64位解决方法 http://blog.csdn.net/kongwei521/article/details/43698667

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CLSIDFromProgID() 函数是用于获取指定程序的 CLSID 的 Win32 API 函数,它的参数是程序的 ProgID,即程序的注册名称。在这里,使用 CLSIDFromProgID() 函数获取 Excel 应用程序的 CLSID,然后可以使用该 CLSID 创建 Excel 应用程序的 COM 对象,进而操作 Excel 表格。 以下是一个使用 Win32 API 读取 Excel 表格的示例代码: ```c++ #include <Windows.h> #include <ObjBase.h> #include <atlbase.h> #include <atlcomcli.h> #include <Excel.h> int main() { // 初始化 COM 库 CoInitialize(NULL); // 获取 Excel 应用程序的 CLSID CLSID clsid; HRESULT hr = CLSIDFromProgID(L"Excel.Application", &clsid); if (FAILED(hr)) { // 处理获取 CLSID 失败的情况 return -1; } // 创建 Excel 应用程序的 COM 对象 CComPtr<IDispatch> pExcelApp; hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void**)&pExcelApp); if (FAILED(hr)) { // 处理创建 COM 对象失败的情况 return -1; } // 获取 Workbooks 对象 CComVariant vWorkbooks; hr = pExcelApp->GetIDsOfNames(IID_NULL, L"Workbooks", 1, LOCALE_USER_DEFAULT, &vWorkbooks); if (FAILED(hr)) { // 处理获取 Workbooks 对象失败的情况 return -1; } CComVariant vEmpty; DISPPARAMS dp = {NULL, NULL, 0, 0}; CComVariant vResult; hr = pExcelApp->Invoke(vWorkbooks.lVal, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dp, &vResult, NULL, NULL); if (FAILED(hr)) { // 处理获取 Workbooks 对象失败的情况 return -1; } CComPtr<IDispatch> pWorkbooks; pWorkbooks = vResult.pdispVal; // 打开 Excel 表格 CComVariant vFilename(L"C:\\test.xlsx"); CComVariant vReadOnly(false); hr = pWorkbooks->Invoke(DISPID_VALUE, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &dp, &vResult, NULL, NULL); if (FAILED(hr)) { // 处理打开 Excel 表格失败的情况 return -1; } CComPtr<IDispatch> pWorkbook; pWorkbook = vResult.pdispVal; // 获取 Worksheet 对象 CComVariant vWorksheets; hr = pWorkbook->GetIDsOfNames(IID_NULL, L"Worksheets", 1, LOCALE_USER_DEFAULT, &vWorksheets); if (FAILED(hr)) { // 处理获取 Worksheets 对象失败的情况 return -1; } CComVariant vIndex(1); dp.rgvarg = &vIndex; dp.cArgs = 1; hr = pWorkbook->Invoke(vWorksheets.lVal, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dp, &vResult, NULL, NULL); if (FAILED(hr)) { // 处理获取 Worksheet 对象失败的情况 return -1; } CComPtr<IDispatch> pWorksheet; pWorksheet = vResult.pdispVal; // 获取单元格的值 CComVariant vRange(L"A1"); hr = pWorksheet->Invoke(0x6c, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dp, &vResult, NULL, NULL); if (FAILED(hr)) { // 处理获取单元格的值失败的情况 return -1; } CComVariant vValue; vValue = vResult; // 输出单元格的值 wprintf(L"%s\n", vValue.bstrVal); // 关闭 Excel 应用程序 dp.rgvarg = NULL; dp.cArgs = 0; hr = pExcelApp->Invoke(DISPID_APP_CLOSE, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &dp, NULL, NULL, NULL); // 释放 COM 对象 pWorksheet.Release(); pWorkbook.Release(); pWorkbooks.Release(); pExcelApp.Release(); // 反初始化 COM 库 CoUninitialize(); return 0; } ``` 注意:上述示例代码使用了 ATL(Active Template Library)和 C++ COM,所以需要添加 ATL 头文件并链接 ATL 库才能编译通过。如果没有使用 ATL 或者 C++ COM,可以使用纯 Win32 API 和 C COM 实现相同的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值