Как отменить выключение из службы Windows C # - PullRequest
1 голос
/ 27 апреля 2010

У меня запущена служба Windows (написано на C # .net2.0).

Я хочу определить, когда компьютер выключится / перезагрузиться, и отменить его. После отмены я хочу выполнить некоторые действия и перезапустить Windows.

Я пробовал, но он не работает

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...
    }
}

Еще один тест:

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

Ответы [ 6 ]

4 голосов
/ 27 апреля 2010

Я бы с этим не связывался. Windows будет рассматривать ваш процесс как зависший процесс (если вы не переходите непосредственно к Win32 API).

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

UPDATE:
Я думаю, что вы застрянете здесь, потому что ваша служба не будет знать , почему Windows закрывается. У вас будет бесконечный цикл:

  • Остановка работы Windows.
  • Сервисные уведомления, прерывание работы, запуск приложения.
  • Пользователь использует приложение для продолжения выключения.
  • Огонь закрытия окна.
  • Уведомления об обслуживании ......
  • Etc.
1 голос
/ 28 апреля 2010

решение состояло в том, чтобы обнаружить выключение с помощью winform: http://msdn.microsoft.com/fr-fr/library/microsoft.win32.systemevents.sessionending%28VS.80%29.aspx

но Windows убивает другой процесс, прежде чем я могу его обнаружить, так что это не лучшее решение!

1 голос
/ 28 апреля 2010

Наконец, я отменяю идею обнаружения и отмены выключения / перезагрузки Windows, Но теперь я хочу обнаружить только "shutdown -r -t xx" !

Обратите внимание, что операционной системой, в которой работает программа, является Windows XP.

Я пробовал, но у меня нет ExitCode с 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) ;
1 голос
/ 27 апреля 2010

Вы можете использовать команду оболочки shutdown -a для отмены выключения. Я не знаю, возможно ли обнаружить отключение, хотя ...

1 голос
/ 27 апреля 2010

AbortSystemShutdown может работать:

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

Хотя я согласен с Нилом, что, вероятно, это не очень хорошая идея.

Редактировать: добавлен пример кода

using System.Runtime.InteropServices;

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


if (!AbortSystemShutdown("localhost"))
{
    int err = Marshal.GetLastWin32Error();
}        
1 голос
/ 27 апреля 2010

Мой совет - записать ваши действия в файл или реестр, например,

DoSomething = true
DoSomethingElse = false

Который вы могли прочитать в OnStart и обработать.

...