Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
互操作Excel自动化-使用服务帐户打开工作簿_Excel_Interop - Fatal编程技术网

互操作Excel自动化-使用服务帐户打开工作簿

互操作Excel自动化-使用服务帐户打开工作簿,excel,interop,Excel,Interop,我在这里面临一种情况,希望得到一些反馈或建议。 我得到了一个作为服务运行的应用程序,具有特定的服务帐户(不是服务器上的管理员),并尝试打开Excel工作簿 问题不在于初始应用程序,因为我可以用下面的通用C#代码(嵌入到服务结构中)重现它: (关于*this._exApp*和thisFileName没有什么特别之处,它们只是分别强制转换到Microsoft.Office.Interop.Excel.Application中,并作为一个字符串,带有要打开的文件的路径。Logger是一个使用log4n

我在这里面临一种情况,希望得到一些反馈或建议。 我得到了一个作为服务运行的应用程序,具有特定的服务帐户(不是服务器上的管理员),并尝试打开Excel工作簿

问题不在于初始应用程序,因为我可以用下面的通用C#代码(嵌入到服务结构中)重现它:

(关于*this._exApp*和thisFileName没有什么特别之处,它们只是分别强制转换到Microsoft.Office.Interop.Excel.Application中,并作为一个字符串,带有要打开的文件的路径。Logger是一个使用log4net的Logger类,允许我查看问题发生的时间)

该服务作为服务帐户运行,该帐户是服务器上的用户,而不是管理员。它可以访问目标文件和服务器上的文件(作为读取权限)。该服务器是Windows server 2003标准版SP2(尚未在2008 R2服务器上尝试)

我面临的问题是,在尝试打开工作簿时,它只是挂起,因此在跟踪我的最后一行时,它是“打开工作簿…”,从未到达“打开工作簿”行。没有提出任何例外

所以代码非常简单,它只是试图打开一个excel工作簿。我已经做了一些调查,以下是我的调查结果:

  • 我知道微软不支持服务器端的Excel自动化,但我得到了它所提供的服务,对于所使用的技术我没有选择余地
  • 我已配置所有组件服务/DCOM/Microsoft Excel应用程序安全设置,以便服务帐户具有所有可能的权限
  • 如果服务帐户是计算机上的本地管理员,则该服务将正确执行任务。这不是真正的生产选项
  • 如果服务尝试打开的文件是本地文件,则该服务将正确执行该作业。不幸的是,我们试图访问的文件位于远程文件服务器上,在这种情况下无法工作
  • 上面的代码在命令行中与远程文件上的同一用户一起运行,可以正常工作,但在作为服务运行时不再工作
  • 我读过关于C:\Windows\System32\config\systemprofile\Desktop错误的文章,但该文件夹存在
  • 使用服务帐户启动时,Excel将正确打开
所以基本上,情况是Workbooks.Open方法在作为服务运行时、在非管理员的服务帐户下以及在访问远程文件时挂起

如果您能就这个话题提供任何意见或想法,我将不胜感激

谢谢

乔纳森


编辑:根据下面Matt的解决方法,我们已经实现了远程文件的本地副本,因此我接受它作为答案,但我仍然对如何使其直接在远程文件上工作的任何建议感兴趣。

我本想将此作为注释,但我还没有足够的代表,因此,这不仅仅是一个可能的解决办法,而不是一个完整的答案

如果服务尝试打开的文件是本地文件,则该服务将正确执行该作业。不幸的是,我们试图访问的文件位于远程文件服务器上,在这种情况下无法工作

能否先将文件从远程服务器复制到本地临时位置

        this._exApp = new Microsoft.Office.Interop.Excel.ApplicationClass();
        this._exApp.Visible = false;

        string localFile = "local.xls";
        System.IO.File.Copy(thisFileName, localFile);

        Log.Logger.Info("Opening workbook...");
        Workbook workbook = this._exApp.Workbooks.Open(localFile, ...);
        Log.Logger.Info("Workbook opened!");

不管你是否疯狂,你都需要创建以下文件夹

C:\Windows\System32\config\systemprofile\Desktop(32位) C:\Windows\SysWOW64\config\systemprofile\Desktop(64位)


通过使用系统帐户在调度程序中运行Excel的一些操作…

Hello Matt,这确实是我们为了让服务运行而做的事情(在本地复制,打开,然后删除)。这并不理想,并且希望了解是什么阻止它在远程文件上运行。无论如何谢谢你!对不起,我想更新你的答案,但我也太新了(需要15卢比…)谢谢如果此解决方案对您有效,则您可以将其标记为已接受的答案(左边的复选标记),以便其他具有相同/类似问题的人很容易知道此解决方案对您有效。当/如果出现真正的解决方案(或更好的解决方法)时,您可以将所选答案更改为该解决方案。如果你找到了一个解决方案或更好的解决方法,那么你可以发布你自己问题的答案,然后将其标记为已接受的解决方案(这没什么错!)。这样其他人就可以很容易地找到解决此问题的当前“最佳”解决方案。可能是远程位置在服务器上的Excel Trust Center选项中未定义为“受信任的位置”吗?不知道如何,但这是一个黑魔法。
        this._exApp = new Microsoft.Office.Interop.Excel.ApplicationClass();
        this._exApp.Visible = false;

        string localFile = "local.xls";
        System.IO.File.Copy(thisFileName, localFile);

        Log.Logger.Info("Opening workbook...");
        Workbook workbook = this._exApp.Workbooks.Open(localFile, ...);
        Log.Logger.Info("Workbook opened!");