Как зарегистрировать автоматически зарегистрированное свойство Windows Service EventLog в другом журнале, чем журнал приложения? - PullRequest
0 голосов
/ 29 апреля 2020

В настоящее время я создаю службу Windows и только что выяснил (благодаря этот ответ), как настроить установщик службы для создания настраиваемого источника журнала событий во время установки. Как я уже понял сам, эти пользовательские источники журналов событий требуют регистрации повышенных привилегий. И именно поэтому регистрация происходит во время установки - потому что установка службы всегда выполняется с повышенными привилегиями. Пока все хорошо.

Однако я не на 100% удовлетворен этим решением, поскольку, как указано в документации ServiceInstaller:

Свойство Log для этого источника устанавливается конструктором ServiceInstaller для журнала приложений компьютера.

И это не то, что я хочу. Я хочу, чтобы события регистрировались в пользовательском журнале под названием «MyCustomLog». Более того, я не могу просто установить ServiceBase.EventLog.Log моей службы на "MyCustomLog". Как я могу индивидуально установить для своей услуги EventLog.Log? И где я должен это делать?

Поскольку я еще не нашел ответа на свой вопрос, я подумал о создании настраиваемого представления для своих событий службы, которое должно было бы выглядеть следующим образом:

enter image description here

Он не заменяет настраиваемый журнал событий, так как события все еще регистрируются в журнале приложений, но позволяет просматривать некоторые события, которые произошли в моем сервисе, так же, как это было бы в пользовательском журнале событий. Итак, как мне программно создать такие пользовательские представления? Это возможно? И если да, то где мне нужно их создавать? Требует ли создание повышенных привилегий, поэтому оно должно быть сделано внутри ServiceInstaller? Или это можно легко сделать внутри конструктора моей службы?

Буду признателен за ответы, касающиеся осуществимости обоих подходов!

1 Ответ

0 голосов
/ 03 мая 2020

Подробнее здесь . Следующее должно работать как минимум в Visual Studio 2017 и Visual Studio 2019.

  1. В обозревателе решений Visual Studio дважды щелкните компонент службы, т. Е. Компонент, производный от ServiceBase. В результате откроется компонент в представлении [Дизайн].
  2. При открытом представлении [Дизайн] откройте сетку свойств, нажав клавишу F4 (или View | Properties Window из меню).
  3. В сетке свойств установите для свойства AutoLog значение false. Это предотвратит запись событий по умолчанию в журнал приложений Windows.
  4. Если вы этого еще не сделали, щелкните правой кнопкой мыши в любом месте представления [Дизайн] служебного компонента и выберите Добавить установщик опция меню. Это добавляет компонент к вашему решению с именем ProjectInstaller по умолчанию.
  5. Обратите внимание, что новый ProjectInstaller автоматически открывается для соответствующего представления [Design]. Чтобы получить его код, щелкните правой кнопкой мыши файл ProjectInstaller.cs в обозревателе решений и выберите пункт меню «Просмотр кода».
  6. Измените содержимое этого файла, чтобы оно выглядело следующим образом. Это обновляет EventLogInstaller для использования выбранного вами имени журнала.
    using System.ComponentModel;
    using System.Configuration.Install;
    using System.Diagnostics;

    namespace YourProjectNamespace
    {
        [RunInstaller(true)]
        public partial class ProjectInstaller : Installer
        {
            public ProjectInstaller()
            {
                InitializeComponent();

                EventLogInstaller installer = FindInstaller(this.Installers);
                if (installer != null)
                {
                    installer.Log = "YourEventLogName"; // enter your event log name here
                }
            }

            private EventLogInstaller FindInstaller(InstallerCollection installers)
            {
                foreach (Installer installer in installers)
                {
                    if (installer is EventLogInstaller)
                    {
                        return (EventLogInstaller)installer;
                    }

                    EventLogInstaller eventLogInstaller = FindInstaller(installer.Installers);
                    if (eventLogInstaller != null)
                    {
                        return eventLogInstaller;
                    }
                }
                return null;
            }
        }
    }
Последний шаг - это включение ie сервисного компонента в журнал пользовательских событий, который вы назвали на шаге 6. Для этого щелкните правой кнопкой сервисный компонент в обозревателе решений и выберите пункт меню «Просмотр кода». Обновите конструктор до следующего:
    public YourServiceName()
    {
        InitializeComponent();

        // This ties the EventLog member of the ServiceBase base class to the
        // YourEventLogName event log created when the service was installed.
        EventLog.Log = "YourEventLogName";
    }
При установке службы в системе должно быть создано YourEventLogName . Если программа просмотра событий уже открыта, вам, вероятно, придется обновить ее sh. Если он все еще не виден, возможно, вам нужно что-то записать в него (я не помню подробности). В любом случае, чтобы записать информацию журнала в пользовательский журнал событий из вашей службы, используйте элемент EventLog компонента службы, например,
    protected override void OnStart(string[] args)
    {
        EventLog.WriteEntry("The service was started successfully.", EventLogEntryType.Information);
    }

    protected override void OnStop()
    {
        EventLog.WriteEntry("The service was stopped successfully.", EventLogEntryType.Information);
    }

    protected override void OnShutdown()
    {
        EventLog.WriteEntry("The service was shutdown successfully", EventLogEntryType.Information);
    }
...