1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
|
#region Reboot
#region Shutdown argument type definitions
/// <summary>
/// Defines the methods of shutting down the system.
/// </summary>
[Flags]
public enum ShutdownMethod : uint
{
LogOff = 0x00,
ShutDown = 0x01,
Reboot = 0x02,
Force = 0x04,
PowerOff = 0x08,
ForceIfHung = 0x10
}
/// <summary>
/// Defines the reason for the shutdown of the system.
/// </summary>
[Flags]
public 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
}
#endregion
#region Win32 Imports
[DllImport("user32.dll")]
static extern bool ExitWindowsEx(ShutdownMethod uMethod, ShutdownReason dwReason);
[DllImport("advapi32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool AdjustTokenPrivileges(IntPtr TokenHandle,
[MarshalAs(UnmanagedType.Bool)]bool DisableAllPrivileges,
ref TOKEN_PRIVILEGES NewState,
UInt32 BufferLength,
IntPtr PreviousState,
IntPtr ReturnLength);
[DllImport("advapi32.dll", SetLastError = true)]
static extern bool OpenProcessToken(IntPtr ProcessHandle,
UInt32 DesiredAccess, out IntPtr TokenHandle);
[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern bool LookupPrivilegeValue(string lpSystemName, string lpName,
out LUID lpLuid);
[StructLayout(LayoutKind.Sequential)]
private struct TOKEN_PRIVILEGES
{
public int PrivilegeCount;
public LUID Luid;
public int Attributes;
}
[StructLayout(LayoutKind.Sequential)]
private struct LUID
{
public uint LowPart;
public uint HighPart;
}
private const int TOKEN_QUERY = 0x08;
private const int TOKEN_ADJUST_PRIVILEGES = 0x20;
private const string SE_SHUTDOWN_NAME = "SeShutdownPrivilege";
private const int SE_PRIVILEGE_ENABLED = 0x02;
#endregion
#endregion
#region reboot utils
#region Private Methods
/// <summary>
/// Adjust the token of the current process to include shutdown privileges.
/// </summary>
/// <returns>True on success, false on error.</returns>
static private bool AdjustShutdownTokenPriveleges()
{
bool ret;
IntPtr hProc = IntPtr.Zero;
IntPtr hToken = IntPtr.Zero;
LUID luidRestore;
TOKEN_PRIVILEGES tokenPriviliges;
// get the current current process security token
hProc = System.Diagnostics.Process.GetCurrentProcess().Handle;
ret = OpenProcessToken(hProc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, out hToken);
if (!ret)
return false;
// lookup the LUID for the shutdown privilege
ret = LookupPrivilegeValue(String.Empty, SE_SHUTDOWN_NAME, out luidRestore);
if (!ret)
return false;
// adjust the privileges of the current process to include the shutdown privilege
tokenPriviliges.PrivilegeCount = 1;
tokenPriviliges.Luid = luidRestore;
tokenPriviliges.Attributes = SE_PRIVILEGE_ENABLED;
TOKEN_PRIVILEGES tokenTemp = new TOKEN_PRIVILEGES();
ret = AdjustTokenPrivileges(hToken, false, ref tokenPriviliges, 0, IntPtr.Zero, IntPtr.Zero);
if (!ret)
return false;
return true;
}
#endregion
#endregion
public virtual bool Reboot(RebootReason reason)
{
// Adjust the process privilege
bool ret = AdjustShutdownTokenPriveleges();
if (!ret)
return false;
// exit windows
return ExitWindowsEx(ShutdownMethod.Reboot, ParseRebootReason(reason));
} |
Partager