InitiateSystemShutdownEx (advapi32)
Last changed: -91.166.172.36

.
Summary
Initiates a shutdown and optional restart of the specified computer, and optionally records the reason for the shutdown.

C# Signature:

[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
  }

VB.NET Signature:

<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

User-Defined Types:

None.

Notes:

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.

Tips & Tricks:

None

Sample Code:

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
    }

Alternative Managed API:

None

Documentation