Switching off computer using C#

Is it possible to switch off computer using c#

I know that it is possible when using c/c++. There is a method called exitWindows or exitWindowsEx, but I can't find it in Visual C# Express Edition 2005



Answer this question

Switching off computer using C#

  • Ron Park

    Thank you very much. It was very helpful.

  • Ayman Shoukry - MSFT

    The .NET framework must by definition call Win32 functions, but it does not expose all the functions that exist. pInvoke fills this gap. The following is a C# class that deals with all the traps involved in shuting down the PC.

    using System;

    using System.Runtime.InteropServices;

    namespace Shutdown

    {

    /// <summary>

    /// Summary description for Shutdown.

    /// </summary>

    public class Shutdown

    {

    [StructLayout(LayoutKind.Sequential, Pack=1)]

    internal struct TokPriv1Luid

    {

    public int Count;

    public long Luid;

    public int Attr;

    }

    [DllImport("kernel32.dll", ExactSpelling=true) ]

    internal static extern IntPtr GetCurrentProcess();

    [DllImport("advapi32.dll", ExactSpelling=true, SetLastError=true) ]

    internal static extern bool OpenProcessToken( IntPtr h, int acc, ref IntPtr phtok );

    [DllImport("advapi32.dll", SetLastError=true) ]

    internal static extern bool LookupPrivilegeValue( string host, string name, ref long pluid );

    [DllImport("advapi32.dll", ExactSpelling=true, SetLastError=true) ]

    internal static extern bool AdjustTokenPrivileges( IntPtr htok, bool disall,

    ref TokPriv1Luid newst, int len, IntPtr prev, IntPtr relen );

    [DllImport("user32.dll", ExactSpelling=true, SetLastError=true) ]

    internal static extern bool ExitWindowsEx( int flg, int rea );

    internal const int SE_PRIVILEGE_ENABLED = 0x00000002;

    internal const int TOKEN_QUERY = 0x00000008;

    internal const int TOKEN_ADJUST_PRIVILEGES = 0x00000020;

    internal const string SE_SHUTDOWN_NAME = "SeShutdownPrivilege";

    internal const int EWX_LOGOFF = 0x00000000;

    internal const int EWX_SHUTDOWN = 0x00000001;

    internal const int EWX_REBOOT = 0x00000002;

    internal const int EWX_FORCE = 0x00000004;

    internal const int EWX_POWEROFF = 0x00000008;

    internal const int EWX_FORCEIFHUNG = 0x00000010;

    private static void DoExitWin( int flg )

    {

    bool ok;

    TokPriv1Luid tp;

    IntPtr hproc = GetCurrentProcess();

    IntPtr htok = IntPtr.Zero;

    ok = OpenProcessToken( hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref htok );

    tp.Count = 1;

    tp.Luid = 0;

    tp.Attr = SE_PRIVILEGE_ENABLED;

    ok = LookupPrivilegeValue( null, SE_SHUTDOWN_NAME, ref tp.Luid );

    ok = AdjustTokenPrivileges( htok, false, ref tp, 0, IntPtr.Zero, IntPtr.Zero );

    ok = ExitWindowsEx( flg, 0 );

    }

    public static void ShutDown()

    {

    DoExitWin( EWX_POWEROFF | EWX_FORCE );

    }

    }

    }



  • Switching off computer using C#