Interop Excel自动化 – 使用服务帐户打开工作簿

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

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

try{ this._exApp = new Microsoft.Office.Interop.Excel.ApplicationClass(); this._exApp.Visible = false; Log.Logger.Info("Opening workbook..."); Workbook workbook = this._exApp.Workbooks.Open( thisFileName, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing ); Log.Logger.Info("Workbook opened!"); //Do something with the result Log.Logger.Info("Closing workbook..."); workbook.Close(false, thisFileName, null); Marshal.ReleaseComObject(workbook); this._exApp.Quit(); } catch(Exception ex){ Log.Logger.Error(ex.Message); } 

(没有什么特别的* this._exApp *和thisFileName ,它们分别被转换成一个Microsoft.Office.Interop.Excel.Application,并作为一个string打开文件的path.Log.Logger是一个logging类log4net让我看到问题发生时)

服务作为服务帐户运行,服务帐户是服务器上的用户,而不是pipe理员。 它可以访问目标文件和服务器上的文件(作为读访问)。 该服务器是Windows Server 2003标准版SP2(无法在2008 R2服务器上尝试)。

我面临的问题是,它只是试图打开工作簿时挂起,所以在追踪我最后一行是“打开工作簿…”,从来没有达到“工作簿打开”行。 没有例外。

所以代码很简单,只是试图打开一个excel工作簿。 我已经做了一些调查,这里是我的发现:

  • 我知道微软不支持服务器端的Excel自动化,但是我已经得到了这个服务,并且没有select使用的技术。
  • 我已经configuration了所有组件服务/ DCOM / Microsoft Excel应用程序安全设置,以便服务帐户具有所有可能的权限。
  • 如果服务帐户是本机上的本地pipe理员,服务将正确执行此项工作。 这不是真正的select生产。
  • 如果该服务尝试打开的文件是本地文件,该服务将正确执行该作业。 不幸的是,我们试图访问的文件是在远程文件服务器上,在这种情况下不起作用。
  • 上面的代码在远程文件上使用相同用户的命令行运行正常,但在作为服务运行时不再有用。
  • 我已阅读有关C:\ Windows \ System32 \ config \ systemprofile \桌面的错误,但该文件夹存在。
  • 当使用服务帐户激活Excel时,Excel可以正确打开。

所以基本上,情况是Workbooks.Open方法在作为服务运行时,在非admin的服务帐户下以及访问远程文件时挂起。

我将不胜感激关于这个话题的任何意见或想法。

谢谢。

乔纳森

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

我会把这个作为一个评论,但我没有足够的代表,所以这是更可能的解决方法,而不是一个完整的答案…

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

您可以先将文件从远程服务器复制到本地临时位置吗?

  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!"); 

疯狂与否,您需要创build以下文件夹

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

与通过使用系统帐户通过调度程序运行的Excel有关…