C# code
上面的代码经过了测试,注意在web.config要administrator的权限
// 点击Button1,强制重启 // C#重启服务器代码 using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; using System.Runtime.InteropServices; namespace WebApplication1_advapi { /**/ /// <summary> /// WebForm1 的摘要说明。 /// </summary> public class WebForm1 : System.Web.UI.Page { protected const int SE_PRIVILEGE_ENABLED = 0x2 ; protected const int TOKEN_QUERY = 0x8 ; protected const int TOKEN_ADJUST_PRIVILEGES = 0x20 ; protected const string SE_SHUTDOWN_NAME = " SeShutdownPrivilege " ; protected const int EWX_LOGOFF = 0x0 ; protected const int EWX_SHUTDOWN = 0x1 ; protected const int EWX_REBOOT = 0x2 ; protected const int EWX_FORCE = 0x4 ; protected const int EWX_POWEROFF = 0x8 ; protected System.Web.UI.WebControls.Button Button1; protected const int EWX_FORCEIFHUNG = 0x10 ; [StructLayout(LayoutKind.Sequential, Pack = 1 )] protected struct LuidStruct { public int Count; public long Luid; public int Attr; } [DllImport( " kernel32.dll " , ExactSpelling = true )] protected static extern IntPtr GetCurrentProcess(); [DllImport( " advapi32.dll " , SetLastError = true )] protected static extern bool OpenProcessToken(IntPtr h, int acc, ref IntPtr phtok); [DllImport( " advapi32.dll " , SetLastError = true )] protected static extern bool LookupPrivilegeValue( string host, string name, ref long pluid); [DllImport( " advapi32.dll " , SetLastError = true , ExactSpelling = true )] protected static extern bool AdjustTokenPrivileges(IntPtr htok, bool disall, ref LuidStruct newst, int len, IntPtr prev, IntPtr relen); [DllImport( " user32.dll " , SetLastError = true , ExactSpelling = true )] protected static extern bool ExitWindowsEx( int flg, int rea); protected static void DoExitWindows( int flg) { LuidStruct tp; IntPtr hproc = GetCurrentProcess(); IntPtr htok = IntPtr.Zero; OpenProcessToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref htok); tp.Count = 1 ; tp.Luid = 0 ; tp.Attr = SE_PRIVILEGE_ENABLED; LookupPrivilegeValue( null , SE_SHUTDOWN_NAME, ref tp.Luid); AdjustTokenPrivileges(htok, false , ref tp, 0 , IntPtr.Zero, IntPtr.Zero); ExitWindowsEx(flg, 0 ); } public static void Shutdown() { DoExitWindows(EWX_SHUTDOWN); } public static void Reboot() { DoExitWindows(EWX_REBOOT | EWX_FORCE); } public static void Logoff() { DoExitWindows(EWX_LOGOFF); } [DllImport( " advapi32.dll " , SetLastError = true , ExactSpelling = false )] protected static extern bool InitiateSystemShutdown( string name, string msg, int timeout, bool force, bool reboot); private void Page_Load( object sender, System.EventArgs e) { // 在此处放置用户代码以初始化页面 } Web 窗体设计器生成的代码 #region Web 窗体设计器生成的代码 override protected void OnInit(EventArgs e) { // // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。 // InitializeComponent(); base .OnInit(e); } /**/ /// <summary> /// 设计器支持所需的方法 - 不要使用代码编辑器修改 /// 此方法的内容。 /// </summary> private void InitializeComponent() { this .Button1.Click += new System.EventHandler( this .Button1_Click); this .Load += new System.EventHandler( this .Page_Load); } #endregion private void Button1_Click( object sender, System.EventArgs e) { InitiateSystemShutdown( null , null , 0 , true , true ); } } }
上面的代码经过了测试,注意在web.config要administrator的权限