C# 实现关机 重启 注销等操作

本文介绍了一种使用C#实现系统重启与关闭的方法。通过调用Windows API函数,获取进程令牌并调整权限来实现安全地重启或关闭系统。文中详细展示了如何利用不同API完成这些操作。
ContractedBlock.gifExpandedBlockStart.gifCode
using   System;   
  
using   System.Runtime.InteropServices;   
    
  
namespace   ExitWindows   
  {   
  
public   class   Class1   
  {   
  [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   LogoOff()   
  {   
  DoExitWin   (     EWX_FORCE   
|   EWX_LOGOFF   );   
  }   
    
    
    
  }   
    

转载于:https://www.cnblogs.com/nginx/archive/2009/08/26/1554009.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值