Shutdown / Restart PC

Madz

Well-known member
Joined
Jan 22, 2003
Messages
155
Is there any way to SHUTDOWN or RESTART computer with .NET framework
I dont want to use API.
 
Dear I have used Win32 API but its not working under XP
in Windows XP it only logoff PC , no restart no shutdown

In XP i did this to restart PC
Code:
Shell("SHUTDOWN -R")

I was just asking about it, rather .NET Framework have any functions some thing like this
 
There is no .NET method to do that. You should use the ExitWindowsEx API instead.
 
But ExitWindowsEx reaise an error when i try to call this method
with this

Code:
ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0)

if i type this code as
Code:
ExitWindowsEx([color=red]EWX_SHUTDOWN[/color], 0)
then there is no problem with other windows but windos XP do not shutdown.

It cause an error if i try to give it more then 1 flags.
 
What error? Are the flags declared? It looks like that should work to me.
 
Youll want to use "Or" instead of the pipe symbol. Add to that the fact that it takes a lot more to shutdown a Windows NT based system than a simple call to ExitWindowsEx. Youll need to acquire the proper security permissions beforehand.
 
Found this with google
http://www.visualcsharp.it/Sorgenti/Shutdown/Shutdown.asp
Coments are in italian, but code is clear...
Code:
using System;
using System.Runtime.InteropServices;
   
class shoutdown{
   [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 Main()
      {
         Console.WriteLine("Sto per spegnere il computer...");
         //Modificare EWX_SHUTDOWN con EWX_LOGOFF, EWX_REBOOT, ecc, ecc...
         DoExitWin(EWX_SHUTDOWN);
      }
}
 
Back
Top