我尝试通过COM自动化将Excel文件转换为PDF。代码使用系统用户作为服务运行。不幸的是,我在ExportAsFixedFormat()函数中得到错误“0x800A03EC”。当我在交互式会话中运行它时,它可以工作。
我听说过systemprofile需要一个Desktop文件夹,所以我添加了这些文件夹。
我听说这也可能与系统用户没有默认打印机有关,所以我在以下键中添加了值:
HKEY_USERS\S-1-5-18\Software\Microsoft\Windows NT\CurrentVersion\Devices
HKEY_USERS\S-1-5-18\Software\Microsoft\Windows NT\CurrentVersion\PrinterPorts
但这只会让Excel挂起而不是立即抛出异常。
我没有想法,感谢任何帮助。
答案 0 :(得分:5)
您必须为此用户选择默认打印机。尝试将以下代码导入您的注册表。注意:将这些打印机替换为您自己的(虚拟)打印机。
Windows Registry Editor Version 5.00
[HKEY_USERS\S-1-5-18\Software\Microsoft\Windows NT\CurrentVersion\Devices]
"Send To OneNote 2010"="winspool,nul:"
"Microsoft XPS Document Writer"="winspool,Ne00:"
[HKEY_USERS\S-1-5-18\Software\Microsoft\Windows NT\CurrentVersion\PrinterPorts]
"Send To OneNote 2010"="winspool,nul:,15,45"
"Microsoft XPS Document Writer"="winspool,Ne00:,15,45"
[HKEY_USERS\S-1-5-18\Software\Microsoft\Windows NT\CurrentVersion\Windows]
"UserSelectedDefault"=dword:00000000
"Device"="Send To OneNote 2010,winspool,nul:"
当然,您仍需要在
中创建Desktop文件夹C:\Windows\SysWOW64\config\systemprofile
或
C:\Windows\System32\config\systemprofile
取决于您的设置。
完成这些步骤后,您应该能够使用常规的非交互式服务(例如Windows NT / SYSTEM用户)将Word,Powerpoint和Excel导出为PDF。您不需要对组件服务进行任何更改
答案 1 :(得分:1)
错:
[HKEY_USERS\S-1-5-18\Software\Microsoft\Windows NT\CurrentVersion\Windows]
"UserSelectedDefault"=dword:00000000
"Device"="Send To OneNote 2010,winspool,nul:"
正确:
[HKEY_USERS\S-1-5-18\Software\Microsoft\Windows NT\CurrentVersion\Windows]
"UserSelectedDefault"=dword:00000000
"Device"="Microsoft XPS Document Writer,winspool,Ne00:"
答案 2 :(得分:1)
对于记录,当我们运行Windows Server 2008 R2和Excel 2013 Automation时,systemprofile中的“Desktop”文件夹修复修复了此问题。这只是在我们升级到Windows Server 2012 R2和Excel 2016之后才开始出现问题。为了消除Excel作为罪魁祸首,我尝试使用Windows Server 2012 R2和Excel 2013的服务器,并遇到了非常类似的问题。
所有自动化在网络服务下工作得很好,但理想情况下,我们希望在ApplicationPoolIdentity下运行我们的网站。
首先,使用ApplicationPoolIdentity运行的应用程序池需要加载用户配置文件。
Start Run -> inetmgr
expand Server -> Application Pools
right click on your App Pool -> Advanced Settings
under Process Model -> Load User Profile <-- should be set to true
所以现在我必须弄清楚这个身份是谁。也许有更好的方法可以做到这一点,但自从我将用户添加到IIS_IUSRS后,我就找到了这些信息。
Windows -> Edit local users and groups
Groups -> right click IIS_IUSRS -> Add to Group...
Add...
Locations... (choose local server), click OK
In the Enter the object names to select box type IIS APPPOOL\<app pool name>
(note the space and the triple P)
also, <app pool name> is the name of your Application Pool in inetmgr
现在您应该看到IIS_IUSRS IIS APPPOOL \(SID)的成员,其中SID是Windows中的applicationpoolidentity安全标识符。这将是一个非常长的字母数字虚线字符串,如“S-1-5 - ## - ######### - ######### - ######## ## - ######### - #########“
与上面的答案不同,这是我需要在注册表中编辑的用户。
所以现在按照上面的答案,我不得不将以下内容添加到注册表中。注意:将密钥添加到S-1-5-18并没有解决问题,我不得不将它们添加到上面找到的ApplicationPoolIdentity的SID中。
[HKU]\SID\Software\Microsoft\Windows NT\CurrentVersion\Devices
"Send To OneNote 2010"="winspool,nul:"
"Microsoft XPS Document Writer"="winspool,Ne00:"
[HKU]\SID\Software\Microsoft\Windows NT\CurrentVersion\PrinterPorts
"Send To OneNote 2010"="winspool,nul:,15,45"
"Microsoft XPS Document Writer"="winspool,Ne00:,15,45"
[HKU]\SID\Software\Microsoft\Windows NT\CurrentVersion\Windows
"UserSelectedDefault"=dword:00000000
"Device"="Microsoft XPS Document Writer,winspool,Ne00:"
请注意我是如何使用eletre / Robert的“正确”回复的。使用Device的OneNote选项对我不起作用。
希望这可以节省一些人在某一天狩猎它的麻烦。