Служба Windows: событие разблокировки сеанса с быстрым переключением пользователей и службами терминалов, остановленными и отключенными - PullRequest
2 голосов
/ 14 июля 2011

Я пишу C # .NET 3.5 Windows Service, которая должна выполнять некоторые действия всякий раз, когда происходит вход пользователя в систему или событие разблокировки.Я попытался зарегистрировать службу, добавив обработчик событий в Microsoft.Win32.SystemEvents.SessionSwitch:

using Microsoft.Win32;

SystemEvents.SessionSwitch += new SessionSwitchEventHandler(SystemEvents_SessionSwitch);

void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e)
{
    if (e.Reason == SessionSwitchReason.SessionLogon)
    { 
        //  Do Task
    }
    else if (e.Reason == SessionSwitchReason.SessionUnlock)
    { 
        //  Do Task
    }
}

Также я попытался переопределить метод OnSessionChange(SessionChangeDescription changeDescription) {...}, унаследованный классом ServiceBase:

protected override void OnSessionChange(SessionChangeDescription changeDescription)
{
    if (changeDescription.Reason == SessionChangeReason.SessionLogon)
    {
        //  Do Task
    }
    else if (changeDescription.Reason == SessionChangeReason.SessionUnlock)
    {
        //  Do Task
    }

    base.OnSessionChange(changeDescription);
}

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

Есть ли другой способ сделать это в среде управляемого кода C # .NET?Многие вопросы, которые я видел, отвечают на вопрос описанными выше методами, они работают правильно, но не тогда, когда отключено как быстрое переключение пользователей, так и услуги терминалов.

Ответы [ 2 ]

0 голосов
/ 18 ноября 2016

Если у вас возникли проблемы с SessionSwitchReason, вы можете включить «Другие события входа / выхода из системы» в журнале событий Windows и отслеживать эти события самостоятельно.Это немного грязно, потому что вы должны каким-то образом опрашивать журналы, но это помогает.

Смотрите - https://stackoverflow.com/a/40675839/6715034

0 голосов
/ 03 февраля 2012

По умолчанию для свойства CanHandleSessionChangeEvent установлено значение False.

Вставьте следующий код при инициализации компонентов

public Service1()
        {
            InitializeComponent();
            this.CanHandleSessionChangeEvent = true;
            this.CanHandlePowerEvent = true;
            this.CanPauseAndContinue = true;
            this.CanShutdown = true;
            this.CanStop = true;
            this.AutoLog = true;
        }
...