ASP.NET模拟其他用户进行关机

ASP.NET模拟其他用户进行关机:
using  System;
using  System.Collections.Generic;
using  System.Text;
using  System.Security.Principal;
using  System.Runtime.InteropServices;

public   class  Impersonate
{
    
#region  模拟
    
private  WindowsImpersonationContext impersonationContext;

    
private   const   int  LOGON32_LOGON_INTERACTIVE  =   2 ;
    
private   const   int  LOGON32_PROVIDER_DEFAULT  =   0 ;

    [DllImport(
" advapi32.dll " , CharSet  =  CharSet.Auto)]
    
private   static   extern   int  LogonUser(String lpszUserName, String lpszDomain, String lpszPassword, 
                  int  dwLogonType,  int  dwLogonProvider,  ref  IntPtr phToken);

    [DllImport(
" advapi32.dll " , CharSet  =  System.Runtime.InteropServices.CharSet.Auto, SetLastError  =   true )]
    
private   extern   static   int  DuplicateToken(IntPtr hToken,  int  impersonationLevel,  ref  IntPtr hNewToken);

    [DllImport(
" advapi32.dll " , CharSet  =  CharSet.Auto, SetLastError  =   true )]
    
private   static   extern   bool  RevertToSelf();

    [DllImport(
" kernel32.dll " , CharSet  =  CharSet.Auto)]
    
private   extern   static   bool  CloseHandle(IntPtr handle);

    
///   <summary>
    
///  模拟一个用户
    
///   </summary>
    
///   <param name="userName"> 用户名 </param>
    
///   <param name="password"> 密码 </param>
    
///   <param name="domain"> 域名/计算机名 </param>
    
///   <returns> true 模拟成功,false 模拟失败 </returns>
     public   bool  ImpersonateUser( string  userName,  string  password,  string  domain)
    {
        WindowsIdentity wi;
        IntPtr token 
=  IntPtr.Zero;
        IntPtr tokenDuplicate 
=  IntPtr.Zero;
        
if  (RevertToSelf())
        {
            
if  (LogonUser(userName, domain, password, 
                        LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, 
ref  token)  !=   0 )
            {
                
if  (DuplicateToken(token,  2 ref  tokenDuplicate)  !=   0 )
                {
                    wi 
=   new  WindowsIdentity(tokenDuplicate);
                    impersonationContext 
=  wi.Impersonate();
                    
if  (impersonationContext  !=   null )
                    {
                        CloseHandle(tokenDuplicate);
                        CloseHandle(token);
                        
return   true ;
                    }
                    
else
                    {
                        
if  (tokenDuplicate  !=  IntPtr.Zero) CloseHandle(tokenDuplicate);
                        
if  (token  !=  IntPtr.Zero) CloseHandle(token);
                        
return   false ;
                    }
                }
                
else
                {
                    
if  (token  !=  IntPtr.Zero) CloseHandle(token);
                    
return   false ;
                }
            }
            
else
                
return   false ;
        }
        
else
            
return   false ;
    }

    
///   <summary>
    
///  取消模拟
    
///   </summary>
     public   void  UndoImpersonation()
    {
        impersonationContext.Undo();
    }
    
#endregion

    
#region  关机
    [StructLayout(LayoutKind.Sequential, Pack 
=   1 )]
    
private   struct  TokPriv1Luid
    {
        
public   int  Count;
        
public   long  Luid;
        
public   int  Attr;
    }

    [DllImport(
" kernel32.dll " , ExactSpelling  =   true )]
    
private   static   extern  IntPtr GetCurrentThread();

    [DllImport(
" advapi32.dll " , ExactSpelling  =   true , SetLastError  =   true )]
    
private   static   extern   bool  OpenThreadToken(IntPtr h,  int  acc,  bool  openAsSelf,  ref  IntPtr phtok);

    [DllImport(
" advapi32.dll " , SetLastError  =   true )]
    
private   static   extern   bool  LookupPrivilegeValue( string  host,  string  name,  ref   long  pluid);

    [DllImport(
" advapi32.dll " , ExactSpelling  =   true , SetLastError  =   true )]
    
private   static   extern   bool  AdjustTokenPrivileges(IntPtr htok,  bool  disall,  ref  TokPriv1Luid newst, 
                 int  len, IntPtr prev, IntPtr relen);

    [DllImport(
" user32.dll " , ExactSpelling  =   true , SetLastError  =   true )]
    
private   static   extern   bool  ExitWindowsEx( int  flg,  int  rea);

    [DllImport(
" advapi32.dll " )]
    
private   static   extern   bool  InitiateSystemShutdown( string  Machinename,  string  Message, 
                  long  Timeout,  bool  ForceAppsClosed,  bool  RebootAfterShutdown);

    
private   const   int  SE_PRIVILEGE_ENABLED  =   0x00000002 ;
    
private   const   int  TOKEN_QUERY  =   0x00000008 ;
    
private   const   int  TOKEN_ADJUST_PRIVILEGES  =   0x00000020 ;
    
private   const   string  SE_SHUTDOWN_NAME  =   " SeShutdownPrivilege " ;
    
private   const   int  EWX_LOGOFF  =   0x00000000 ;
    
private   const   int  EWX_SHUTDOWN  =   0x00000001 ;
    
private   const   int  EWX_REBOOT  =   0x00000002 ;
    
private   const   int  EWX_FORCE  =   0x00000004 ;
    
private   const   int  EWX_POWEROFF  =   0x00000008 ;
    
private   const   int  EWX_FORCEIFHUNG  =   0x00000010 ;

    
///   <summary>
    
///  关机
    
///   </summary>
    
///   <returns></returns>
     public   bool  ShutDown()
    {
        
bool  result;
        TokPriv1Luid tp;
        
// 注意:这里用的是GetCurrentThread,而不是GetCurrentProcess
        IntPtr hproc  =  GetCurrentThread();
        IntPtr htok 
=  IntPtr.Zero;
        
// 注意:这里用的是OpenThreadToken(打开线程令牌),而不是OpenProcessToken(打开进程令牌)
        result  =  OpenThreadToken(hproc, TOKEN_ADJUST_PRIVILEGES  |  TOKEN_QUERY, 
                           true ref  htok);
        tp.Count 
=   1 ;
        tp.Luid 
=   0 ;
        tp.Attr 
=  SE_PRIVILEGE_ENABLED;
        result 
=  LookupPrivilegeValue( null , SE_SHUTDOWN_NAME,  ref  tp.Luid);
        result 
=  AdjustTokenPrivileges(htok,  false ref  tp,  0 , IntPtr.Zero, IntPtr.Zero);
        result 
=  InitiateSystemShutdown( "" "" 60 true false );
        
return  result;
    }
    
#endregion
}
本文地址: http://www.cnblogs.com/anjou/archive/2006/11/30/577279.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值