Перезагрузите компьютер из приложения C#/WPF.

Я хочу иметь кнопку в моем приложении WPF, которая перезапускает машину. Это приложение всегда работает в Vista.

Тот факт, что быстрый поиск ничего не дал, заставляет меня думать, что это может быть сложнее, чем мне хотелось бы... есть идеи? Спасибо!


person Josh Santangelo    schedule 31.07.2009    source источник


Ответы (4)


Попробуй это:

System.Diagnostics.Process.Start("shutdown.exe", "-r -t 0");

Это запускает встроенный в Windows инструмент shutdown, который также может выключать или выходить из системы на удаленном или локальном компьютере.

Вот полный список опций с сайта ss64.com:

Syntax

      SHUTDOWN [logoff_option]  [/m \\Computer] [options]

logoff_option:
    /i         Display the GUI (must be the first option)
    /l         Log off. This cannot be used with /m or /d option
    /s         Shutdown
    /r         Shutdown and Restart
    /a         Abort a system shutdown.
               (only during the time-out period)
    /p         Turn off the local computer with no time-out or warning
               (only with /d)
    /h         Hibernate the local computer (only with /f )
    /e         Document the reason for an unexpected shutdown of a computer

Options:

   /m \\Computer  : A remote computer to shutdown.

   /t:xxx         : Time until system shutdown in seconds. 
                    The valid range is xxx=0-600 seconds. [default=30]
   /c "Msg"       : An optional shutdown message [Max 127 chars]

   /f             : Force running applications to close.
                    This will not prompt for File-Save in any open applications.
                    so will result in a loss of all unsaved data!!!

   /d u:xx:yy     : List a USER reason code for the shutdown. 
   /d P:xx:yy     : List a PLANNED reason code for the shutdown.
                     xx Specifies the major reason code (0-255)
                     yy Specifies the minor reason code (0-65536)

Вы, наверное, заметили, что я использовал стиль Linux/UNIX для передачи аргументов командной строки (используя знак '-'). В Windows соглашение использует '/'. Это не имеет значения - программе все равно.

person Lucas Jones    schedule 31.07.2009
comment
это более полезно как для Windows, так и для Linux - person dexiang; 13.04.2018

Вы можете использовать ExitWindowsEx API. С pinvoke.net

[Flags]
public enum ExitWindows : uint
{
   // ONE of the following five:
   LogOff = 0x00,
   ShutDown = 0x01,
   Reboot = 0x02,
   PowerOff = 0x08,
   RestartApps = 0x40,
   // plus AT MOST ONE of the following two:
   Force = 0x04,
   ForceIfHung = 0x10,
}

[Flags]
enum ShutdownReason : uint
{
    MajorApplication = 0x00040000,
    MajorHardware = 0x00010000,
    MajorLegacyApi = 0x00070000,
    MajorOperatingSystem = 0x00020000,
    MajorOther = 0x00000000,
    MajorPower = 0x00060000,
    MajorSoftware = 0x00030000,
    MajorSystem = 0x00050000,

    MinorBlueScreen = 0x0000000F,
    MinorCordUnplugged = 0x0000000b,
    MinorDisk = 0x00000007,
    MinorEnvironment = 0x0000000c,
    MinorHardwareDriver = 0x0000000d,
    MinorHotfix = 0x00000011,
    MinorHung = 0x00000005,
    MinorInstallation = 0x00000002,
    MinorMaintenance = 0x00000001,
    MinorMMC = 0x00000019,
    MinorNetworkConnectivity = 0x00000014,
    MinorNetworkCard = 0x00000009,
    MinorOther = 0x00000000,
    MinorOtherDriver = 0x0000000e,
    MinorPowerSupply = 0x0000000a,
    MinorProcessor = 0x00000008,
    MinorReconfig = 0x00000004,
    MinorSecurity = 0x00000013,
    MinorSecurityFix = 0x00000012,
    MinorSecurityFixUninstall = 0x00000018,
    MinorServicePack = 0x00000010,
    MinorServicePackUninstall = 0x00000016,
    MinorTermSrv = 0x00000020,
    MinorUnstable = 0x00000006,
    MinorUpgrade = 0x00000003,
    MinorWMI = 0x00000015,

    FlagUserDefined = 0x40000000,
    FlagPlanned = 0x80000000
}

[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool ExitWindowsEx(ExitWindows uFlags, ShutdownReason dwReason);

И использовать его:

ExitWindowsEx(
  ExitWindows.Reboot,
  ShutdownReason.MajorOther | ShutdownReason.MinorOther | ShutdownReason.FlagPlanned
); 
person Martin Liversage    schedule 31.07.2009
comment
Это не сработает, если вы также не настроите токен процесса, чтобы получить права на завершение работы. См. ithoughthecamewithyou.com/post/Reboot-computer-in-C-NET. .aspx для класса, который делает это правильно. - person Robert Ellison; 11.09.2010
comment
У меня это работает без установки токена процесса. Приложение WPF с включенным UAC, Win7 x64. - person RandomEngy; 21.07.2011
comment
Вы хотите передать второй параметр в ExitWindowsEx следующим образом: ShutdownReason.MajorOther | ShutdownReason.MinorДругое | ShutdownReason.FlagPlanned. Использование побитового И просто обнуляет аргумент. Система останется с отчетом о незапланированном и неопределенном завершении работы в отслеживании событий завершения работы. Подробнее читайте здесь: msdn.microsoft .com/en-us/library/windows/desktop/ - person Derek W; 20.01.2014
comment
@DerekW: Спасибо, что указали на опечатку и предложили FlagPlanned. Я отредактировал ответ, чтобы включить ваши предложения. - person Martin Liversage; 20.01.2014
comment
@RobertEllison Он работает как администратор в Windows 7, но больше не в Windows 10, которую я сейчас видел. Ошибка 1314. - person ygoe; 12.08.2016
comment
@ygoe › Вы пробовали решение Роберта Элисона? - person AFract; 05.12.2017

Альтернативой может быть использование WMI (т. е. пространства имен System.Management); Google предлагает варианты этого кода —

  ManagementClass W32_OS = new ManagementClass("Win32_OperatingSystem")
  ManagementBaseObject inParams, outParams;
  int result;
  W32_OS.Scope.Options.EnablePrivileges = true;

  foreach(ManagementObject obj in W32_OS.GetInstances())
  {
    inParams = obj.GetMethodParameters("Win32Shutdown");
    inParams["Flags"] = 6; //ForcedReboot; -- fixed to restart rather than shutdown
    inParams["Reserved"] = 0;

    outParams = obj.InvokeMethod("Win32Shutdown", inParams, null)
    result = Convert.ToInt32(outParams["returnValue"]);
    if (result !=0) throw new Win32Exception(result);
  }
person Steve Gilham    schedule 31.07.2009

Рабочий код внутри службы Windows:

var cmd = new System.Diagnostics.ProcessStartInfo("shutdown.exe", "-r -t 0");
cmd.CreateNoWindow = true;
cmd.UseShellExecute = false;
cmd.ErrorDialog = false;
System.Diagnostics.Process.Start(cmd);
person Johann Medina    schedule 25.06.2020