[DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true)]
public static extern bool InitiateSystemShutdownEx(
string lpMachineName,
string lpMessage,
uint dwTimeout,
bool bForceAppsClosed,
bool bRebootAfterShutdown,
ShutdownReason dwReason);
[Flags]
public enum ShutdownReason : uint
{
// Microsoft major reasons.
SHTDN_REASON_MAJOR_OTHER = 0x00000000,
SHTDN_REASON_MAJOR_NONE = 0x00000000,
SHTDN_REASON_MAJOR_HARDWARE = 0x00010000,
SHTDN_REASON_MAJOR_OPERATINGSYSTEM = 0x00020000,
SHTDN_REASON_MAJOR_SOFTWARE = 0x00030000,
SHTDN_REASON_MAJOR_APPLICATION = 0x00040000,
SHTDN_REASON_MAJOR_SYSTEM = 0x00050000,
SHTDN_REASON_MAJOR_POWER = 0x00060000,
SHTDN_REASON_MAJOR_LEGACY_API = 0x00070000,
// Microsoft minor reasons.
SHTDN_REASON_MINOR_OTHER = 0x00000000,
SHTDN_REASON_MINOR_NONE = 0x000000ff,
SHTDN_REASON_MINOR_MAINTENANCE = 0x00000001,
SHTDN_REASON_MINOR_INSTALLATION = 0x00000002,
SHTDN_REASON_MINOR_UPGRADE = 0x00000003,
SHTDN_REASON_MINOR_RECONFIG = 0x00000004,
SHTDN_REASON_MINOR_HUNG = 0x00000005,
SHTDN_REASON_MINOR_UNSTABLE = 0x00000006,
SHTDN_REASON_MINOR_DISK = 0x00000007,
SHTDN_REASON_MINOR_PROCESSOR = 0x00000008,
SHTDN_REASON_MINOR_NETWORKCARD = 0x00000000,
SHTDN_REASON_MINOR_POWER_SUPPLY = 0x0000000a,
SHTDN_REASON_MINOR_CORDUNPLUGGED = 0x0000000b,
SHTDN_REASON_MINOR_ENVIRONMENT = 0x0000000c,
SHTDN_REASON_MINOR_HARDWARE_DRIVER = 0x0000000d,
SHTDN_REASON_MINOR_OTHERDRIVER = 0x0000000e,
SHTDN_REASON_MINOR_BLUESCREEN = 0x0000000F,
SHTDN_REASON_MINOR_SERVICEPACK = 0x00000010,
SHTDN_REASON_MINOR_HOTFIX = 0x00000011,
SHTDN_REASON_MINOR_SECURITYFIX = 0x00000012,
SHTDN_REASON_MINOR_SECURITY = 0x00000013,
SHTDN_REASON_MINOR_NETWORK_CONNECTIVITY = 0x00000014,
SHTDN_REASON_MINOR_WMI = 0x00000015,
SHTDN_REASON_MINOR_SERVICEPACK_UNINSTALL = 0x00000016,
SHTDN_REASON_MINOR_HOTFIX_UNINSTALL = 0x00000017,
SHTDN_REASON_MINOR_SECURITYFIX_UNINSTALL = 0x00000018,
SHTDN_REASON_MINOR_MMC = 0x00000019,
SHTDN_REASON_MINOR_TERMSRV = 0x00000020,
// Flags that end up in the event log code.
SHTDN_REASON_FLAG_USER_DEFINED = 0x40000000,
SHTDN_REASON_FLAG_PLANNED = 0x80000000,
SHTDN_REASON_UNKNOWN = SHTDN_REASON_MINOR_NONE,
SHTDN_REASON_LEGACY_API = (SHTDN_REASON_MAJOR_LEGACY_API | SHTDN_REASON_FLAG_PLANNED),
// This mask cuts out UI flags.
SHTDN_REASON_VALID_BIT_MASK = 0xc0ffffff
}
<DllImport("advapi32.dll", SetLastError:=True)> _
Public Function InitiateSystemShutdownEx( _
ByVal lpMachineName As String, _
ByVal lpMessage As String, _
ByVal Timeout As UInteger, _
<MarshalAs(UnmanagedType.Bool)> ByVal bForceAppsClosed As Boolean, _
<MarshalAs(UnmanagedType.Bool)> ByVal bRebootAfterShutdown As Boolean, _
ByVal ShutdownReason As ShutdownReason) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function
<Flags()> _
Public Enum ShutdownReason As UInteger
' Microsoft major reasons.
SHTDN_REASON_MAJOR_OTHER = &H0UI
SHTDN_REASON_MAJOR_NONE = &H0UI
SHTDN_REASON_MAJOR_HARDWARE = &H10000UI
SHTDN_REASON_MAJOR_OPERATINGSYSTEM = &H20000UI
SHTDN_REASON_MAJOR_SOFTWARE = &H30000UI
SHTDN_REASON_MAJOR_APPLICATION = &H40000UI
SHTDN_REASON_MAJOR_SYSTEM = &H50000UI
SHTDN_REASON_MAJOR_POWER = &H60000UI
SHTDN_REASON_MAJOR_LEGACY_API = &H70000UI
' Microsoft minor reasons.
SHTDN_REASON_MINOR_OTHER = &H0UI
SHTDN_REASON_MINOR_NONE = &HFFUI
SHTDN_REASON_MINOR_MAINTENANCE = &H1UI
SHTDN_REASON_MINOR_INSTALLATION = &H2UI
SHTDN_REASON_MINOR_UPGRADE = &H3UI
SHTDN_REASON_MINOR_RECONFIG = &H4UI
SHTDN_REASON_MINOR_HUNG = &H5UI
SHTDN_REASON_MINOR_UNSTABLE = &H6UI
SHTDN_REASON_MINOR_DISK = &H7UI
SHTDN_REASON_MINOR_PROCESSOR = &H8UI
SHTDN_REASON_MINOR_NETWORKCARD = &H0UI
SHTDN_REASON_MINOR_POWER_SUPPLY = &HAUI
SHTDN_REASON_MINOR_CORDUNPLUGGED = &HBUI
SHTDN_REASON_MINOR_ENVIRONMENT = &HCUI
SHTDN_REASON_MINOR_HARDWARE_DRIVER = &HDUI
SHTDN_REASON_MINOR_OTHERDRIVER = &HEUI
SHTDN_REASON_MINOR_BLUESCREEN = &HFUI
SHTDN_REASON_MINOR_SERVICEPACK = &H10UI
SHTDN_REASON_MINOR_HOTFIX = &H11UI
SHTDN_REASON_MINOR_SECURITYFIX = &H12UI
SHTDN_REASON_MINOR_SECURITY = &H13UI
SHTDN_REASON_MINOR_NETWORK_CONNECTIVITY = &H14UI
SHTDN_REASON_MINOR_WMI = &H15UI
SHTDN_REASON_MINOR_SERVICEPACK_UNINSTALL = &H16UI
SHTDN_REASON_MINOR_HOTFIX_UNINSTALL = &H17UI
SHTDN_REASON_MINOR_SECURITYFIX_UNINSTALL = &H18UI
SHTDN_REASON_MINOR_MMC = &H19UI
SHTDN_REASON_MINOR_TERMSRV = &H20UI
' Flags that end up in the event log code.
SHTDN_REASON_FLAG_USER_DEFINED = &H40000000UI
SHTDN_REASON_FLAG_PLANNED = &H80000000UI
SHTDN_REASON_UNKNOWN = SHTDN_REASON_MINOR_NONE
SHTDN_REASON_LEGACY_API = (SHTDN_REASON_MAJOR_LEGACY_API Or SHTDN_REASON_FLAG_PLANNED)
' This mask cuts out UI flags.
SHTDN_REASON_VALID_BIT_MASK = &HC0FFFFFFUI
End Enum
None.
lpMachineName: The network name of the computer to be shut down. If lpMachineName is NULL or an empty string, the function shuts down the local computer.
dwReason: The ShutdownReason enum can be used for this parameter.
None
C#:
void ShutdownWithPInvoke2()
{
const string SE_SHUTDOWN_NAME = "SeShutdownPrivilege";
const short SE_PRIVILEGE_ENABLED = 2;
const short TOKEN_ADJUST_PRIVILEGES = 32;
const short TOKEN_QUERY = 8;
IntPtr hToken;
TOKEN_PRIVILEGES tkp;
// Get shutdown privileges...
OpenProcessToken(Process.GetCurrentProcess().Handle,
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, out hToken);
tkp.PrivilegeCount = 1;
tkp.Privileges.Attributes = SE_PRIVILEGE_ENABLED;
LookupPrivilegeValue("", SE_SHUTDOWN_NAME, out tkp.Privileges.pLuid);
AdjustTokenPrivileges(hToken, false, ref tkp, 0U, IntPtr.Zero,
IntPtr.Zero);
bool result = InitiateSystemShutdownEx("", "Shuting down upon request from Tablet", 3, true, false, ShutdownReason.SHTDN_REASON_MAJOR_APPLICATION | ShutdownReason.SHTDN_REASON_FLAG_USER_DEFINED);
}
// Structures needed for the API calls
private struct LUID
{
public int LowPart;
public int HighPart;
}
private struct LUID_AND_ATTRIBUTES
{
public LUID pLuid;
public int Attributes;
}
private struct TOKEN_PRIVILEGES
{
public int PrivilegeCount;
public LUID_AND_ATTRIBUTES Privileges;
}
[DllImport("advapi32.dll")]
static extern int OpenProcessToken(IntPtr ProcessHandle,
int DesiredAccess, out IntPtr TokenHandle);
[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")]
static extern int LookupPrivilegeValue(string lpSystemName,
string lpName, out LUID lpLuid);
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool InitiateSystemShutdownEx(
string lpMachineName,
string lpMessage,
uint dwTimeout,
bool bForceAppsClosed,
bool bRebootAfterShutdown,
ShutdownReason dwReason);
[Flags]
public enum ShutdownReason : uint
{
// Microsoft major reasons.
SHTDN_REASON_MAJOR_OTHER = 0x00000000,
SHTDN_REASON_MAJOR_NONE = 0x00000000,
SHTDN_REASON_MAJOR_HARDWARE = 0x00010000,
SHTDN_REASON_MAJOR_OPERATINGSYSTEM = 0x00020000,
SHTDN_REASON_MAJOR_SOFTWARE = 0x00030000,
SHTDN_REASON_MAJOR_APPLICATION = 0x00040000,
SHTDN_REASON_MAJOR_SYSTEM = 0x00050000,
SHTDN_REASON_MAJOR_POWER = 0x00060000,
SHTDN_REASON_MAJOR_LEGACY_API = 0x00070000,
// Microsoft minor reasons.
SHTDN_REASON_MINOR_OTHER = 0x00000000,
SHTDN_REASON_MINOR_NONE = 0x000000ff,
SHTDN_REASON_MINOR_MAINTENANCE = 0x00000001,
SHTDN_REASON_MINOR_INSTALLATION = 0x00000002,
SHTDN_REASON_MINOR_UPGRADE = 0x00000003,
SHTDN_REASON_MINOR_RECONFIG = 0x00000004,
SHTDN_REASON_MINOR_HUNG = 0x00000005,
SHTDN_REASON_MINOR_UNSTABLE = 0x00000006,
SHTDN_REASON_MINOR_DISK = 0x00000007,
SHTDN_REASON_MINOR_PROCESSOR = 0x00000008,
SHTDN_REASON_MINOR_NETWORKCARD = 0x00000000,
SHTDN_REASON_MINOR_POWER_SUPPLY = 0x0000000a,
SHTDN_REASON_MINOR_CORDUNPLUGGED = 0x0000000b,
SHTDN_REASON_MINOR_ENVIRONMENT = 0x0000000c,
SHTDN_REASON_MINOR_HARDWARE_DRIVER = 0x0000000d,
SHTDN_REASON_MINOR_OTHERDRIVER = 0x0000000e,
SHTDN_REASON_MINOR_BLUESCREEN = 0x0000000F,
SHTDN_REASON_MINOR_SERVICEPACK = 0x00000010,
SHTDN_REASON_MINOR_HOTFIX = 0x00000011,
SHTDN_REASON_MINOR_SECURITYFIX = 0x00000012,
SHTDN_REASON_MINOR_SECURITY = 0x00000013,
SHTDN_REASON_MINOR_NETWORK_CONNECTIVITY = 0x00000014,
SHTDN_REASON_MINOR_WMI = 0x00000015,
SHTDN_REASON_MINOR_SERVICEPACK_UNINSTALL = 0x00000016,
SHTDN_REASON_MINOR_HOTFIX_UNINSTALL = 0x00000017,
SHTDN_REASON_MINOR_SECURITYFIX_UNINSTALL = 0x00000018,
SHTDN_REASON_MINOR_MMC = 0x00000019,
SHTDN_REASON_MINOR_TERMSRV = 0x00000020,
// Flags that end up in the event log code.
SHTDN_REASON_FLAG_USER_DEFINED = 0x40000000,
SHTDN_REASON_FLAG_PLANNED = 0x80000000,
SHTDN_REASON_UNKNOWN = SHTDN_REASON_MINOR_NONE,
SHTDN_REASON_LEGACY_API = (SHTDN_REASON_MAJOR_LEGACY_API | SHTDN_REASON_FLAG_PLANNED),
// This mask cuts out UI flags.
SHTDN_REASON_VALID_BIT_MASK = 0xc0ffffff
}
None