zoukankan      html  css  js  c++  java
  • 让程序自动以管理员身份运行(用到了DuplicateToken,模拟管理员的身份,不可思议)

    [c-sharp] view plain copy
     
    1. using System;  
    2. using System.Data;  
    3. using System.Configuration;  
    4. using System.Web;  
    5. using System.Web.Security;  
    6. using System.Web.UI;  
    7. using System.Web.UI.WebControls;  
    8. using System.Web.UI.WebControls.WebParts;  
    9. using System.Web.UI.HtmlControls;  
    10. using System.Runtime.InteropServices;  
    11.   
    12. namespace Utility  
    13. {  
    14.     /// <summary>  
    15.     /// 使用此类来模拟某个系统用户(系统帐号、AD等)  
    16.     /// 主要用在需要特别权限的地方,因为IIS的系统帐号权限通常比较低,需要更高级权限时使用此类来替换用户,执行完毕后再换回原来的帐号  
    17.     /// </summary>  
    18.     public class Impersonal  
    19.     {  
    20.         [DllImport("advapi32.dll", SetLastError = true)]  
    21.         public extern static bool LogonUser(String lpszUsername, String lpszDomain,  
    22.             String lpszPassword, int dwLogonType,  
    23.             int dwLogonProvider, ref IntPtr phToken);  
    24.   
    25.         [DllImport("kernel32.dll", CharSet = CharSet.Auto)]  
    26.         public extern static bool CloseHandle(IntPtr handle);  
    27.   
    28.         [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]  
    29.         public extern static bool DuplicateToken(IntPtr ExistingTokenHandle,  
    30.             int SECURITY_IMPERSONATION_LEVEL, ref IntPtr DuplicateTokenHandle);  
    31.   
    32.         const int LOGON32_PROVIDER_DEFAULT = 0;  
    33.         const int LOGON32_LOGON_INTERACTIVE = 2;  
    34.         const int SecurityImpersonation = 2;  
    35.         private IntPtr tokenHandle;  
    36.         private IntPtr dupeTokenHandle;  
    37.         private System.Security.Principal.WindowsImpersonationContext impersonatedUser;  
    38.         private string UserName;  
    39.         private string PWD;  
    40.   
    41.         public Impersonal(string username, string password)  
    42.         {  
    43.             tokenHandle = new IntPtr(0);  
    44.             dupeTokenHandle = new IntPtr(0);  
    45.             UserName = username;  
    46.             PWD = password;  
    47.         }  
    48.           
    49.         /// <summary>  
    50.         /// 开始模拟  
    51.         /// </summary>  
    52.         public void StartImpersonate()  
    53.         {  
    54.             string domainName = string.Empty;  
    55.             string userName = string.Empty;  
    56.               
    57.               
    58.             if (!System.Text.RegularExpressions.Regex.IsMatch(UserName, @"^/w+[//]?/w+$"))  
    59.             {  
    60.                 throw new ApplicationException("非法的用户名");  
    61.             }  
    62.             string[] tmp = UserName.Split(new char[] { '//' });  
    63.             if (tmp.Length > 1)  
    64.             {  
    65.                 domainName = tmp[0];  
    66.                 userName = tmp[1];  
    67.             }  
    68.             else  
    69.             {  
    70.                 userName = tmp[0];  
    71.             }  
    72.             tokenHandle = IntPtr.Zero;  
    73.             dupeTokenHandle = IntPtr.Zero;  
    74.             bool returnValue = LogonUser(userName, domainName, PWD,  
    75.                 LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT,  
    76.                 ref tokenHandle);  
    77.             if (!returnValue)  
    78.             {  
    79.                 throw new ApplicationException("取Handle出错了!");  
    80.             }  
    81.   
    82.             //Console.WriteLine("当前用户是: "  
    83.             //    + WindowsIdentity.GetCurrent().Name);  
    84.   
    85.             bool retVal = DuplicateToken(tokenHandle, SecurityImpersonation, ref dupeTokenHandle);  
    86.             if (!retVal)  
    87.             {  
    88.                 CloseHandle(tokenHandle);  
    89.                 throw new ApplicationException("复制Handle出错了!");  
    90.             }  
    91.             System.Security.Principal.WindowsIdentity newId = new System.Security.Principal.WindowsIdentity(dupeTokenHandle);  
    92.             impersonatedUser = newId.Impersonate();  
    93.   
    94.         }  
    95.         /// <summary>  
    96.         /// 取消模拟  
    97.         /// </summary>  
    98.         public void StopImpersonate()  
    99.         {  
    100.             if (impersonatedUser != null)  
    101.                 impersonatedUser.Undo();  
    102.             if (tokenHandle != IntPtr.Zero)  
    103.                 CloseHandle(tokenHandle);  
    104.             if (dupeTokenHandle != IntPtr.Zero)  
    105.                 CloseHandle(dupeTokenHandle);  
    106.         }  
    107.     }  
    108. }  

    前提你要有系统管理员的密码,如果客户端加入了域,就用域的管理员帐号登录。。

    使用方法
    Impersonal impl=new Impersonal(系统管理员帐号,密码);//例如..Impersonal("Administrator","12345")或者Impersonal("域名/Administrator","12345")
    impl.StartImpersonate();
    运行你的代码
    impl.StopImpersonate(); 

    我给你的类就是实现你想要的功能。用它来模拟管理员的身份,然后执行你想要的操作。

    首先,你需要明白一点,你想要的“自动更改为以管理员身份运行”要有一个前提条件,就是你必须拥有管理员帐号的密码,在本机就是“Administrator”,在AD中就是 “域/Administrator”

    你或者事先已经知道客户电脑的密码,或者弹出一个输入框让用户输入密码。然后:

    Impersonal impl=new Impersonal(“Administrator”,用户输入的密码);
    impl.StartImpersonate(); 
    执行自动升级
    impl.StopImpersonate();
     

    比较简单的方式:
    创建软件的快捷方式.
    右击快捷方式并选择“属性”。
    点击“Advanced”按钮,并勾选“Run as administrator”。
    点“OK”保存更改。
    然后:启动快捷方式就可。
    System.Diagnostics.Process.Start(@"C:/Users/Jason/Desktop/xxx.lnk"); 

    http://blog.csdn.net/jiangxinyu/article/details/5410718

  • 相关阅读:
    六、springboot集成Swagger2
    五、springboot单元测试
    四、Springboot Debug调试
    三、springboot热部署
    二、springboot配置
    一、springboot入门
    SpringBoot整合RabbitMQ
    消息总线
    分布式配置
    路由网关---zuul
  • 原文地址:https://www.cnblogs.com/findumars/p/5811500.html
Copyright © 2011-2022 走看看