Search
Module:
Directory

   Desktop Functions:

   Smart Device Functions:


Show Recent Changes
Subscribe (RSS)
Misc. Pages
Comments
FAQ
Helpful Tools
Playground
Suggested Reading
Website TODO List
Download Visual Studio Add-In

InitiateSystemShutdown (advapi32)
 
.
Summary
TODO - a short description

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:

using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace Win32
{
    /// <summary>
    /// Summary description for ShutdownHelper.
      /// </summary>
    public class ShutdownHelper
    {
        private ShutdownHelper()
        {
        }

        [Flags]
            public enum TokenAccessType : uint
        {
            TOKEN_ASSIGN_PRIMARY    = 0x0001,
            TOKEN_DUPLICATE     = 0x0002,
            TOKEN_IMPERSONATE       = 0x0004,
            TOKEN_QUERY         = 0x0008,
            TOKEN_QUERY_SOURCE      = 0x0010,
            TOKEN_ADJUST_PRIVILEGES = 0x0020,
            TOKEN_ADJUST_GROUPS     = 0x0040,
            TOKEN_ADJUST_DEFAULT    = 0x0080,
            TOKEN_ADJUST_SESSIONID  = 0x0100,

            TOKEN_ALL_ACCESS    =
                0xF0000 |
                TOKEN_ASSIGN_PRIMARY |
                TOKEN_DUPLICATE |
                TOKEN_IMPERSONATE |
                TOKEN_QUERY |
                TOKEN_QUERY_SOURCE |
                TOKEN_ADJUST_PRIVILEGES |
                TOKEN_ADJUST_GROUPS |
                TOKEN_ADJUST_DEFAULT |
                TOKEN_ADJUST_SESSIONID,

            TOKEN_READ    =
                0xF0000      |
                TOKEN_QUERY,

            TOKEN_WRITE =
                0xF0000     |
                TOKEN_ADJUST_PRIVILEGES   |
                TOKEN_ADJUST_GROUPS       |
                TOKEN_ADJUST_DEFAULT,

            TOKEN_EXECUTE =
                0xF0000
        }

        [DllImport("advapi32.dll", CallingConvention=CallingConvention.Winapi, SetLastError=true)]
        private static extern bool OpenProcessToken(IntPtr hProcess,
            TokenAccessType dwDesiredAccess, out IntPtr hToken);

        [DllImport("advapi32.dll", CallingConvention=CallingConvention.Winapi,
             SetLastError=true, CharSet=CharSet.Auto)]
        public static extern bool LookupPrivilegeName(
            string lpSystemName,
            [In]ref LUID lpLuid,
            [Out] char[] lpName,
            ref int cbName);

        [DllImport("advapi32.dll", CallingConvention=CallingConvention.Winapi,
             SetLastError=true, CharSet=CharSet.Auto)]
        public static extern bool LookupPrivilegeValue(string lpSystemName,
            string lpName, out LUID Luid);

        [StructLayout(LayoutKind.Sequential)]
            public struct LUID
        {
            public int LowPart;
            public int HighPart;
        }    

        private class Luid
        {
            private readonly LUID _luid;
            public Luid(LUID luid)
            {
                _luid = luid;
            }
            /*public UInt64 Value
            {
                get
                {
                    return (((UInt64)(_luid.HighPart)) << 32) | ((UInt64)_luid.LowPart);
                }
            }*/
            internal LUID GetNativeLUID()
            {
                return _luid;
            }
        }

        [StructLayout(LayoutKind.Sequential)]
            public struct LUID_AND_ATTRIBUTES
        {
            public LUID Luid;
            public int Attributes;
        }

        [StructLayout(LayoutKind.Sequential)]
            public struct TOKEN_PRIVILEGES
        {
            public const int Size = 1;
            public int PrivilegeCount;
            public LUID_AND_ATTRIBUTES Privileges;
        }

        [DllImport("advapi32.dll", CallingConvention=CallingConvention.Winapi,
             SetLastError=true, CharSet=CharSet.Auto)]
        public static extern bool AdjustTokenPrivileges(
            IntPtr TokenHandle,
            bool DisableAllPrivileges,
            ref TOKEN_PRIVILEGES NewState,
            int BufferLength,
            IntPtr PreviousState,
            out int ReturnLength);

        [Flags]
            public enum PrivilegeAttributes : uint
        {
            Disabled      = 0,
            EnabledByDefault  = 0x00000001,
            Enabled       = 0x00000002,
            UsedForAccess     = 0x80000000,
        }

        [DllImport("advapi32.dll", SetLastError = true)]
        private static extern bool InitiateSystemShutdown(
            [MarshalAs(UnmanagedType.LPTStr)]string machineName,
            [MarshalAs(UnmanagedType.LPTStr)]string message,
            int timeout, bool forceAppClosed, bool rebootAfterShutdown);

        public static void DoShutdown(string message)
        {
            Console.WriteLine("Restart");
            IntPtr token;
            if (!OpenProcessToken(Process.GetCurrentProcess().Handle,
                TokenAccessType.TOKEN_ADJUST_PRIVILEGES | TokenAccessType.TOKEN_QUERY,
                out token))
                ReportWin32Error();

            TOKEN_PRIVILEGES tkp = new TOKEN_PRIVILEGES();
            tkp.PrivilegeCount = TOKEN_PRIVILEGES.Size;
            tkp.Privileges.Attributes = 2;
            if (!LookupPrivilegeValue(null, "SeShutdownPrivilege", out tkp.Privileges.Luid))
                ReportWin32Error();

            int rl = 0;
            if (!AdjustTokenPrivileges(token, false, ref tkp, 0, IntPtr.Zero, out rl))
                ReportWin32Error();

            if (!InitiateSystemShutdown(null, message,
                0, true, true))
                ReportWin32Error();

            EventLog.WriteEntry("Service name", message, EventLogEntryType.Error);
        }

        private static void ReportWin32Error()
        {
            string msg = new Win32Exception().Message;
            Console.WriteLine(msg);
            EventLog.WriteEntry(RsdnWD.Name, msg,
                EventLogEntryType.Error);
        }
    }
}

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

Please edit this page!

Do you have...

  • helpful tips or sample code to share for using this API in managed code?
  • corrections to the existing content?
  • variations of the signature you want to share?
  • additional languages you want to include?

Select "Edit This Page" on the right hand toolbar and edit it! Or add new pages containing supporting types needed for this API (structures, delegates, and more).

 
Access PInvoke.net directly from VS:
Terms of Use
Find References
Show Printable Version
Revisions