2009-03-20 11 views

Respuesta

10

Una manera fácil: Uso Process.Start para ejecutar Shutdown.exe. P/Invoke una llamada a ExitWindowsEx

Este sería el P/Invoke firma::

[DllImport("aygshell.dll", SetLastError="true")] 
private static extern bool ExitWindowsEx(uint dwFlags, uint dwReserved); 

En todo caso, el usuario que ejecuta el código necesitará sistema de parada

shutdown /s /t 0 
manera programática

privilegios (normalmente no es un problema, pero es un punto importante para recordar).

+0

¿Diría algo acerca de cómo una persona elegiría entre los dos métodos? ¿O es simplemente fácil vs no tan fácil? –

+0

Me gustaría ir por la segunda opción en el software de producción, ya que le da más control (razones de cierre, etc.). Me lleva un poco más de tiempo implementarlo, ya que necesitaría buscar el indicador correcto y la firma. – driis

0

En una suposición (no probado):

Process.Start("shutdown", "-s -t 0"); 
1

Utilice una variación del código "de cierre de sesión de usuario" que se muestra here.

Este código utiliza la llamada API ExitWindowsEx.

0

La manera más difícil, funciona perfectamente en los ordenadores portátiles, aunque tarda algún tiempo:

Spawn a couple endless loops in more threads than cpu cores. 
Wait for overheat which will automatically shutdown a computer. 

:)

+0

¡Tantos votos negativos! ¿Fui solo yo quien encontró la respuesta divertida? – Marcel

+0

entretenido, entonces +1. Recuerda: Todo el trabajo y el juego hacen que Jack sea un chico aburrido .. –

5

diferentes métodos:

A. System.Diagnostics.Process.Start (" Apagado "," -s -t 10 ");

B. Gestión de Windows (WMI)

http://www.csharpfriends.com/Forums/ShowPost.aspx?PostID=36953

http://www.dreamincode.net/forums/showtopic33948.htm

C. System.Runtime.InteropServices Pinvoke

http://bytes.com/groups/net-c/251367-shutdown-my-computer-using-c

D. Sistema de Gestión de

http://www.geekpedia.com/code36_Shut-down-system-using-Csharp.html

Después de enviar, por lo que he visto muchos otros también han publicado ...

+0

+1 para opciones y enlaces –

+0

Aunque digo que todavía estoy pensando, ¿cuándo una persona no solo usaría la primera opción? –

+0

No estoy seguro de si alguien puede deshabilitar los derechos para la ejecución de shutdown.exe, en ese caso, uno podría necesitar código para ejecutar ... – lakshmanaraj

3

WindowsController es una clase contenedora C# en torno ExitWindowsEx.

En ocasiones resulta necesario reiniciar o apagar el sistema operativo de sus aplicaciones (por ejemplo, después de la instalación de un programa). El marco .NET que ofrece una forma indirecta para reiniciar el ordenador a través de los clases de administración de Windows (WMI) en el espacio de nombres System.Management , sin embargo, parece que hay algunos problemas en su aplicación.

Es por eso que hemos creado la clase WindowsController que implementa algunas funciones de API a reinicio y apagado de Windows. Es admite todos los modos ExitWindowsEx y también puede hibernar y suspender el sistema.

Esta clase está disponible en C# y versión VB.NET. Se puede compilar en un módulo .NET o en una biblioteca para ser utilizado desde otros lenguajes .NET. Desde depende de la API de Windows, no funciona en Linux o FreeBSD.

(mentalis.org)

0

También es posible usar InitiateSystemShutdown

http://www.pinvoke.net/default.aspx/advapi32.initiatesystemshutdown

using System; 
using System.Runtime.InteropServices; 
using System.Text; 

public class Program 
{ 
    [DllImport("advapi32.dll") ] 
    public static extern bool InitiateSystemShutdown(string MachineName , string Message , uint Timeout , bool AppsClosed , bool Restart); 

    [DllImport("kernel32.dll") ] 
    public static extern uint GetLastError(); 

    [DllImport("kernel32.dll") ] 
    public static extern uint FormatMessage(uint Flags , IntPtr Source , uint MessageID , uint LanguageID , StringBuilder Buffer , uint Size , IntPtr Args); 



    public static void Main() 
    { 
     InitiateSystemShutdown(System.Environment.MachineName, "hello", 0, false, false); 
     //InitiateSystemShutdown("localhost", "hello", 0, false, false); 

    } 
} 
Cuestiones relacionadas