C#实现关机的功能

namespace ShutDownTest
{
    using System;
    using System.Drawing;
    using System.Collections;
    using System.ComponentModel;
    using System.Windows.Forms;
    using System.Data;
    using System.Runtime.InteropServices;
    using System.Security.Principal;

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public struct LUID
    {
        public uint LowPart;
        public uint HighPart;
    };

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public struct TOKEN_PRIVILEGES
    {
        public uint PrivilegeCount;
        public LUID Luid;
        public uint Attributes;
    };

    public class PlatformImport
    {
        [DllImport("advapi32", CharSet = CharSet.Auto)]
        public static extern bool LookupPrivilegevalue(string sysname, string privname, ref LUID luid);

        [DllImport("advapi32", CharSet = CharSet.Auto)]
        public static extern bool AdjustTokenPrivileges(IntPtr handle, bool dsall, ref TOKEN_PRIVILEGES newstate, int len, IntPtr oldstate, IntPtr retlen);

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

        [DllImport("user32.dll")]
        public static extern bool ExitWindowsEx(int uFlags, int dwReason);
    }

    public class Form1 : Form
    {
        private Button button1;

        public Form1()
        {
            this.button1 = new System.Windows.Forms.Button();
            this.SuspendLayout();
            this.button1.Location = new Point(136, 112);
            this.button1.Name = "button1";
            this.button1.Size = new Size(80, 24);
            this.button1.TabIndex = 0;
            this.button1.Text = "Shut Down";
            this.button1.Click += new EventHandler(this.button1_Click);
            this.AutoScaleBaseSize = new Size(6, 14);
            this.ClientSize = new Size(292, 273);
            this.Controls.Add(button1);
            this.Name = "Form1";
            this.Text = "shutdown test";
            this.ResumeLayout(false);
        }

        [STAThread]
        static void Main()
        {
            Application.Run(new Form1());
        }
        
        private void button1_Click(object sender, System.EventArgs e)
        {
            WindowsIdentity identity = WindowsIdentity.GetCurrent();
            IntPtr token = identity.Token;
            IntPtr luid = (IntPtr)0;
            IntPtr previousState = (IntPtr)0;
            IntPtr previousStateLength = (IntPtr)0;
            LUID privilegeId = new LUID();
            PlatformImport.LookupPrivilegevalue("", "SeShutdownPrivilege", ref privilegeId);
            TOKEN_PRIVILEGES privileges = new TOKEN_PRIVILEGES();
            privileges.PrivilegeCount = 1;
            privileges.Luid = privilegeId;
            privileges.Attributes = 2;
            PlatformImport.AdjustTokenPrivileges(token, false, ref privileges, Marshal.SizeOf(privileges), previousState, previousStateLength);
            if (PlatformImport.GetLastError() != 0) return;
            if (!(PlatformImport.ExitWindowsEx(0x01 | 0x04, 0))) return;
        }
    }
}
Contributors: FHL