Windows Сервис не записывает в EventLog при автозапуске - PullRequest
0 голосов
/ 05 февраля 2020

У меня проблема ... когда я вручную запускаю / останавливаю службу windows, она работает как положено, и я получаю запись в журнале. Тем не менее, если я выключаю и перезагружаю машину, статус службы работает, но он не регистрировал сообщение о остановке, когда компьютер был выключен, и не регистрировал сообщение о запуске, когда он был включен. Операционная система Windows 10.

Я схожу с ума по этой проблеме. Этот код является наиболее базовым c windows сервисом, написанным на C# и записывающим в журнал методы OnStart и OnClose. Больше ничего.

Я также пытался писать в файловой системе с теми же результатами. Когда руководство запускается / останавливается, оно успешно; но при автоматическом запуске c или при отключении системы происходит сбой.

У меня закончились идеи.

Это код, который я запускаю:

public partial class Service1 : ServiceBase
{
    private bool _loggedLogPath = false;

    public Service1()
    {
        InitializeComponent();

        this.AutoLog = true;
        this.CanHandlePowerEvent = true;
        this.CanHandleSessionChangeEvent = true;
        this.CanPauseAndContinue = true;
        this.CanShutdown = true;
        this.CanStop = true;
        this.CanStop = true;
    }

    private void LogToFile(string message)
    {
        try
        {
            string path = Path.Combine(Environment.GetFolderPath(System.Environment.SpecialFolder.CommonApplicationData), "TestService.txt");

            using (StreamWriter writer = new StreamWriter(path, true))
            {
                writer.WriteLine(String.Concat(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), ": ", message));
                writer.Flush();
            }

            if (!this._loggedLogPath)
            {
                this.EventLog.WriteEntry(String.Concat("The log path is: ", path));
                this._loggedLogPath = true;
            }
        }
        catch
        {
            // Ignore exceptions to avoid crashing the service.
        }

    }

    protected override void OnContinue()
    {
        this.EventLog.WriteEntry("OnContinue method Called.");
        LogToFile("OnContinue method called.");
        base.OnContinue();
    }

    protected override void OnPause()
    {
        this.EventLog.WriteEntry("OnPause method called");
        LogToFile("OnPause method called.");
        base.OnPause();
    }

    protected override bool OnPowerEvent(PowerBroadcastStatus powerStatus)
    {
        this.EventLog.WriteEntry("OnPowerEvent method called");
        LogToFile(String.Format("OnPowerEvent method called ({0}).", powerStatus.ToString()));
        return base.OnPowerEvent(powerStatus);
    }

    protected override void OnSessionChange(SessionChangeDescription changeDescription)
    {
        this.EventLog.WriteEntry(String.Format("OnSessionChange method called ({0}).", changeDescription.Reason.ToString()));
        LogToFile(String.Format("OnSessionChange method called ({0}).", changeDescription.Reason.ToString()));
        base.OnSessionChange(changeDescription);
    }

    protected override void OnShutdown()
    {
        this.EventLog.WriteEntry("OnShutdown method called.");
        LogToFile("OnShutdown method called.");
        base.OnShutdown();
    }

    protected override void OnStart(string[] args)
    {
        this.EventLog.WriteEntry("OnStart method called.");
        LogToFile("OnStart method called.");
        base.OnStart(args);
    }

    protected override void OnStop()
    {
        this.EventLog.WriteEntry("OnStop method called.");
        LogToFile("OnStop method called.");
        base.OnStop();
    }
}

Зарегистрированные сообщения для файловой системы:

2020-02-05 11:17:10: вызван метод OnSessionChange (RemoteConnect).

2020-02-05 11:17 : 13: вызван метод OnSessionChange (SessionLogoff).

2020-02-05 11:17:14: вызван метод OnSessionChange (ConsoleDisconnect).

2020-02-05 11:17:14: Вызван метод OnSessionChange (RemoteDisconnect).

2020-02-05 11:17:15: Вызван метод OnSessionChange (ConsoleConnect).

2020-02-05 11:17:15: Вызван метод OnPowerEvent (Suspend).

2020-02-05 11:17:50: Вызван метод OnPowerEvent (ResumeSuspend).

2020-02-05 11:17:50: Вызван метод OnPowerEvent (ResumeAutomati c).

2020-02-05 11:18:12: Вызван метод OnSessionChange (SessionLogon).

1 Ответ

0 голосов
/ 05 февраля 2020

Вы можете переопределить следующие события, предоставляемые сервисом windows, и проверить, регистрируется ли он в файловой системе.

OnShutdown (), OnPowerEvent ()

Пример:

        /// <summary>
        /// Will be called when system goes to shutdown mode. 
        /// </summary>
        protected override void OnShutdown()
        {
           //Log  
            base.OnShutdown();
        }

Также убедитесь, что установлены свойства, связанные с этими внутри конструктора службы.

        CanPauseAndContinue = true;
        CanHandleSessionChangeEvent = true;
        CanHandlePowerEvent = true;
        CanShutdown = true; 
...