Win32com代码不工作的IIS(Win32com codes not working on II

2019-10-21 17:29发布

我想,只要有一个使用win32com Objects是encoutered代码部署在IIS web服务器Python应用程序,它会抛出错误,但代码工作在Python中内置的Web服务器下面罚款的代码:

xlapp = win32com.client.Dispatch(R “Excel.Application”)

这里是错误:

xlapp undefined, global win32com = <module 'win32com' from 'C:\Python27\lib\site-packages\win32com\__init__.pyc'>, win32com.client = <module 'win32com.client' from 'C:\Python27\lib\site-packages\win32com\client\__init__.pyc'>, win32com.client.Dispatch = <function Dispatch> 
C:\Python27\lib\site-packages\win32com\client\__init__.py in Dispatch(dispatch='Excel.Application', userName=None, resultCLSID=None, typeinfo=None, UnicodeToString=None, clsctx=21) 
 93   """

 94   assert UnicodeToString is None, "this is deprecated and will go away"

 =>   95   dispatch, userName = dynamic._GetGoodDispatchAndUserName(dispatch,userName,clsctx)

 96   return __WrapDispatch(dispatch, userName, resultCLSID, typeinfo, clsctx=clsctx)

 97 

dispatch = 'Excel.Application', userName = None, global dynamic = <module 'win32com.client.dynamic' from 'C:\Python27\lib\site-packages\win32com\client\dynamic.pyc'>, dynamic._GetGoodDispatchAndUserName = <function _GetGoodDispatchAndUserName>, clsctx = 21 
C:\Python27\lib\site-packages\win32com\client\dynamic.py in _GetGoodDispatchAndUserName(IDispatch='Excel.Application', userName='Excel.Application', clsctx=21) 
113         else:

114                 userName = str(userName)

=>  115         return (_GetGoodDispatch(IDispatch, clsctx), userName)

116 

117 def _GetDescInvokeType(entry, default_invoke_type):

global _GetGoodDispatch = <function _GetGoodDispatch>, IDispatch = 'Excel.Application', clsctx = 21, userName = 'Excel.Application' 
C:\Python27\lib\site-packages\win32com\client\dynamic.py in _GetGoodDispatch(IDispatch='Excel.Application', clsctx=21) 
 90                         IDispatch = pythoncom.connect(IDispatch)

 91                 except pythoncom.ole_error:

=>   92                         IDispatch = pythoncom.CoCreateInstance(IDispatch, None, clsctx, pythoncom.IID_IDispatch)

 93         else:

 94                 # may already be a wrapped class.

IDispatch = 'Excel.Application', global pythoncom = <module 'pythoncom' from 'C:\windows\system32\pythoncom27.dll'>, pythoncom.CoCreateInstance = <built-in function CoCreateInstance>, builtin None = None, clsctx = 21, pythoncom.IID_IDispatch = IID('{00020400-0000-0000-C000-000000000046}') 

   <class 'pywintypes.com_error'>:(-2147024891, 'Access is denied.', None, None) 
  argerror = None 
  args = (-2147024891, 'Access is denied.', None, None) 
  excepinfo = None 
  hresult = -2147024891 
  message = '' 
  strerror = 'Access is denied.' 

Answer 1:

线索是在错误信息:

<类'pywintypes.com_error'>:( - 2147024891, ' 访问被拒绝 ',无,无)
argerror =无
ARGS =(-2147024891, ' 访问被拒绝。',无,无)
EXCEPINFO =无
HRESULT = -2147024891
消息=“”
字符串错误=' 访问被拒绝。

它看起来像你的Python应用程序下运行无权发动Excel实例的身份。

更新:

Excel将被作为一个进程外COM服务器。 为了让您的网站的权限启动Excel和实例,从而为工作簿您需要配置启动和激活权限使用Excel名为DCOMCNFG.EXE工具对象。

您可以从开始启动DCOMCNFG.EXE - >运行或命令行。 你需要一个本地计算机管理员为好。

一旦启动展开组件服务节点和它的孩子就像在下面的截图:

向下滚动DCOM配置节点的孩子,直到你找到一个名为Microsoft Excel应用程序的条目:

右键单击该条目并选择属性 ,一个标签式对话框将打开。 选择安全选项卡,然后选择启动和激活权限自定义单选按钮,然后单击编辑按钮,就像这样:

当您单击编辑按钮另一个对话框将打开,在这个窗口中,你可以添加你的网站下运行的身份:

通常情况下,网站将根据什么被称为运行应用程序池标识 。 它通常将是相同的名称作为网站的应用程序池(除非你改变了这一切)。

您需要授予这两个启动和激活权限池标识。 通过单击Add按钮,会显示这样做:

在文本框中输入前缀的池标识IIS AppPool\ (空格和反斜杠很重要:

    IIS AppPool\[Your Application Pool Identity]

例如:

    IIS AppPool\DefaultAppPool

点击OK,你会看到你的应用程序池标识添加到用户列表中。 然后确保在本地启动本地激活允许打勾复选框被选中,就像这样:

完成后,单击确定 ,然后再次单击确定

希望现在你应该可以有你的Python应用程序启动Excel。

我要提醒你,Excel文件(及其他办公套件应用程序)未设计(或授权)在Web应用程序中使用。 这可能与数百个孤立的Excel(或Word)过程,这将成为一个总的管理/资源粗加工噩梦结束了。



文章来源: Win32com codes not working on IIS