Событие WorkbookOpen не запускается службой Windows, тогда как оно запускается приложением Windows

когда я использую приведенный ниже код с приложением 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, она не срабатывает. Ниже приведен код, используемый для службы. Я создаю объект взаимодействия Excel в OnStart() службы и прикрепляю то же событие. Но после установки службы это событие не срабатывает. тогда как в том же приложении 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.

Кто-нибудь сталкивался с такой проблемой? Или вы находите, что я что-то упускаю?

Спасибо, Пареш.


person Paresh.Bijvani    schedule 03.10.2009    source источник
comment
Я прочитал комментарии Диво. Если я могу предложить, вы могли бы создать надстройку Excel, чтобы делать то же самое? Является ли это лучшей альтернативой?   -  person shahkalpeshp    schedule 04.10.2009


Ответы (2)


Под какой учетной записью работает ваш сервис? Если это СИСТЕМА, убедитесь, что установлен флажок Разрешить взаимодействие службы с рабочим столом. В качестве альтернативы попробуйте запустить службу под обычной учетной записью пользователя.

person Dirk Vollmar    schedule 03.10.2009
comment
Да, его системная учетная запись, с которой я работаю, и тот же параметр отмечен. Также я пробовал с другим пользователем, имеющим права администратора. Но никакого успеха. - person Paresh.Bijvani; 03.10.2009
comment
В любом случае, я не понимаю, зачем вам эти события, потому что вы полностью контролируете приложение своим сервисом, т.е. вы открываете, активируете и т. д. документы самостоятельно, используя Application.Documents.Open и т. д. - person Dirk Vollmar; 03.10.2009
comment
Мне нужно отслеживать все офисные документы, открытые на машине. Я хочу создать журнал для этого файла. Вот почему я использую это событие, чтобы отслеживать это. - person Paresh.Bijvani; 04.10.2009
comment
@Paresh: я не думаю, что вы сможете отслеживать все офисные документы, если вы создаете экземпляр объекта Excel в своем собственном коде. В вашем случае вы сможете получить доступ к событиям, вызванным экземпляром, который вы создаете. Пользователь по-прежнему может создать несколько экземпляров excel, и он не вызовет никаких событий для вашего экземпляра excel. Посмотрите, поможет ли вместо этого создание надстройки Excel. - person shahkalpeshp; 04.10.2009
comment
Привет, Калпеш .. Создание экземпляра Excel.APplication, дающего мне событие для любого Excel, открытого на машине. Так что это будет работать для меня. Но я не мог понять, что такое Excel Addin? Можете ли вы рассказать мне подробно, если это лучший подход для этого. - person Paresh.Bijvani; 05.10.2009

Во-первых, похоже, что вы пытаетесь зарегистрировать открытие файлов Excel с помощью объекта службы и excel.application. Это не очень хорошее решение, и вы обнаружите, что в лучшем случае оно дает противоречивые результаты.

Объект Excel.Application будет создан в вашем приложении под учетной записью службы. Эта служба может или не может взаимодействовать с рабочим столом, в зависимости от настроек вашей службы. Однако пользователь всегда сможет открыть приложение Excel в своей учетной записи.

Во-вторых, если вы запускаете службу объектов Excel из системной учетной записи, вы подвергаете себя серьезной проблеме безопасности. Офисные документы являются огромным источником всех видов вредоносных программ, и вы будете предоставлять всему, что открыто под ним, уровень доступа к вашей системе, которого нет даже у администратора. Вы не должны открывать документы под привилегированной учетной записью без учета последствий для безопасности.

В-третьих, многие события в Excel относятся к графическому интерфейсу, и если их не видно в окне, они могут не срабатывать. Я усвоил это много лет назад под 2000 годом, и с тех пор я действительно ограничил свою зависимость от них.

Если я могу дать некоторые рекомендации,

  • Если вы намерены следить за тем, кто открывает файл, рассмотрите возможность использования встроенной в Windows системы безопасности и ведения журнала файловой системы. Его можно настроить на аудит файла и запись в журнал событий безопасности при доступе к файлу. Эту информацию можно легко получить по сети с помощью WMI.
  • Не запускайте ничего под привилегированной учетной записью, если вы не уверены в том, что это будет делать. Ваши файлы Excel могут быть в порядке прямо сейчас, но один пользователь, принесший макровирус, может иметь катастрофические последствия.
  • Если вы должны написать свой собственный «журнал», рассмотрите возможность использования глобального хука для мониторинга (только для мониторинга, а не для изменения или модификации) файла, открываемого Excel. Быстрое приложение, которое регистрируется только при открытии файла Excel, не повлияет на производительность системы и будет намного безопаснее и стабильнее, чем то, что вы предлагаете. Если вы не знакомы с хуками, desaware раньше делала отличные компоненты для хуков и подклассов, и вам следует их проверить. Если вы не очень хорошо знакомы с тем, что делает программа, только отслеживайте сообщения, не пытайтесь «обработать» их для Excel.
  • Надстройка Excel — это просто файл, который добавляет пользовательские функции или функциональные возможности для Excel, чаще всего это VBA в файле xll или xla. Если вам нужна безопасность, не полагайтесь на надстройки для контроля доступа к файлам, потому что их можно легко отключить.

Наиболее эффективным способом контроля за тем, кто открывает файл, будет использование аудита файлов, встроенного в NTFS.

person Cub    schedule 05.10.2009
comment
Спасибо за подробное объяснение. Но я думаю, что аудит файлов NTFS мне не подойдет, так как я хочу проверить файл из общей папки. - person Paresh.Bijvani; 07.10.2009
comment
Тогда вы можете рассмотреть возможность настройки ведения журнала на сервере, на котором размещен файл. Это будет единственный 100% эффективный метод контроля доступа к файлам/изменений. Если у вас есть полный доступ к целевым машинам, вы можете зарегистрировать доверенный сертификат на машинах и написать макрос для ответа на открытие файла. Затем вам нужно будет установить пароль для макросов. Подписав его доверенным сертификатом, он не будет предлагать пользователю отключить макросы при открытии файла. Имейте в виду, однако, что вы все равно можете открыть файл с отключенным макросом (просто удерживая клавишу Shift). - person Cub; 15.10.2009