1 using System;
 2 using System.Runtime.InteropServices;
 3    
 4 class shoutdown{
 5    [StructLayout(LayoutKind.Sequential, Pack=1)]
 6    internal struct TokPriv1Luid
 7    {
 8       public int Count;
 9       public long Luid;
10       public int Attr;
11    }
12 
13    [DllImport("kernel32.dll", ExactSpelling=true) ]
14    internal static extern IntPtr GetCurrentProcess();
15 
16    [DllImport("advapi32.dll", ExactSpelling=true, SetLastError=true) ]
17    internal static extern bool OpenProcessToken( IntPtr h, int acc, ref IntPtr phtok );
18 
19    [DllImport("advapi32.dll", SetLastError=true) ]
20    internal static extern bool LookupPrivilegeValue( string host, string name, ref long pluid );
21 
22    [DllImport("advapi32.dll", ExactSpelling=true, SetLastError=true) ]
23    internal static extern bool AdjustTokenPrivileges( IntPtr htok, bool disall,
24 ref TokPriv1Luid newst, int len, IntPtr prev, IntPtr relen );
25 
26    [DllImport("user32.dll", ExactSpelling=true, SetLastError=true) ]
27    internal static extern bool ExitWindowsEx( int flg, int rea );
28 
29    internal const int SE_PRIVILEGE_ENABLED = 0x00000002;
30    internal const int TOKEN_QUERY = 0x00000008;
31    internal const int TOKEN_ADJUST_PRIVILEGES = 0x00000020;
32    internal const string SE_SHUTDOWN_NAME = "SeShutdownPrivilege";
33    internal const int EWX_LOGOFF = 0x00000000;
34    internal const int EWX_SHUTDOWN = 0x00000001;
35    internal const int EWX_REBOOT = 0x00000002;
36    internal const int EWX_FORCE = 0x00000004;
37    internal const int EWX_POWEROFF = 0x00000008;
38    internal const int EWX_FORCEIFHUNG = 0x00000010;
39 
40    private static void DoExitWin(int flg)
41    {
42       bool ok;
43       TokPriv1Luid tp;
44       IntPtr hproc = GetCurrentProcess();
45       IntPtr htok = IntPtr.Zero;
46       ok = OpenProcessToken( hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref htok );
47       tp.Count = 1;
48       tp.Luid = 0;
49       tp.Attr = SE_PRIVILEGE_ENABLED;
50       ok = LookupPrivilegeValue( null, SE_SHUTDOWN_NAME, ref tp.Luid );
51       ok = AdjustTokenPrivileges( htok, falseref tp, 0, IntPtr.Zero, IntPtr.Zero );
52       ok = ExitWindowsEx( flg, 0 );
53    }
54 
55       public static void Main()
56       {
57          Console.WriteLine("正在关闭计算机……");
58          // 修改 EWX_SHUTDOWN 或者 EWX_LOGOFF, EWX_REBOOT等实现不同得功能。
59          // 在XP下可以看到帮助信息,以得到不同得参数
60          // SHUTDOWN /?
61          DoExitWin(EWX_SHUTDOWN);
62       }
63 }
64 
65  
66 
posted on 2005-12-09 23:01  CIPCHK  阅读(154)  评论(0)    收藏  举报