Win32com代码在IIS上不起作用

7fyelxc5  于 2022-11-12  发布在  其他
关注(0)|答案(1)|浏览(240)

我正在尝试在IIS Web服务器上部署Python应用程序,每当遇到使用win32com对象的代码时,它会抛出错误,但代码在Python内置Web服务器上运行良好。
Excel应用程序
下面是错误:

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.'
os8fio9y

os8fio9y1#

错误消息中包含线索:
〈class 'pywintypes.com_error'〉:(-2147024891,'访问被拒绝。',无,无)
参数错误=无
args =(-2147024891,'访问被拒绝。',无,无)
例外信息=无
h结果= -2147024891
消息=“”
strerror = '访问被拒绝。'
您运行python应用所用的身份似乎没有启动Excel示例的权限。

更新日期:

Excel将作为进程外COM服务器启动。若要允许您的网站权限启动Excel并将对象示例化为工作簿,您需要使用名为 dcomcnfg.exe 的工具为Excel配置 * 启动和激活 * 权限。
您可以从开始-〉运行或从命令行启动 * dcomcnfg.exe *。您还需要是本地计算机管理员。
启动后,展开 * 组件服务 * 节点及其子节点,如下面的屏幕截图所示:

向下滚动浏览 DCOM Config 节点的子节点,直到找到名为 Microsoft Excel Application 的条目:

右键单击此条目并选择 * 属性 *,将打开一个选项卡对话框。选择 * 安全 * 选项卡,然后选择启动和激活权限 * 自定义 * 单选按钮,然后单击 * 编辑 * 按钮,如下所示:

当您点击 * 编辑 * 按钮时,将打开另一个对话框,在此窗口中,您可以添加您的网站运行所用的身份:

通常,站点将在Application Pool Identity下运行,它通常与站点的应用程序池同名(除非您更改了它)。
您需要将启动和激活权限都授予池标识。单击 * 添加 * 按钮可执行此操作,此时将显示:
x1c4d 1x指令集
在文本框中输入以IIS AppPool\为前缀的池标识(空格和反斜杠很重要:

IIS AppPool\[Your Application Pool Identity]

例如:

IIS AppPool\DefaultAppPool

单击“确定”,您将看到您的应用程序池标识添加到用户列表中。然后,确保选中了 * 本地启动 * 和 * 本地激活 * 允许复选框,如下所示:


指令集
完成后,单击“确定”,然后再次单击“确定”。
希望现在你应该能够让你的Python应用程序启动Excel。
我应该提醒你,Excel(和其他Office套件应用程序)不是为在Web应用程序中使用而设计(或授权)的。最终可能会有数百个孤立的Excel(或Word)进程,这将成为一个全面的管理/资源占用噩梦。

相关问题