using System;
using System.Runtime.InteropServices;
public class AdvancedShutdown
{
    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    private struct TokPriv1Luid
    {
        public int Count;
        public long Luid;
        public int Attr;
    }
    // 导入权限相关API
    [DllImport("advapi32.dll", SetLastError = true)]
    private static extern bool OpenProcessToken(IntPtr h, int acc, ref IntPtr phtok);
    [DllImport("advapi32.dll", SetLastError = true)]
    private static extern bool LookupPrivilegeValueA(string host, string name, ref long pluid);
    [DllImport("advapi32.dll", SetLastError = true)]
    private static extern bool AdjustTokenPrivileges(IntPtr htok, bool disall, ref TokPriv1Luid newst, int len, IntPtr prev, IntPtr relen);
    [DllImport("user32.dll", SetLastError = true)]
    private static extern bool ExitWindowsEx(int flg, int rea);
    // 权限常量
    private const int SE_PRIVILEGE_ENABLED = 0x00000002;
    private const int TOKEN_QUERY = 0x00000008;
    private const int TOKEN_ADJUST_PRIVILEGES = 0x00000020;
    private const string SE_SHUTDOWN_NAME = "SeShutdownPrivilege";
    public static void ForceShutdown()
    {
        IntPtr hToken = IntPtr.Zero;
        TokPriv1Luid tp = new TokPriv1Luid { Count = 1, Attr = SE_PRIVILEGE_ENABLED };
        // 获取当前进程令牌并调整权限
        OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref hToken);
        LookupPrivilegeValueA(null, SE_SHUTDOWN_NAME, ref tp.Luid);
        AdjustTokenPrivileges(hToken, false, ref tp, 0, IntPtr.Zero, IntPtr.Zero);
        // 执行强制关机(组合多个标志)
        ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE | EWX_POWEROFF, 0);
    }
    [DllImport("kernel32.dll")]
    private static extern IntPtr GetCurrentProcess();
}
关键说明
权限要求
必须以管理员身份运行程序,可通过以下任一方式实现:
在项目中添加 app.manifest 文件,设置:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
运行时检查权限并提示用户(示例代码见1)。
参数选择
 EWX_FORCE :强制终止未响应程序,但可能导致数据丢失。
 EWX_POWEROFF :物理关闭电源(需硬件支持)8。
若需重启,可改用 EWX_REBOOT 标志822。
错误处理
通过 Marshal.GetLastWin32Error() 获取错误代码1。
常见错误: ERROR_SHUTDOWN_IN_PROGRESS (5)表示已有关机任务。
测试调用
class Program
{
    static void Main()
    {
        try
        {
            AdvancedShutdown.ForceShutdown();
            Console.WriteLine("关机指令已发送");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"错误:{ex.Message}");
        }
    }
}、