如何在C#程序里关机?
大家好,我现在在做个小程序,要实现在程序里面实现系统的重新启动。 
 这里,我遇到2个难题: 
 1.如何调用外部程序?因为我要运行shutdown.exe来实现关机,我目前知道有个System.Diagnostics.process可以实现调用外部的程序,那还有别的方法来调用外部程序吗? 
 2.我在程序里调用关机后,由于系统要关闭,所以我这个程序也要关闭,可以保证我自己的程序退出时,shutdown.exe不会退出吗?(当然,我要shutdown在一定时间后再关,而不是马上) 
 这个问题我想很久了,请教各位经验者予以帮助,感激不尽,分数不多,聊表心意。 
------解决方案--------------------孟子的 
 http://dotnet.aspx.cc/article/ebe38f5b-bd7e-42c2-73e4-49616f98be3d/read.aspx 
 http://dotnet.aspx.cc/article/1c5e7859-4ab2-4b7f-e29c-9c43136cd98a/read.aspx
------解决方案--------------------using System.Reflection;   
 [DllImport( "user32.dll ", ExactSpelling=true, SetLastError=true) ]  
 internal static extern bool ExitWindowsEx( int flg, int rea );    
   internal const int EWX_LOGOFF = 0x00000000;  
   internal const int EWX_SHUTDOWN = 0x00000001;  
   internal const int EWX_REBOOT = 0x00000002;    
 然后直接调用ExitWindowsEx(EWX_SHUTDOWN,0);
------解决方案--------------------用shutdown 后面的参数也可以的 /t *** ***是多少秒后关机 详细可   
 C:\Documents and Settings\Administrator> shutdown -help 
 用法: shutdown [/i | /l | /s | /r | /a | /p | /h | /e] [/f] 
     [/m \\computer][/t xxx][/d [p:]xx:yy [/c  "comment "]]   
     没有参数   显示帮助。这与键入 /? 是一样的 
     /?         显示帮助。这与不键入任何选项是一样的 
     /i         显示图形用户界面(GUI)。 
                这必须是第一个选项 
     /l         注销。这不能与 /m 或 /d 选项一起使用 
     /s         关闭计算机 
     /r         关闭并重启动计算机 
     /a         放弃系统关闭。 
                这只能在超时过程中使用 
     /p         关闭本地计算机,没有超时或警告。 
                这只能与 /d 选项一起使用 
     /h         休眠本地计算机。 
                这只能与 /f 选项一起使用 
     /e         将计算机的意外关闭原因记入文档 
     /m \\computer 指定目标计算机 
     /t xxx     设置关闭前的超时为 xxx 秒。 
                有效范围是 0-600,默认为 30 
     /c  "comment " 重启动或关闭的原因的注释。 
                最大允许 127 个字符 
     /f         强制正在运行的应用程序关闭而不事先警告用户 
     /d [p:]xx:yy  提供重启动或关闭的原因 
                p 表明重启动或关闭是计划内的 
                xx 是主要原因号(小于 256 的正整数) 
                yy 是次要原因号(小于 65536 的正整数)   
 此计算机上的原因: 
 (E = 预期 U = 意外 P = 计划, C = 自定义) 
 类别    主要    次要    标题   
  U      0       0       其他(没有计划的) 
 E       0       0       其他(没有计划的) 
 E P     0       0       其他(计划的) 
  U      0       5       其他故障: 系统没有反应 
 E       1       1       硬件: 维护(没有计划的) 
 E P     1       1       硬件: 维护(计划的) 
 E       1       2       硬件: 安装(没有计划的) 
 E P     1       2       硬件: 安装(计划的) 
   P     2       3       操作系统: 升级(计划的) 
 E       2       4       操作系统: 重新配置(没有计划的) 
 E P     2       4       操作系统: 重新配置(计划的) 
   P     2       16      操作系统: 服务包(计划中) 
         2       17      操作系统: 热修补(没有计划) 
   P     2       17      操作系统: 热修补(计划中) 
         2       18      操作系统: 安全修补(没有计划) 
   P     2       18      操作系统: 安全修补(计划中) 
 E       4       1       应用程序: 维护(没有计划的) 
 E P     4       1       应用程序: 维护(计划的) 
 E P     4       2       应用程序: 安装(计划中) 
 E       4       5       应用程序: 没有反应 
 E       4       6       应用程序: 不稳定 
  U      5       15      系统故障: 停止错误 
 E       5       19      安全问题 
  U      5       19      安全问题 
 E P     5       19      安全问题 
 E       5       20      网络连接性丢失(没有计划的) 
  U      6       11      电源故障: 电线被拔掉 
  U      6       12      电源故障: 环境 
   P     7       0       旧版 API 关机 
------解决方案--------------------private void timer1_Tick(object sender, EventArgs e) 
         { 
             if (DateTime.Now.Hour == 16 || DateTime.Now.Hour == 4) 
             { 
                 System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo( "SHUTDOWN.EXE ");