在部署Word/Excel到服务器的时候,经常会碰到权限问题.例如;

  Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 8000401a 因为配置类型不正确,系统无法开始服务器进程。请检查用户名和密码。 (Exception from HRESULT: 0x8000401A).
 
  Retrieving the COM class factory for component with CLSID {3AACC1CC-7377-11D5-B316-0800309CC2CE} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).
   类似这种错误,网上搜一搜,会有一大堆的答案.大部分是与权限相关,而且大多建议试用asp.net模拟权限的方法解决.
在web.config中配置:
<identity impersonate="true" userName="XXX" password="XXX"/>
配上管理员的账号和密码,即可正常试用了.但是这样的方法合适吗?让asp.net以管理员身份运行,总觉得会有安全隐患.
   这次因为研究分布式存储的原因,在两台服务器之间通过虚拟目录共享了文件夹,将IIS App Pool的运行账户使用了特定的用户.
就引起了权限上的问题.正好弄明白一下.
   通过Google,发现Word/Excel其实不适合做自动化:
Microsoft does not currently recommend, and does not support, Automation of Microsoft Office applications from any unattended, non-interactive client application or component (including ASP, ASP.NET, DCOM, and NT Services), because Office may exhibit unstable behavior and/or deadlock when Office is run in this environment.
 
再找到MS的官方文档:
Microsoft Office 所有当前版本的设计、测试和配置都是为在客户端工作站上作为最终用户产品运行而完成的。它们假定存在一个交互式桌面和用户配置文件,而且不提供满足为以无人参与方式运行而设计的服务器端组件的需要所必需的重入或安全性级别。
Microsoft 目前建议不要从任何无人参与的、非交互式客户端应用程序或组件(包括 ASP、DCOM 和 NT Service)中进行 Microsoft Office 应用程序的“自动化”,也不为此提供支持,因为 Office 在这种环境中运行时可能会出现不稳定的现象并且/或者会死锁。
如果您要构建在服务器端上下文中运行的解决方案,应尽可能尝试使用对于以无人参与方式执行很安全的组件,或找到至少允许一部分代码在客户端运行的备选方案。如果您选择从服务器端解决方案中运行 Office 应用程序,将发现这样会缺少成功运行所必需的许多功能,而且整体解决方案的稳定性会有风险。
使用服务器端 Office 自动化时出现的问题
尝试在服务器端解决方案中使用 Office 的开发人员需要了解 Office 的表现因环境而与预期不同的五个主要问题。要成功运行您的代码,就需要解决这些问题,而且需要尽可能减少它们的影响。您在构建应用程序时,要仔细考虑这些问题,因为没有任何一种解决方案能解决所有这些问题,不同的设计要求您优先考虑不同的元素。
用户身份:Office 应用程序在运行时会假定存在一个用户身份,即使在它们由“自动化”启动时也是如此。它们尝试根据用户注册表配置单元中的设置为启动应用程序的用户初始化工具栏、菜单、选项、打印机和一些加载项。许多服务会在没有用户配置文件的帐户(例如,SYSTEM 或 IWAM_[servername] 帐户)下运行,因此,Office 可能无法在启动时进行正确的初始化,进而返回一个有关“CreateObject”或“CoCreateInstance”的错误。即使能够在没有用户配置文件的情况下启动 Office 应用程序,其他功能也可能无法正常工作。如果您计划从某个服务进行“Office 自动化”,需要配置您的代码或 Office,以便它使用某个已加载的用户配置文件来运行。
与桌面的交互性:Office 应用程序假定它们在某个交互式桌面下运行,在有些情况下,可能需要让用户看到它们以便某些“自动化”功能正常运行。如果发生意外错误,或者需要一个未指定的参数才能完成某项功能,根据设计,Office 会用一个模式对话框提示用户,询问用户要进行什么操作。非交互式桌面上的模式对话框是无法取消的,这就导致该线程无限期地停止响应(挂起)。虽然有些代码编写的经验做法有助于减少发生这种情况的可能性,但还是无法做到完全防止。正是这种情况使得从服务器端环境运行 Office 应用程序带有风险,而且不受支持。
重入和可伸缩性:服务器端组件需要是具有较高可重入性的多线程 COM 组件,这些组件在有多个客户端时开销最少而吞吐量较高。Office 应用程序在几乎所有方面都正好相反。它们是非重入的、基于 STA 的“自动化”服务器,是为给一个客户端提供多种多样但占用资源较多的功能而设计的。它们作为服务器端解决方案提供不了多少可伸缩性,而且对于重要元素有固定的限制,例如,对于内存,无法通过配置进行更改。更重要的是,它们要使用全局性资源(例如,映射到内存的文件、全局加载项或模板,以及共享的“自动化”服务器),这样可能会限制能够并发运行的实例的数量,而且,如果它们是在多客户端环境中配置的,还可能导致争用的情况。开发人员如果计划同时运行多个任意“Office 应用程序”的实例,就需要考虑“后台处理”或序列化对“Office 应用程序”的访问,以避免可能出现的死锁或数据损坏。
复原性和稳定性:Office 2000、Office XP 和 Office 2003 使用 Microsoft Windows 安装程序 (MSI) 技术,以使最终用户在进行安装和自行修复时更加容易。MSI 推出了“首次使用时安装”的概念,允许在运行时动态安装或配置功能(针对系统,或者更多地针对特定用户)。在服务器端环境中,这会既降低性能,又增加出现要求用户同意安装或提供相应安装盘的对话框的可能性。虽然此设计旨在增强 Office 作为最终用户产品的复原性,但 Office 实现 MSI 功能在服务器端环境中还是会对生产力带来不利影响。此外,在服务器端运行时,Office 的稳定性通常无法得到保障,因为它尚未为这样使用而进行设计或测试。在网络服务器上使用 Office 作为服务组件可能会降低这台计算机的稳定性,进而降低您的网络作为一个整体的稳定性。如果您计划在服务器端自动运行 Office,请尝试将该程序隔离到一台专用计算机上,该计算机不能影响重要功能,而且在需要时可以重新启动。
服务器端安全性:Office 应用程序从来都不是为在服务器端使用而准备的,因此,请不要考虑分布式组件所面临的安全性问题。Office 不对传入的请求进行身份验证,而且不会保护您免受无意中从服务器端代码中运行宏或启动另一台可能会运行宏的服务器的损害。不要打开从匿名网站上载到服务器上的文件!基于上一次设置的安全性设置,服务器可能会在具有全部特权的 Administrator 或 System 上下文下运行宏,并危及您的网络的安全!另外,Office 使用很多客户端组件(例如,Simple MAPI、WinInet、MSDAIPP),它们会缓存客户端身份验证信息以加快处理速度。如果在服务器端进行 Office 自动化,则一个实例可能为多个客户端提供服务,而且由于已经为该会话缓存了身份验证信息,就有可能出现这样的情况:一个客户端可以使用另一个客户端的缓存凭据,从而通过模拟其他用户获得未经授予的访问权限。
除了要考虑技术问题以外,您还必须考虑这样一种设计在许可方面的可行性。目前的许可原则禁止在服务器上使用“Office 应用程序”为客户端请求提供服务,除非那些客户端自己具有 Office 的许可副本。《最终用户许可协议》(EULA) 没有涉及使用服务器端“自动化”向未经许可的工作站提供 Office 功能的情况。
 
   但是按模板生成word/excel是一个很频繁的需求,这个功能非常常用,又实用.暂时也没时间找替代方案,只好找办法解决权限问题.
继续Google,发现可以通过DCOM配置的方式.其做法都是将DCOM配置中的Excel运行账户添加到安全选项卡下的"启动和激活","访问","配置"中.
 
这里将为IIS App Pool配置的运行账户提交到这3个选项中.
PS:发现权限中没有管理组的账号,导致一个问题,asp.net能正常运行excel,但是直接在左面上无法打开,报错"无法嵌入对象".
安全介绍:
项目     详细信息
启动和激活权限
单击以下选项按钮之一:
使用默认值:单击此按钮以指定应用程序使用在计算机属性页的“COM 安全”选项卡上设置的默认权限。
自定义:单击此按钮以指定应用程序使用您设置的权限。若要更改权限,请单击“编辑”。
访问权限
单击以下选项按钮之一:
使用默认值:单击此按钮以指定应用程序使用在计算机属性页面的“COM 安全”选项卡上设置的默认权限。
自定义:单击此按钮以指定应用程序使用您设置的权限。若要更改权限,请单击“编辑”。
配置权限
单击以下选项按钮之一:
使用默认值:单击此按钮以指定应用程序使用默认的注册表配置权限。
自定义:单击此按钮以指定应用程序使用您设置的注册表配置权限。若要更改权限,请单击“编辑”。
 
在标识中"交互式","启动","特定"到底应该怎样选择呢?其实通过MS的文档,可以很容易理解.
asp.net启动的情况,适合于"启动用户".
PS:注意安全策略.
 
标识介绍:
“交互式用户”选项按钮
单击以指定应用程序在当前已登录该计算机的用户身份下运行。对应用程序进行身份验证以访问资源时将使用此用户的安全凭据。
“启动用户”选项按钮
单击以指定应用程序使用已启动该应用程序的用户(启动用户)的安全上下文运行,以便可以在域中对该应用程序进行身份验证。启动用户可以是交互式用户。
“下列用户”选项按钮
单击以指定应用程序使用指定用户帐户的安全上下文运行,以便可以在域中对该应用程序进行身份验证。键入用户名和密码。
“系统帐户”选项按钮
单击以指定服务器应用程序使用内置系统帐户的安全上下文运行。此选项仅对作为服务安装的应用程序可用。
 
 

ASP.NET Word/Excel 权限问题的更多相关文章

  1. ASP.NET MVC通用权限管理系统(响应布局)源码更新介绍

    一.asp.net mvc 通用权限管理系统(响应布局)源码主要以下特点: AngelRM(Asp.net MVC)是基于asp.net(C#)MVC+前端bootstrap+ztree+lodash ...

  2. Asp.net导出Excel续章(自定义合并单元格,非Office组件)

    结合上次写的导出Excel方法,这次上头要求我将列头进行一下合并 以前的效果: 改进后的效果: 在上篇文章中写到了Excel的导出方法,这次为了避免在生产环境中使用Office组件,服务器各种权限配置 ...

  3. asp.net word ecxel类型文件在线预览

    asp.net word ecxel类型文件在线预览 首先得引用COM: Microsoft Excel 10 Object Library Microsoft Word 10 Object Libr ...

  4. ASP.NET操作Excel(终极方法NPOI)

    ASP.NET操作Excel已经是老生长谈的事情了,可下面我说的这个NPOI操作Excel,应该是最好的方案了,没有之一,能够帮助开发者在没有安装微软Office的情况下读写Office 97-200 ...

  5. 配置DCOM中excel权限

    ASP.NET 导出Excel 错误解决备忘 网站项目要用到导出为excel文件的功能,程序运行时报错:"检索 COM 类工厂中 CLSID 为{000-0000-0000-C0046} 的 ...

  6. PDF/WORD/EXCEL/PPT 文档在线阅读

    查资料看了2种解决方法: 1.通过办公软件dll转换,用flans去看 2.通过Aspose转换成pdf格式,在用js前台读pdf(我用的pdf.js) 今天我解决的就是WORD/EXCEL/PPT ...

  7. ASP.MVC 基于AuthorizeAttribute权限设计案例

    ASP.MVC上实现权限控制的方法很多,比如使用AuthorizeAttribute这个特性 1.创建自定义特性用于权限验证 public class AuthorizeDiy : Authorize ...

  8. 关于word excel 等的信息隐藏技术

    简单的word 信息隐藏技术分为两种 一  利用word自带的功能对信息进行隐藏,即选中要隐藏的文字 单击右键 选择字体  给隐藏选项打勾即可    这种信息隐藏比较简单  找到的方式为单机文件——找 ...

  9. ruby中 Win32ole的各应用操作方法(word excel Outlook IE)

    Win32ole为标准Ruby发行版的一部分.Win32ole是访问Windows自动化的接口,可以让Ruby和Windows应用进行交互.具体说来Win32ole可以操作Word,Excel,IE, ...

随机推荐

  1. Sqlite学习笔记(四)&&SQLite-WAL原理

    Sqlite学习笔记(三)&&WAL性能测试中列出了几种典型场景下WAL的性能数据,了解到WAL确实有性能优势,这篇文章将会详细分析WAL的原理,做到知其然,更要知其所以然. WAL是 ...

  2. Hadoop生态系统如何选择搭建

    Apache Hadoop项目的目前版本(2.0版)含有以下模块: Hadoop通用模块:支持其他Hadoop模块的通用工具集. Hadoop分布式文件系统(HDFS):支持对应用数据高吞吐量访问的分 ...

  3. MySQL入门(三)

    写了两篇<MySQL入门>以后我发现,写书的人还是都挺有本事的,起码人家知道怎么编排自己想讲的知识点,我实在是不知道该先说那里后说哪里,那我就想到什么讲什么吧. 一 写SQL 其实我是不想 ...

  4. JavaScript中产生标识符方式的演变

    本文记录下JS中产生标示符方式的演变,从ES5到ES6,ES5及其之前是一种方式,只包含两种声明(var/function),ES6则增加了一些产生标识符的关键字,如 let.const.class. ...

  5. js中json对象和字符串的转换

    JSON.parse() : 字符串-->json对象 var str = '{"name":"huangxiaojian","age" ...

  6. Linux软件安装-yum安装

    虽然RPM包安装软件很方便.快捷,但是还是需要现有安装包才能安装.为了更为方便的安装软件,发展出了利用网络自动安装的方式--yum安装. 使用yum安装的前提是机器可以上网. 1.配置yum源 在/e ...

  7. AI (Adobe Illustrator)详细用法(二)

    本文主要是介绍形状的创建与编辑. 一.系列形状工具 1.矩形工具 矩形的作用很大,比如输入框,按钮,图片的大小,比如相片应用中每一个照片占的比例是多大. 初步的UI图的话,会画矩形和圆角矩形就够了. ...

  8. 突然发现这周有点忙。。着玩-PHP进阶

    hi 周二才,不过我突然意识到这周有点忙着玩的感觉,还是很期待的——今天下午去市里,晚上回来看电影,明晚聚餐吃火锅,后天下午拍短片,晚上可能要打球,周五,嗯,就到周五了.虽然这样下去连怎么写(bian ...

  9. 编译Ansj之Solr插件

    Ansj是一个比较优秀的中文分词组件,具体情况就不在本文介绍了.ansj作者在其官方代码中,提供了对lucene接口的支持.如果用在Solr下,还需要简单的扩展一下. 1.基于maven管理 ansj ...

  10. JAVA中关于并发的一些理解

    一,JAVA线程是如何实现的? 同步,涉及到多线程操作,那在JAVA中线程是如何实现的呢? 操作系统中讲到,线程的实现(线程模型)主要有三种方式: ①使用内核线程实现 ②使用用户线程实现 ③使用用户线 ...