zoukankan      html  css  js  c++  java
  • 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, 2ref 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, 
                               trueref htok);
            tp.Count 
    = 1;
            tp.Luid 
    = 0;
            tp.Attr 
    = SE_PRIVILEGE_ENABLED;
            result 
    = LookupPrivilegeValue(null, SE_SHUTDOWN_NAME, ref tp.Luid);
            result 
    = AdjustTokenPrivileges(htok, falseref tp, 0, IntPtr.Zero, IntPtr.Zero);
            result 
    = InitiateSystemShutdown(""""60truefalse);
            
    return result;
        }
        
    #endregion
    }
    本文地址:http://www.cnblogs.com/anjou/archive/2006/11/30/577279.html
  • 相关阅读:
    spring @Primary-在spring中的使用(十九)
    Java中lombok @Builder注解使用详解(十八)
    Spring Boot的MyBatis注解:@MapperScan和@Mapper(十七)
    js基础只是总结-语句
    js基础知识-数据类型
    启动redis服务报错Creating Server TCP listening socket *:6379: bind: Address already in use [duplicate]
    gitlab 配置SSH和ACCESS TOKEN
    https nginx配置
    Vue和React区别
    深入虚拟DOM和DOM-diff
  • 原文地址:https://www.cnblogs.com/anjou/p/577279.html
Copyright © 2011-2022 走看看