Interop Excel Automation - 使用服务帐户打开工作簿

时间:2012-09-14 15:50:10

标签: excel interop

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

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

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,并且作为包含文件路径的字符串打开.Log.Logger是一个使用log4net的记录器类,可以让我看到问题发生的时间)

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

我遇到的问题是它只是在尝试打开工作簿时挂起,所以在跟踪我的最后一行是“打开工作簿......”,从未到达“工作簿已打开”行。没有例外。

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

  • 我知道Microsoft不支持服务器端Excel自动化,但我已经获得了服务,并且没有选择使用的技术。
  • 我已配置所有组件服务/ DCOM / Microsoft Excel应用程序安全设置,以便服务帐户具有所有可能的权限。
  • 如果服务帐户是计算机上的本地管理员,则服务可以正常工作。这不是真正的生产选择。
  • 如果尝试打开的文件是本地文件,则服务可以正常工作。不幸的是,我们尝试访问的文件位于远程文件服务器上,在那种情况下它不起作用。
  • 从远程文件中具有相同用户的命令行运行的上述代码运行正常,但在作为服务运行时不再有。
  • 我已阅读 C:\ Windows \ System32 \ config \ systemprofile \ Desktop 错误,但该文件夹已存在。
  • 使用服务帐户启动时Excel正确打开。

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

我很感激有关此主题的任何意见或想法。

感谢。

乔纳森

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

2 个答案:

答案 0 :(得分:2)

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

  

如果尝试打开的文件是本地文件,则该服务可以正常工作。不幸的是,我们尝试访问的文件位于远程文件服务器上,在那种情况下它不起作用。

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

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

答案 1 :(得分:2)

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

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

通过使用系统帐户来运行通过Scheduler运行的Excel ....