首页  编辑  

实现关机的代码

Tags: /C#/API调用/   Date Created:

using System ;

using System . Collections . Generic;

using System . Text;

using System . Runtime . InteropServices;

namespace chkipsrv

{

    public class Shudown

   {

       [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 DoFlag, 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 DoFlag)

       {

            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(DoFlag, 0 );

       }

        public static void Reboot()

       {

           DoExitWin(EWX_FORCE | EWX_REBOOT);

       }

        public static void PowerOff()

       {

           DoExitWin(EWX_FORCE | EWX_POWEROFF);

       }

        public static void LogOff()

       {

           DoExitWin(EWX_FORCE | EWX_LOGOFF);

       }

   }

}