InitiateSystemShutdown (advapi32)
Last changed: Douglas Freed (anonymous.160.mathew.scott&gmail.com)-198.111.152.212

.
Summary
Initiate the system shutdown

C# Signature:

[DllImport("advapi32.dll")]
static extern bool InitiateSystemShutdown(
            [MarshalAs(UnmanagedType.LPStr)] string lpMachinename,
            [MarshalAs(UnmanagedType.LPStr)] string lpMessage,
            Int32 dwTimeout,
            bool bForceAppsClosed,
            bool bRebootAfterShutdown);

VB Signature:

Declare Function InitiateSystemShutdown Lib "advapi32.dll" (TODO) As TODO

User-Defined Types:

None.

Notes:

None.

Tips & Tricks:

Please add some!

Sample Code: sivakumar.keerthi

***

using System;

using System.Drawing;

using System.Collections;

using System.ComponentModel;

using System.Windows.Forms;

using System.Data;

using System.Text;

using System.Runtime.InteropServices;

namespace ShutDown

{

    /// <summary>
    /// Summary description for Form1.
    /// </summary>
    public class FrmMain : System.Windows.Forms.Form
    {
        private System.Windows.Forms.Button CmdExit;
        private System.Windows.Forms.Label LblTimeout;
        private System.Windows.Forms.NumericUpDown NumTimeOut;
        private System.Windows.Forms.CheckBox chkReboot;
        private System.Windows.Forms.Button CmdShutDown;
        [ DllImport( "advapi32.dll" ) ]
        public static extern bool InitiateSystemShutdown( string MachineName , string Message , uint Timeout , bool AppsClosed , bool Restart );
        [ DllImport( "kernel32.dll" ) ]
        public static extern uint GetLastError();
        [ DllImport( "kernel32.dll" ) ]
        public static extern uint FormatMessage( uint Flags , IntPtr Source , uint MessageID , uint LanguageID , StringBuilder Buffer , uint Size , IntPtr Args );
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.Container components = null;

        public FrmMain()
        {
            //
            // Required for Windows Form Designer support
            //
            InitializeComponent();
            Image Img = Image.FromFile( Application.StartupPath + "\\" + "ShutDown.gif" );
            CmdShutDown.Image = Img;
            this.ShowInTaskbar = false;
            //
            // TODO: Add any constructor code after InitializeComponent call
            //
        }

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if (components != null)
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }

        #region Windows Form Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.CmdExit = new System.Windows.Forms.Button();
            this.LblTimeout = new System.Windows.Forms.Label();
            this.NumTimeOut = new System.Windows.Forms.NumericUpDown();
            this.chkReboot = new System.Windows.Forms.CheckBox();
            this.CmdShutDown = new System.Windows.Forms.Button();
            ((System.ComponentModel.ISupportInitialize)(this.NumTimeOut)).BeginInit();
            this.SuspendLayout();
            //
            // CmdExit
            //
            this.CmdExit.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
            this.CmdExit.Font = new System.Drawing.Font("Courier New", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
            this.CmdExit.ForeColor = System.Drawing.Color.Red;
            this.CmdExit.Location = new System.Drawing.Point(287, 178);
            this.CmdExit.Name = "CmdExit";
            this.CmdExit.TabIndex = 0;
            this.CmdExit.Text = "Exit";
            this.CmdExit.Click += new System.EventHandler(this.CmdExit_Click);
            //
            // LblTimeout
            //
            this.LblTimeout.AutoSize = true;
            this.LblTimeout.BackColor = System.Drawing.Color.Black;
            this.LblTimeout.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
            this.LblTimeout.ForeColor = System.Drawing.Color.White;
            this.LblTimeout.Location = new System.Drawing.Point(6, 180);
            this.LblTimeout.Name = "LblTimeout";
            this.LblTimeout.Size = new System.Drawing.Size(64, 17);
            this.LblTimeout.TabIndex = 1;
            this.LblTimeout.Text = "Time out";
            this.LblTimeout.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
            //
            // NumTimeOut
            //
            this.NumTimeOut.Location = new System.Drawing.Point(77, 180);
            this.NumTimeOut.Maximum = new System.Decimal(new int[] {
                                                                       600,
                                                                       0,
                                                                       0,
                                                                       0});
            this.NumTimeOut.Name = "NumTimeOut";
            this.NumTimeOut.Size = new System.Drawing.Size(56, 21);
            this.NumTimeOut.TabIndex = 2;
            //
            // chkReboot
            //
            this.chkReboot.ForeColor = System.Drawing.Color.White;
            this.chkReboot.Location = new System.Drawing.Point(278, 144);
            this.chkReboot.Name = "chkReboot";
            this.chkReboot.Size = new System.Drawing.Size(80, 24);
            this.chkReboot.TabIndex = 3;
            this.chkReboot.Text = "Restart";
            this.chkReboot.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
            this.chkReboot.CheckedChanged += new System.EventHandler(this.chkReboot_CheckedChanged);
            //
            // CmdShutDown
            //
            this.CmdShutDown.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
            this.CmdShutDown.ForeColor = System.Drawing.Color.White;
            this.CmdShutDown.Location = new System.Drawing.Point(136, 48);
            this.CmdShutDown.Name = "CmdShutDown";
            this.CmdShutDown.Size = new System.Drawing.Size(100, 80);
            this.CmdShutDown.TabIndex = 4;
            this.CmdShutDown.Text = "ShutDown";
            this.CmdShutDown.TextAlign = System.Drawing.ContentAlignment.BottomCenter;
            this.CmdShutDown.Click += new System.EventHandler(this.CmdShutDown_Click);
            //
            // FrmMain
            //
            this.AutoScaleBaseSize = new System.Drawing.Size(8, 14);
            this.BackColor = System.Drawing.Color.Black;
            this.ClientSize = new System.Drawing.Size(368, 208);
            this.Controls.Add(this.CmdShutDown);
            this.Controls.Add(this.chkReboot);
            this.Controls.Add(this.NumTimeOut);
            this.Controls.Add(this.LblTimeout);
            this.Controls.Add(this.CmdExit);
            this.Font = new System.Drawing.Font("Courier New", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
            this.Name = "FrmMain";
            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
            ((System.ComponentModel.ISupportInitialize)(this.NumTimeOut)).EndInit();
            this.ResumeLayout(false);

        }
        #endregion

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.Run(new FrmMain());
        }

        private void CmdExit_Click(object sender, System.EventArgs e)
        {
            Application.Exit();
        }

        private void chkReboot_CheckedChanged(object sender, System.EventArgs e)
        {
            if ( chkReboot.Checked )
                NumTimeOut.Enabled = false;
            else
                NumTimeOut.Enabled = true;
        }

        private void CmdShutDown_Click(object sender, System.EventArgs e)
        {
            try
            {
                string MachineName = Environment.MachineName;
                uint TimeOut = 0;
                string Message = string.Empty;
                if ( chkReboot.Checked )
                    TimeOut = 0;
                else
                {
                    TimeOut = uint.Parse( NumTimeOut.Value.ToString() );
                    Message = "Your system will shutdown in " + TimeOut.ToString() + " seconds";
                }
                bool AppsClosed = false;
                bool Restart = chkReboot.Checked;
                StringBuilder Buffer = new StringBuilder( 512 );
                uint MessageLength = 0;
                GetLastError();
                if ( !InitiateSystemShutdown( MachineName , Message , TimeOut , AppsClosed , Restart ) )
                {
                    MessageLength = FormatMessage( 0x00001000 , IntPtr.Zero , GetLastError() , 0 , Buffer , ( uint )Buffer.Capacity , IntPtr.Zero );
                    if( MessageLength > 0 )
                    {
                        string Error = Buffer.ToString();
                        Error = Error.Substring( 0 , Error.Length - 2 );
                        MessageBox.Show( Error + " (" + GetLastError().ToString() + ")" );
                    }
                }
            }
            catch( Exception ex )
            {
                MessageBox.Show( ex.Message );
            }
        }
    }

}

***

Alternative Managed API:

    Public ErrMsg As String
    Private Flag As Integer = 8

    Function ShutdownPC(ByVal PC_Name As String, ByVal forced As Boolean) As Boolean
    Dim wmi As ManagementClass
    Dim objs As ManagementObjectCollection
    Dim obj As ManagementObject
    Dim Result As Integer

    If forced = True Then
        Flag += 4
    End If
    Try
        wmi = New ManagementClass("\\" & PC_Name & "\root\cimv2:Win32_OperatingSystem")
        objs = wmi.GetInstances()
        For Each obj In objs
        ' Get an input parameters object for this method
        Dim inParams As ManagementBaseObject = obj.GetMethodParameters("Win32Shutdown")
        ' fill 'em in
        inParams("Flags") = Flag
        inParams("Reserved") = 0
        ' do it!
        Dim outParams As ManagementBaseObject = obj.InvokeMethod("Win32Shutdown", inParams, Nothing)
        Result = Convert.ToInt32(outParams("returnValue"))
        If Result <> 0 Then
            ErrMsg = ErrorToString(Result)
            Return False
        End If
        Exit For
        Next
    Catch ex As Exception
        ErrMsg = ex.Message
        Return False
    End Try

    Return True
    End Function

Documentation