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);
}
}
}
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);
}
}
}