让程序自动以管理员身份运行(用到了DuplicateToken,模拟管理员的身份,不可思议)
- using System;
- using System.Data;
- using System.Configuration;
- using System.Web;
- using System.Web.Security;
- using System.Web.UI;
- using System.Web.UI.WebControls;
- using System.Web.UI.WebControls.WebParts;
- using System.Web.UI.HtmlControls;
- using System.Runtime.InteropServices;
- namespace Utility
- {
- /// <summary>
- /// 使用此类来模拟某个系统用户(系统帐号、AD等)
- /// 主要用在需要特别权限的地方,因为IIS的系统帐号权限通常比较低,需要更高级权限时使用此类来替换用户,执行完毕后再换回原来的帐号
- /// </summary>
- public class Impersonal
- {
- [DllImport("advapi32.dll", SetLastError = true)]
- public extern static bool LogonUser(String lpszUsername, String lpszDomain,
- String lpszPassword, int dwLogonType,
- int dwLogonProvider, ref IntPtr phToken);
- [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
- public extern static bool CloseHandle(IntPtr handle);
- [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
- public extern static bool DuplicateToken(IntPtr ExistingTokenHandle,
- int SECURITY_IMPERSONATION_LEVEL, ref IntPtr DuplicateTokenHandle);
- const int LOGON32_PROVIDER_DEFAULT = 0;
- const int LOGON32_LOGON_INTERACTIVE = 2;
- const int SecurityImpersonation = 2;
- private IntPtr tokenHandle;
- private IntPtr dupeTokenHandle;
- private System.Security.Principal.WindowsImpersonationContext impersonatedUser;
- private string UserName;
- private string PWD;
- public Impersonal(string username, string password)
- {
- tokenHandle = new IntPtr(0);
- dupeTokenHandle = new IntPtr(0);
- UserName = username;
- PWD = password;
- }
- /// <summary>
- /// 开始模拟
- /// </summary>
- public void StartImpersonate()
- {
- string domainName = string.Empty;
- string userName = string.Empty;
- if (!System.Text.RegularExpressions.Regex.IsMatch(UserName, @"^/w+[//]?/w+$"))
- {
- throw new ApplicationException("非法的用户名");
- }
- string[] tmp = UserName.Split(new char[] { '//' });
- if (tmp.Length > 1)
- {
- domainName = tmp[0];
- userName = tmp[1];
- }
- else
- {
- userName = tmp[0];
- }
- tokenHandle = IntPtr.Zero;
- dupeTokenHandle = IntPtr.Zero;
- bool returnValue = LogonUser(userName, domainName, PWD,
- LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT,
- ref tokenHandle);
- if (!returnValue)
- {
- throw new ApplicationException("取Handle出错了!");
- }
- //Console.WriteLine("当前用户是: "
- // + WindowsIdentity.GetCurrent().Name);
- bool retVal = DuplicateToken(tokenHandle, SecurityImpersonation, ref dupeTokenHandle);
- if (!retVal)
- {
- CloseHandle(tokenHandle);
- throw new ApplicationException("复制Handle出错了!");
- }
- System.Security.Principal.WindowsIdentity newId = new System.Security.Principal.WindowsIdentity(dupeTokenHandle);
- impersonatedUser = newId.Impersonate();
- }
- /// <summary>
- /// 取消模拟
- /// </summary>
- public void StopImpersonate()
- {
- if (impersonatedUser != null)
- impersonatedUser.Undo();
- if (tokenHandle != IntPtr.Zero)
- CloseHandle(tokenHandle);
- if (dupeTokenHandle != IntPtr.Zero)
- CloseHandle(dupeTokenHandle);
- }
- }
- }
前提你要有系统管理员的密码,如果客户端加入了域,就用域的管理员帐号登录。。
使用方法
Impersonal impl=new Impersonal(系统管理员帐号,密码);//例如..Impersonal("Administrator","12345")或者Impersonal("域名/Administrator","12345")
impl.StartImpersonate();
运行你的代码
impl.StopImpersonate();
|
我给你的类就是实现你想要的功能。用它来模拟管理员的身份,然后执行你想要的操作。
首先,你需要明白一点,你想要的“自动更改为以管理员身份运行”要有一个前提条件,就是你必须拥有管理员帐号的密码,在本机就是“Administrator”,在AD中就是 “域/Administrator” 你或者事先已经知道客户电脑的密码,或者弹出一个输入框让用户输入密码。然后: Impersonal impl=new Impersonal(“Administrator”,用户输入的密码); |
比较简单的方式:
创建软件的快捷方式.
右击快捷方式并选择“属性”。
点击“Advanced”按钮,并勾选“Run as administrator”。
点“OK”保存更改。
然后:启动快捷方式就可。
System.Diagnostics.Process.Start(@"C:/Users/Jason/Desktop/xxx.lnk");
http://blog.csdn.net/jiangxinyu/article/details/5410718
让程序自动以管理员身份运行(用到了DuplicateToken,模拟管理员的身份,不可思议)的更多相关文章
- C# 之 判断或设置以管理员身份运行程序
一.判断程序是否以管理员权限运行 using System.Security.Principal; public bool IsAdministrator() { WindowsIdentity cu ...
- 以不同用户身份运行程序,/savecred只需要输入一次密码(GetTokenByName取得EXPLORER.EXE的令牌,然后调用CreateProcessAsUser,而且使用LoadUserProfile解决另存文件的问题)good
http://blog.sina.com.cn/s/blog_65977dde0100s7tm.html ----------------------------------------------- ...
- [OS] 远程启动计划任务时以管理员身份运行
在Jenkins建了一个task自动启动Selenium的Grid,命令行是这样写的: schtasks /end /tn RestartGrid /s SZTEST201606 /u szdomai ...
- 如何自动以管理员身份运行.NET程序?
原文:如何自动以管理员身份运行.NET程序? windows 7和vista提高的系统的安全性,同时需要明确指定“以管理员身份运行”才可赋予被运行软件比较高级的权限,比如访问注册表等.否则,当以普通身 ...
- C# 让程序自动以管理员身份运行
exe在Vista或Win7下不以管理员权限运行,会被UAC(用户帐户控制)阻止访问系统某些功能,如修改注册表操作等;如何让exe以管理员权限运行呢,方法有两种,一个是直接修改exe属性;另一个是在程 ...
- Delphi Xe2 后的版本如何让Delphi程序启动自动“以管理员身份运行"
由于Vista以后win中加入的UAC安全机制,采用Delphi开发的程序如果不右键点击“以管理员身份运行”,则会报错. 在XE2以上的Delphi版本处理这个问题已经非常简单了. 右建点击工程,选择 ...
- [技巧.Dotnet]轻松实现“强制.net程序以管理员身份运行”。
使用场景: 程序中不少操作都需要特殊权限,有时为了方便,直接让程序以管理员方式运行. (在商业软件中,其实应该尽量避免以管理员身份运行.在安装或配置时,提前授予将相应权限.) 做法: 以C#项目为例: ...
- C#程序用Inno Setup打包,以管理员身份运行的处理方法
一.C#项目端的处理 目标:快捷方式有带盾的标识 在源码的Properties目录中找到 app.manifest,将其中level="asInvoker" 改成 level=&q ...
- C#让程序自动在管理员权限下运行
windows 7和vista提高的系统的安全性,同时需要明确指定“以管理员身份运行”才可赋予被运行软件比较高级的权限,比如访问注册表等.否则,当以普通身份运行的程序需要访问较高级的系统资源时,将会抛 ...
随机推荐
- Creating a simple static file server with Rewrite--reference
Today, I’d like to take a quick moment to demonstrate how to make a simple file server using Rewrite ...
- C#读取Word文档内容代码
首先要添加引用com组件:然后引用: using Word = Microsoft.Office.Interop.Word; 获取内容: /// /// 读取 word文档 返回内容 /// //// ...
- Apache MINA NioSocketAcceptor类的实现
NioSocketAcceptor 继承AbstractPollingIoAcceptor,实现SocketAcceptor接口 public final class NioSocketAccepto ...
- .ignore插件自动忽略
AS自带的.ignore文件 在AS中新建项目时,默认会创建一个.ignore文件,其中默认忽略的是 *.iml .gradle /local.properties /.idea/workspace. ...
- dede 标签调用
调用当前栏目名字 {dede:type}[field:typename /]{/dede:type} 调用某栏目名字 {dede:type typeid='1'}[field:typename /]{ ...
- JAVA中的finalize()方法
[转]JAVA中的finalize()方法 今天早上看Thinking in java的[第四章 初始化和清除].[ 清除:终结和垃圾回收]的时候, 看到了这个东西. 用于清理滴... 当然,这个方 ...
- 【转载】ASP.NET线程安全与静态变量的生命周期浅谈
ASP.NET线程安全所涉及的是什么呢?让我们先来看看静态变量的生命周期问题,下面是我理解的静态变量的生命周期: void Application_Start开始 void Application_E ...
- win7+SQL2008无法打开物理文件 操作系统错误 5:拒绝访问 SQL Sever
今天在win7+SQL2008的环境下操作分离附加数据库,分离出去然后再附加,没有问题.但是一把.mdf文件拷到其它文件夹下就出错,错误如下:无法打开物理文件 "E:\db\MyDB.mdf ...
- GCD多线程 在子线程中获取网络图片 在主线程更新
子线程中得所有数据都可以直接拿到主线程中使用 //当触摸屏幕的时候,从网络上下载一张图片到控制器的view上显示 -(void)touchesBegan:(NSSet *)touches withEv ...
- JTree用法及JTree使用经验总结
import java.awt.Dimension; import java.awt.Color; import javax.swing.JFrame; import javax.swing. ...