C# 實現關機,重啟電腦

Code
using System;
using System.Runtime.InteropServices;
using System.IO;

namespace AutoExitWindows
{
    
/// <summary>
    
/// ExitWindows 的摘要说明。
    
/// 关机、注销windows.
    
/// </summary>
    
/// 
    
public class ExitWindows
    {
        
public const int EWX_LOGOFF = 0//退出(注销)
        
public const int EWX_SHUTDOWN = 1//'关机
        public const int EWX_REBOOT = 2; //
'重启动
        
public const int EWX_FORCE = 4;// '强制关机,即不通知现在活动应用程序让其先自我关闭

        public const int TOKEN_ADJUST_PRIVILEGES = 0x20;
        public const int TOKEN_QUERY = 0x8;
        public const int SE_PRIVILEGE_ENABLED = 0x2;
        public const int ANYSIZE_ARRAY = 1;

        struct LUID
        {
            int lowpart;
            int highpart;

            LUID(int low, int high)
            {
                lowpart = low;
                highpart = high;
            }
        }

        struct LUID_AND_ATTRIBUTES
        {
            LUID pLuid;
            int Attributes;
            public LUID_AND_ATTRIBUTES(LUID luid, int attributes)
            {
                pLuid = luid;
                Attributes = attributes;
            }
        }

        struct TOKEN_PRIVILEGES
        {
            int PrivilegeCount;
            LUID_AND_ATTRIBUTES Privileges;
            public TOKEN_PRIVILEGES(int privilegecount, LUID_AND_ATTRIBUTES privileges)
            {
                PrivilegeCount = privilegecount;
                Privileges = privileges;
            }
        }

        [DllImport("user32", SetLastError = true)]
        static extern int ExitWindowsEx(int uFlags,int dwReserved);

        [DllImport("kernel32", SetLastError = true)]
        static extern int GetCurrentProcess();

        [DllImport("advapi32", SetLastError = true)]
        static extern int LookupPrivilegeValue(string lpSystemName, string lpName, ref LUID lpLuid);

        [DllImport("advapi32", SetLastError = true)]
        static extern int AdjustTokenPrivileges(int TokenHandle, int DisableAllPrivileges, TOKEN_PRIVILEGES NewState, int BufferLength, ref TOKEN_PRIVILEGES PreviousState, int ReturnLength);

        [DllImport("advapi32", SetLastError = true)]
        static extern int OpenProcessToken(int ProcessHandle, int DesiredAccess, ref int TokenHandle);

        public ExitWindows()
        {
            //
            // TODO: 在此处添加构造函数逻辑
            //
        }

        public void CloseWindows(int exittype)
        {
            AdjustTokenPrivilegesForNT();
            ExitWindowsEx(exittype, 0);
        }

        //这个函数就是用于NT关机中使用的
        public static void AdjustTokenPrivilegesForNT()
        {
            int hdlProcessHandle = 0;
            int hdlTokenHandle = 0;
            LUID tmpLuid = new LUID();
            TOKEN_PRIVILEGES tkp;
            TOKEN_PRIVILEGES tkpNewButIgnored = new TOKEN_PRIVILEGES();
            int lBufferNeeded = 0;

            hdlProcessHandle = GetCurrentProcess();
            OpenProcessToken(hdlProcessHandle, TOKEN_ADJUST_PRIVILEGES, ref hdlTokenHandle);

            LookupPrivilegeValue("", "SeShutdownPrivilege", ref tmpLuid);
            LUID_AND_ATTRIBUTES luidtemp = new LUID_AND_ATTRIBUTES(tmpLuid, SE_PRIVILEGE_ENABLED);
            tkp = new TOKEN_PRIVILEGES(1, luidtemp);

            AdjustTokenPrivileges(hdlTokenHandle, 0, tkp, 100, ref tkpNewButIgnored, lBufferNeeded);

        }

    }
}


posted on 2009-06-27 17:01  brake  阅读(657)  评论(0编辑  收藏  举报

我的最愛 聯繫我們 無障礙