天天看點

c#調用api控制windows關機示例

本文介紹了c#控制windows關機、重新開機、登出的二種方法,分為調用windows自帶的shutdown.exe關機和調用API關機的方法

方法一:調用windows自帶的shutdown.exe (缺點:會出現倒計時視窗)

System.Diagnostics.Process.Start("shutdown.exe", "-r -f -t 15");

shutdown參數含義:-r關閉并重新開機動此計算機;-f 強制運作的應用程式關閉而沒有警告;-t 15 延時15shutdown.exe的詳細用法: 

shutdown [-i | -l | -s | -r | -a] [-f] [-m //computername] [-t xx] [-c "comment"] [-d up:xx:yy]

沒有參數 顯示此消息(與 ? 相同)

-i 顯示 GUI 界面,必須是第一個選項

-l 登出(不能與選項 -m 一起使用)

-s 關閉此計算機

-r 關閉并重新開機動此計算機

-a 放棄系統關機

-m //computername 遠端計算機關機/重新開機動/放棄

-t xx 設定關閉的逾時為 xx 秒

-c "comment" 關閉注釋(最大 127 個字元)

-f 強制運作的應用程式關閉而沒有警告

-d [u][p]:xx:yy 關閉原因代碼

u 是使用者代碼

p 是一個計劃的關閉代碼

xx 是一個主要原因代碼(小于 256 的正整數)

yy 是一個次要原因代碼(小于 65536 的正整數)

方法二:調用API

    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";

    [Flags]

    public enum ExitWindows : uint

    {

        LogOff = 0x00, //登出

        ShutDown = 0x01, //關機

        Reboot = 0x02, //重新開機

        Force = 0x04,

        PowerOff = 0x08,

        ForceIfHung = 0x10

    }

    [Flags]

    private enum ShutdownReason : uint

    {

        MajorApplication = 0x00040000,

        MajorHardware = 0x00010000,

        MajorLegacyApi = 0x00070000,

        MajorOperatingSystem = 0x00020000,

        MajorOther = 0x00000000,

        MajorPower = 0x00060000,

        MajorSoftware = 0x00030000,

        MajorSystem = 0x00050000,

        MinorBlueScreen = 0x0000000F,

        MinorCordUnplugged = 0x0000000b,

        MinorDisk = 0x00000007,

        MinorEnvironment = 0x0000000c,

        MinorHardwareDriver = 0x0000000d,

        MinorHotfix = 0x00000011,

        MinorHung = 0x00000005,

        MinorInstallation = 0x00000002,

        MinorMaintenance = 0x00000001,

        MinorMMC = 0x00000019,

        MinorNetworkConnectivity = 0x00000014,

        MinorNetworkCard = 0x00000009,

        MinorOther = 0x00000000,

        MinorOtherDriver = 0x0000000e,

        MinorPowerSupply = 0x0000000a,

        MinorProcessor = 0x00000008,

        MinorReconfig = 0x00000004,

        MinorSecurity = 0x00000013,

        MinorSecurityFix = 0x00000012,

        MinorSecurityFixUninstall = 0x00000018,

        MinorServicePack = 0x00000010,

        MinorServicePackUninstall = 0x00000016,

        MinorTermSrv = 0x00000020,

        MinorUnstable = 0x00000006,

        MinorUpgrade = 0x00000003,

        MinorWMI = 0x00000015,

        FlagUserDefined = 0x40000000,

        FlagPlanned = 0x80000000

    }

    [StructLayout(LayoutKind.Sequential, Pack = 1)]

    private struct TokPriv1Luid

    {

        public int Count;

        public long Luid;

        public int Attr;

    }

    [DllImport("kernel32.dll", ExactSpelling = true)]

    private static extern IntPtr GetCurrentProcess();

    [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]

    private static extern bool OpenProcessToken(IntPtr h, int acc, ref IntPtr phtok);

    [DllImport("advapi32.dll", SetLastError = true)]

    private static extern bool LookupPrivilegeValue(string host, string name, ref long pluid);

    [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]

    private static extern bool AdjustTokenPrivileges(IntPtr htok, bool disall, ref TokPriv1Luid newst, int len, IntPtr prev, IntPtr relen);

    [DllImport("user32.dll")]

    private static extern bool ExitWindowsEx(ExitWindows uFlags, ShutdownReason dwReason);

    /// <summary>

    /// 關機、重新開機、登出windows

    /// </summary>

    /// <param name="flag"></param>

    public static void DoExitWindows(ExitWindows flag)

    {

        TokPriv1Luid 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(flag, ShutdownReason.MajorOther);

    }