как идентифицировать событие входа в систему в окне сервиса - PullRequest
1 голос
/ 14 марта 2011

У меня есть служба Windows, которая получает информацию о пользователе и сохраняет результат в текстовом файле журнала. и, моя проблема заключается в том, что когда я выхожу из системы и снова вхожу в систему, т.е. без перезагрузки компьютера ..., я также хотел бы сэкономить время, когда я регистрирую свою систему в этом файле журнала ... Как можно записать событие входа в систему Windows. Пожалуйста, помогите с комментариями

Я использовал приведенный ниже код, но ничего не было записано в текстовый файл журнала при входе в систему. то есть LogOn no-1 или LogOn no-2 ... Произошла ли какая-либо ошибка, или при входе в систему не было достаточно времени для выполнения процесса ..

     Microsoft.Win32.SystemEvents.SessionSwitch += new Microsoft.Win32.SessionSwitchEventHandler(SystemEvents_SessionSwitch);
 void SystemEvents_SessionSwitch(object sender, Microsoft.Win32.SessionSwitchEventArgs e)
        {
            StreamWriter str = new StreamWriter("D:\\Log.txt", true);
            str.WriteLine("LogOn no-1: " + DateTime.Now.ToString());
            str.Close();
            if (e.Reason == SessionSwitchReason.SessionLogon)
            {
                StreamWriter str1 = new StreamWriter("D:\\Log.txt", true);
                str1.WriteLine("LogOn no-2: " + DateTime.Now.ToString());
                str1.Close();
            }
        }

Ответы [ 3 ]

2 голосов
/ 15 марта 2011

http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicebase.onsessionchange.aspx

Это может быть вашим лучшим выбором, поскольку Vista и Win7 обрабатывают пользовательские сеансы так же, как это делает терминальный сервер.Это должно позволить вам обрабатывать изменения сеанса и дает структуру с соответствующей информацией, если вам нужен идентификатор сеанса или причина изменения сеанса (вход / выход из системы / блокировка и т. Д.)

1 голос
/ 14 марта 2011

Взгляните на класс SystemEvents, вот ссылка MSDN .

В вашем случае важны выставленные события SessionEnded, SessionEnding и SessionSwitch и, возможно, PowerModeChanged.

Быстрый пример может выглядеть так:

SystemEvents.SessionSwitch += OnSessionSwitch;

void OnSessionSwitch(object sender, SessionSwitchEventArgs e)
{
    //implement your logic here
}
0 голосов
/ 15 марта 2011

Эти события не генерируются, если не предусмотрен цикл сообщений;вручную, добавив скрытую форму (или, возможно, позволяя Службе взаимодействовать с рабочим столом - не уверен, что никогда не уставал, возможно, не рекомендуется).

Я бы столкнулся с аналогичной проблемой с одной из служб, не получающей TimeZoneизменения, поэтому пришлось добавить скрытую форму к службе.

Здесь является одним из примеров того, как решить проблему.

И ниже, что ясделал, чтобы решить мою проблему:

Добавил TimeZoneForm к service.sln;

И в OnStart службы добавить этот код: new System.Threading.Thread(RunMessagePump).Start();

И добавить этот метод в файл службы:

private void RunMessagePump()
        {            
            Application.Run(new TimeZoneForm.TimeZoneForm());
        }


internal class TimeZoneForm : Form
    {
        public TimeZoneForm()
        {
            InitializeComponent();
        }

        private void TimeZoneForm_Load(object sender, EventArgs e)
        {
            SystemEvents.TimeChanged += SystemEvents_TimeChanged;            
        }

        private void TimeZoneForm_Closing(object sender, FormClosingEventArgs e)
        {
            SystemEvents.TimeChanged -= SystemEvents_TimeChanged;            
        }

        private void SystemEvents_TimeChanged(object sender, EventArgs e)
        {
            System.Globalization.CultureInfo.CurrentCulture.ClearCachedData();
        }

        private System.ComponentModel.IContainer components = null;

        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        private void InitializeComponent()
        {
            this.SuspendLayout();
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(0, 0);
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
            this.Name = "TimeZoneForm";
            this.Text = "TimeZoneForm";
            this.WindowState = System.Windows.Forms.FormWindowState.Minimized;
            this.Load += this.TimeZoneForm_Load;
            this.FormClosing += this.TimeZoneForm_Closing;
            this.ResumeLayout(false);

        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...