简体   繁体   中英

how to identify logon event in window service

i have a windows service that get user details and save the result into log text file. and, my problem is when i log off my system and login again ie without restarting the machine.., i also would like to save the time that i login my system into that log file.. How can write a login event in window service.. pls help with comments

I have used the below code, but nothing was written to the log text file on log on. ie LogOn no-1 or LogOn no-2... Is there any mistake or logon didnt get enough time to execute the process..

     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();
            }
        }

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

This may be your best bet, as Vista and Win7 handle the user sessions much like a terminal server would. This should let you handle session changes and it gives a structure with the relevant information, if you want session ID or reason for session change (logon / logoff / lock etc)

Take a look into the SystemEvents class, here's the MSDN link .

Relevant in your case are the exposed events SessionEnded , SessionEnding and SessionSwitch and potentially PowerModeChanged .

A quick example might look like this:

SystemEvents.SessionSwitch += OnSessionSwitch;

void OnSessionSwitch(object sender, SessionSwitchEventArgs e)
{
    //implement your logic here
}

These events are not raised unless a message loop is provided; manually by adding a hidden form (or may be allowing the Service to interact with the desktop - not sure never tired, may be not recommended).

I'd a similar issue with one of the services not receiving TimeZone changes, so had to add a hidden form to the service.

Here is one of the examples as to how to solve the issue.

And below is what I did to solve my issue:

Added the TimeZoneForm to the service.sln;

And in the Service's OnStart add this code : new System.Threading.Thread(RunMessagePump).Start();

And add this method to the service file:

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);

        }
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM