c# .net windows reboot

Reinicie la máquina desde una aplicación C#/ WPF



.net windows (3)

Quiero tener un botón en mi aplicación WPF que reinicie la máquina. Esta aplicación siempre se ejecuta en Vista.

El hecho de que una búsqueda rápida no haya mostrado nada me hace pensar que esto podría ser más difícil de lo que desearía que fuera ... ¿alguna idea? ¡Gracias!


Prueba esto:

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

Esto inicia la herramienta de shutdown incorporada de Windows, que también puede apagar o cerrar la sesión en una máquina remota o local.

Aquí está la lista de opciones completas de 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)

Probablemente notará que he usado el estilo Linux / UNIX para pasar argumentos de la línea de comandos (usando el signo ''-''). En Windows, la convención está utilizando ''/''. Esto no importa, al programa no le importa.


Puede utilizar la API ExitWindowsEx . De 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);

Y para usarlo:

ExitWindowsEx( ExitWindows.Reboot, ShutdownReason.MajorOther | ShutdownReason.MinorOther | ShutdownReason.FlagPlanned );


Una alternativa sería usar WMI (es decir, el espacio de nombres System.Management ); Google trae variaciones en este código -

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