注册 | 登录 忘记密码? 51cto首页 | 博客 | 论坛 | 招聘
热点文章 IB客座主编(四)美国西蒙公..
 帮助

C#代码关闭Windows XP


2007-10-14 17:27:34
 标签:.net C#   [推送到技术圈]

版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://51xingfu.blog.51cto.com/219185/46130
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("正在关闭计算机……");
         // 修改 EWX_SHUTDOWN 或者 EWX_LOGOFF, EWX_REBOOT等实现不同得功能。
         // 在XP下可以看到帮助信息,以得到不同得参数
         // SHUTDOWN /?
         DoExitWin(EWX_SHUTDOWN);
      }
}

本文出自 “幸福开心豆” 博客,请务必保留此出处http://51xingfu.blog.51cto.com/219185/46130





    文章评论
 
2007-10-14 20:46:40
学习
看来C#也是很难学的

2007-10-14 21:06:39
恩,知难而上,学什么都不容易,关键是兴趣和坚持吧

2007-10-27 15:41:16
这就一段不太明白
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存放却好像都没有上.

 

发表评论

昵   称:
验证码:  点击图片可刷新验证码  博客过2级,无需填写验证码
内   容: