【问题标题】:WorkbookOpen Event doesnt fire with Windows Service, whereas it fires with windows applicaion工作簿打开事件不会随 Windows 服务触发,而它会随 Windows 应用程序触发
【发布时间】:2009-10-03 17:42:35
【问题描述】:

当我在 Windows 应用程序中使用以下代码时,它总是会触发 WOrkBookOpen 事件。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    Microsoft.Office.Interop.Excel.Application app;
    private void button1_Click(object sender, EventArgs e)
    {
        app = new Microsoft.Office.Interop.Excel.Application();
        app.WorkbookOpen += new Microsoft.Office.Interop.Excel.AppEvents_WorkbookOpenEventHandler(app_WorkbookOpen);
        app.WorkbookActivate += new Microsoft.Office.Interop.Excel.AppEvents_WorkbookActivateEventHandler(app_WorkbookActivate);
    }

    void app_WorkbookActivate(Microsoft.Office.Interop.Excel.Workbook Wb)
    {
        MessageBox.Show(Wb.FullName);
    }

    void app_WorkbookOpen(Microsoft.Office.Interop.Excel.Workbook Wb)
    {
        MessageBox.Show(Wb.FullName);
    }

    private void button2_Click(object sender, EventArgs e)
    {
        app.Quit();
        Marshal.FinalReleaseComObject(app);
    }
}

但是当我想使用 Windows 服务触发相同的事件时,它不会触发。下面是用于服务的代码。我在服务的 OnStart() 中创建 Excel 互操作对象并附加相同的事件。但安装服务后,此事件不会触发。而在同一个Windows应用程序中它会启动。出于测试目的,我在磁盘上创建 FIle 以检查事件是否正在触发。

public partial class Service1 : ServiceBase
{

    Microsoft.Office.Interop.Excel.Application excel;
    public Service1()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
        try
        {
            File.Create("C:\\SampleService\\Start - " + DateTime.Now.Ticks.ToString());

            excel = new Microsoft.Office.Interop.Excel.Application();
            excel.WorkbookOpen += new Microsoft.Office.Interop.Excel.AppEvents_WorkbookOpenEventHandler(excel_WorkbookOpen);
            excel.WorkbookActivate += new Microsoft.Office.Interop.Excel.AppEvents_WorkbookActivateEventHandler(excel_WorkbookActivate);
            File.Create("C:\\SampleService\\Start - " + DateTime.Now.Ticks.ToString());

        }
        catch (Exception e)
        {
            using (StreamWriter stream = new StreamWriter(@"C:\SampleService\Err.txt", true))
            {
                stream.Write(e.Message);
            }
        }
    }

    void excel_WorkbookActivate(Microsoft.Office.Interop.Excel.Workbook Wb)
    {
        File.Create("C:\\SampleService\\EXCEL - " + DateTime.Now.Ticks.ToString());
    }

    public void excel_WorkbookOpen(Microsoft.Office.Interop.Excel.Workbook Wb)
    {
        File.Create("C:\\SampleService\\EXCEL - " + DateTime.Now.Ticks.ToString());
    }

    protected override void OnStop()
    {
        if (excel != null)
        {
            excel.Quit();
            Marshal.FinalReleaseComObject(excel);
        }
    }
}

我也使用了 serviceInstaller,我正在机器上安装服务。我授予服务以创建 Excel.Application com 组件对象的适当权利。

有人遇到过这样的问题吗?还是你发现我遗漏了什么?

谢谢 帕雷什

【问题讨论】:

  • 我读过 divo 的 cmets。如果我可以建议,您可以创建一个 excel 插件来做同样的事情吗?这是一个更好的选择吗?

标签: c# .net windows service


【解决方案1】:

您的服务在哪个帐户下运行?如果是 SYSTEM,请确保选中选项允许服务与桌面交互。或者,尝试在普通用户帐户下运行您的服务。

【讨论】:

  • 是的,我正在运行它的系统帐户,并且选中了相同的选项。我也尝试与其他具有管理员权限的用户一起使用。但没有成功。
  • 无论如何,我不明白您为什么需要这些事件,因为您完全通过您的服务控制应用程序,即您自己使用Application.Documents.Open 等打开、激活等文档。
  • 我需要跟踪机器上打开的所有办公文档。我想为这个文件创建日志。这就是我使用这个事件来跟踪它的原因。
  • @Paresh:如果您在自己的代码中实例化 excel 对象,我认为您将无法跟踪所有办公文档。在您的情况下,您将能够访问您正在创建的实例引发的事件。用户仍然可以创建多个 excel 实例,并且不会为您的 excel 实例引发任何事件。看看创建一个 excel 插件是否有帮助。
  • 嗨 Kalpesh.. 创建 Excel.APplication 的实例,为我在机器上打开的任何 excel 提供事件。所以它对我有用。但我不明白什么是 Excel 插件?你能详细告诉我,如果这样做是更好的方法。
【解决方案2】:

首先,您似乎正在尝试记录使用服务和 excel.application 对象打开的 excel 文件。这不是一个很好的解决方案,您会发现它最多会给出不一致的结果。

Excel.Application 对象将在您的应用程序中的服务帐户下创建。此服务可能会也可能不会与桌面交互,具体取决于您的服务设置。但是,用户将始终能够在其用户帐户中打开 excel 应用程序。

其次,如果您从系统帐户运行 excel 对象服务,您将面临巨大的安全问题。 Office 文档是各种恶意软件的巨大来源,您将授予在其下打开的任何内容对您系统的访问权限,即使是管理员也没有。在不考虑安全后果的情况下,您不应在特权帐户下打开文档。

第三,excel 中的许多事件是特定于 gui 的,如果它们不是可见窗口,它们可能不会触发。很多年前,我在 2000 年的时候就很难学会这一点,从那以后我真的限制了我对他们的依赖。

如果我可以提出一些建议,

  • 如果您的意图是监控谁打开了文件,请考虑使用 Windows 中内置的文件系统安全性/日志记录。它可以设置为审核文件并在访问文件时写入安全事件日志。可以使用 WMI 通过网络轻松检索此信息。
  • 除非您确定它会做什么,否则不要在特权帐户下运行任何东西。您的 excel 文件现在可能没问题,但一个用户带入宏病毒可能是灾难性的。
  • 如果您必须编写自己的“日志记录”,请考虑使用全局挂钩来监控(仅监控,而不是更改或修改)由 excel 打开的文件。仅在打开 excel 文件时记录的快速挂钩应用程序不会影响系统性能,并且会比您建议的更安全和稳定。如果你不熟悉钩子,desaware 曾经为钩子和子类化制作了一些很棒的组件,你应该检查一下。但是,除非您非常熟悉该程序正在做什么,否则请仅监视消息,不要尝试为 excel“处理”它们。
  • Excel 插件只是一个向 Excel 添加自定义函数或功能的文件,它最常见的是 xll 或 xla 文件中的 VBA。如果您需要安全性,请不要依赖插件来监控文件访问,因为它们很容易被禁用。

监控谁打开文件的最有效方法是使用 NTFS 内置的文件审核。

【讨论】:

  • 感谢您的详细解释。但我认为 NTFS 的文件审核对我不起作用,因为我想审核共享文件夹中的文件。
  • 您可以考虑在托管文件的服务器上设置日志记录。这将是监控文件访问/更改的唯一 100% 有效方法。如果您对目标机器具有完全访问权限,您可以在机器上注册一个受信任的证书并编写一个宏来响应文件打开。然后,您必须为宏设置密码。通过使用受信任的证书对其进行签名,它不会在打开文件时提示用户禁用宏。但是请注意,您仍然可以在禁用宏的情况下打开文件(只需按住 shift 键)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多