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

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

使用方法
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

让程序自动以管理员身份运行(用到了DuplicateToken,模拟管理员的身份,不可思议)的更多相关文章

  1. C# 之 判断或设置以管理员身份运行程序

    一.判断程序是否以管理员权限运行 using System.Security.Principal; public bool IsAdministrator() { WindowsIdentity cu ...

  2. 以不同用户身份运行程序,/savecred只需要输入一次密码(GetTokenByName取得EXPLORER.EXE的令牌,然后调用CreateProcessAsUser,而且使用LoadUserProfile解决另存文件的问题)good

    http://blog.sina.com.cn/s/blog_65977dde0100s7tm.html ----------------------------------------------- ...

  3. [OS] 远程启动计划任务时以管理员身份运行

    在Jenkins建了一个task自动启动Selenium的Grid,命令行是这样写的: schtasks /end /tn RestartGrid /s SZTEST201606 /u szdomai ...

  4. 如何自动以管理员身份运行.NET程序?

    原文:如何自动以管理员身份运行.NET程序? windows 7和vista提高的系统的安全性,同时需要明确指定“以管理员身份运行”才可赋予被运行软件比较高级的权限,比如访问注册表等.否则,当以普通身 ...

  5. C# 让程序自动以管理员身份运行

    exe在Vista或Win7下不以管理员权限运行,会被UAC(用户帐户控制)阻止访问系统某些功能,如修改注册表操作等;如何让exe以管理员权限运行呢,方法有两种,一个是直接修改exe属性;另一个是在程 ...

  6. Delphi Xe2 后的版本如何让Delphi程序启动自动“以管理员身份运行"

    由于Vista以后win中加入的UAC安全机制,采用Delphi开发的程序如果不右键点击“以管理员身份运行”,则会报错. 在XE2以上的Delphi版本处理这个问题已经非常简单了. 右建点击工程,选择 ...

  7. [技巧.Dotnet]轻松实现“强制.net程序以管理员身份运行”。

    使用场景: 程序中不少操作都需要特殊权限,有时为了方便,直接让程序以管理员方式运行. (在商业软件中,其实应该尽量避免以管理员身份运行.在安装或配置时,提前授予将相应权限.) 做法: 以C#项目为例: ...

  8. C#程序用Inno Setup打包,以管理员身份运行的处理方法

    一.C#项目端的处理 目标:快捷方式有带盾的标识 在源码的Properties目录中找到 app.manifest,将其中level="asInvoker" 改成 level=&q ...

  9. C#让程序自动在管理员权限下运行

    windows 7和vista提高的系统的安全性,同时需要明确指定“以管理员身份运行”才可赋予被运行软件比较高级的权限,比如访问注册表等.否则,当以普通身份运行的程序需要访问较高级的系统资源时,将会抛 ...

随机推荐

  1. Android项目实战--手机卫士20--拿到已经安装了的程序以及程序管理主界面

    好了,之前我们就讲了高级工具里面的短信备份与还原,那么我们高级工具里面的功能就基本上完成的啦,还有一个叫程序锁的功能而已,但我们今天先不做它先,我们先把我们的程序管理这个功能完成先. 先让大家看一下我 ...

  2. iTunes 11.2更新下载:改善播客阅读

    昨日,苹果公布了iTunes 11.2更新,新版别改善了播客阅读的方法,让用户能够在新的"未播映的"标签中疾速找到没有赏识的单集,其他功用包括主动删去现已播映的单集,并可在&quo ...

  3. TCP/IP源码(59)——TCP中的三个接收队列

    http://blog.chinaunix.net/uid-23629988-id-3482647.html TCP/IP源码(59)——TCP中的三个接收队列  作者:gfree.wind@gmai ...

  4. 用 Java 技术创建 RESTful Web 服务--转载

    简介 JAX-RS (JSR-311) 是为 Java EE 环境下的 RESTful 服务能力提供的一种规范.它能提供对传统的基于 SOAP 的 Web 服务的一种可行替代. 在本文中,了解 JAX ...

  5. [转] jquery 使用方法

    jquery 使用方法 jQuery是目前使用最广泛的javascript函数库.据统计,全世界排名前100万的网站,有46%使用jQuery,远远超过其他库.微软公司 甚至把jQuery作为他们的官 ...

  6. iOS 10 个实用小技巧(总有你不知道的和你会用到的)

    在开发过程中我们总会遇到各种各样的小问题,有些小问题并不是十分容易解决.在此我就总结一下,我在开发中遇到的各种小问题,以及我的解决方法.比较普遍的我就不再提了,这里主要讲一些你可能不知道的(当然,也有 ...

  7. instancetype vs id for Objective-C

    instancetype: 使用 instancetype 编译器和IDE 会做类型检查,而id不会做完整的类型检查. A method with a related result type can ...

  8. js面向对象--类式继承

    //待研究//类式继承 //js中模拟类式继承的3个函数 //简单的辅助函数,让你可以将新函数绑定到对象的 prototype 上 Function.prototype.method = functi ...

  9. project facet java version 1.6 is not supported

    可能你用的jdk1.5的包,而开发是用的jdk1.6,不允许1.5进行安装 法1,选中项目 Properties , 选择 Project Facets,右击选择 Java , Change Vers ...

  10. 关于java中Double类型的运算精度问题(转)

    Java Java double:浮点数:精确计算  public class Test{    public static void main(String args[]){        Syst ...