How cancel shutdown from a windows service C#

半世苍凉 提交于 2019-11-27 07:24:34

问题


I have a windows service started (written in C# .net2.0).

I want to detect when the computer shutdown/reboot and cancel it. After the cancel I want do some actions and restart windows.

I have tried it, but it not working

using Microsoft.Win32;
partial class MyService: ServiceBase
{
    protected override void OnStart(string[] args)
    {
        SystemEvents.SessionEnding += new SessionEndingEventHandler(OnSessionEnding);
    }

    private void OnSessionEnding(object sender, SessionEndingEventArgs e)
    {
        e.Cancel = true;
        //Do some work...
    }
}

Another test:

partial class MyService: ServiceBase
{
    protected override void OnShutdown()
    {
        //Do some work...
        //base.OnShutdown();
    }
}

回答1:


I wouldn't mess with this. Windows will treat your process like a hung process (unless you go direct to the Win32 API).

My suggestion would be to take note that you're being shutdown, and perhaps schedule the activities to happen on startup?

UPDATE:
I think you're going to get stuck here, because your service won't know why Windows is being shutdown. You'll have an infinite loop:

  • Windows shutdown fires.
  • Service notices, aborts shutdown, launches app.
  • User uses app to continue the shutdown.
  • Window shutdown fires.
  • Service notices......
  • Etc.



回答2:


My advice would be to write your actions out to a file or the registry e.g.

DoSomething = true
DoSomethingElse = false

Which you could read in OnStart and process.




回答3:


You could use the shell command shutdown -a to abort the shutdown. I don't know if it's possible to detect a shutdown though...




回答4:


Finaly I abort the idea of detect and cancel windows shutdown/reboot, But now I want detect only "shutdown -r -t xx" !

Please note the operating system where is running the programme is Windows XP.

I have try it, but I have no ExitCode with WindowsXP:

Process process = new Process();

do
{
    process.StartInfo.FileName = "shutdown.exe";
    process.StartInfo.Arguments = "/a";
    process.Start();
    process.WaitForExit();
    MessageBox.Show(string.Format("ExitCode={0}",process.ExitCode));
    Thread.Sleep(1000);
}
while (process.ExitCode != 0) ;



回答5:


the solution was to detect the shutdown whith a winform : http://msdn.microsoft.com/fr-fr/library/microsoft.win32.systemevents.sessionending%28VS.80%29.aspx

but Windows kill other process before i can detect it, so it's not the better solution!




回答6:


AbortSystemShutdown might work:

http://msdn.microsoft.com/en-us/library/aa376630%28VS.85%29.aspx

Though I agree with Neil that it's probably not a good idea to do this.

Edit: Added sample code

using System.Runtime.InteropServices;

[DllImport("advapi32.dll", SetLastError=true)]
static extern bool AbortSystemShutdown(string lpMachineName);


if (!AbortSystemShutdown("localhost"))
{
    int err = Marshal.GetLastWin32Error();
}        


来源:https://stackoverflow.com/questions/2720125/how-cancel-shutdown-from-a-windows-service-c-sharp

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!