Impersonate让你的子线程也具有主线程的执行权限
系统部署在某些复杂的网络环境中,对权限的控制较为严格,无法给IIS用户授予更多的权限,而有些操作(比如对数据库的操作)又必须拥有权限才能成功。
为了让子线程也和主线程拥有相同的权限,则可以使用Impersonate方法。
using System.Runtime.InteropServices;
using System.Security.Principal;
/// <summary>
/// Summary description for ThreadImpersonate
/// </summary>
public class ThreadImpersonate
{
public const int LOGON32_LOGON_INTERACTIVE = 2;
public const int LOGON32_PROVIDER_DEFAULT = 0;
WindowsImpersonationContext impersonationContext;
[DllImport("advapi32.dll")]
public static extern int LogonUserA(String lpszUserName,
String lpszDomain,
String lpszPassword,
int dwLogonType,
int dwLogonProvider,
ref IntPtr phToken);
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern int DuplicateToken(IntPtr hToken,
int impersonationLevel,
ref IntPtr hNewToken);
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool RevertToSelf();
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern bool CloseHandle(IntPtr handle);
public bool ImpersonateValidUser(String userName, String domain, String password)
{
WindowsIdentity tempWindowsIdentity;
IntPtr token = IntPtr.Zero;
IntPtr tokenDuplicate = IntPtr.Zero;
if (RevertToSelf())
{
if (LogonUserA(userName, domain, password, LOGON32_LOGON_INTERACTIVE,
LOGON32_PROVIDER_DEFAULT, ref token) != 0)
{
if (DuplicateToken(token, 2, ref tokenDuplicate) != 0)
{
tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);
impersonationContext = tempWindowsIdentity.Impersonate();
if (impersonationContext != null)
{
CloseHandle(token);
CloseHandle(tokenDuplicate);
return true;
}
}
}
}
if (token != IntPtr.Zero)
CloseHandle(token);
if (tokenDuplicate != IntPtr.Zero)
CloseHandle(tokenDuplicate);
return false;
}
public void UndoImpersonation()
{
impersonationContext.Undo();
}
}
ThreadImpersonate类中的ImpersonateValidUser方法进行代码执行权限的设置,前提是在ASP.NET应用程序部署的服务器中建立一个具有某些权限的用户,userName即为用户名,domain为域名,如果服务器不在域中则为空,password为用户的密码。
下面示例中演示了如何使用Impersonate
{
Thread.CurrentThread.Name = "Main Thread";
ThreadIdentity();
for (int i = 0; i < 5; i++)
{
Thread t = new Thread(new ThreadStart(ThreadIdentity));
t.Name = string.Format("Thread{0}", i + 1);
t.Start();
}
}
protected void ThreadIdentity()
{
ThreadImpersonate impersonateMgr = new ThreadImpersonate();
string threadName = Thread.CurrentThread.Name;
string identityName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
if (impersonateMgr.ImpersonateValidUser("test1", string.Empty, "test"))
{
threadName = Thread.CurrentThread.Name;
identityName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
// Do Something in your code...
impersonateMgr.UndoImpersonation();
}
}
调用Impersonate时应在子线程内部调用,否则子线程无法获取到权限
转载于:https://www.cnblogs.com/leodrain/archive/2011/08/15/impersonate-makes-thread-has-same-permision-with-main-thread.html
Impersonate让你的子线程也具有主线程的执行权限相关推荐
- Qt自定义事件实现及子线程向主线程传送事件消息
近期在又一次学习Qt的时候,由于要涉及到子线程与主线程传递消息,所以便琢磨了一下.顺便把有用的记录下来,方便自己以后查询及各位同仁的參考! 特此声明,本篇博文主要讲述有用的,也就是直接说明怎么实现,就 ...
- android Handler Message传递参数,handler子线程和主线程通讯
创建Handler private Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) { ...
- Python 多个线程按先后顺序执行,并保持各子线程和主线程的通信
Python 多个线程按先后顺序执行,并保持各子线程和主线程的通信 摘要 最近有个项目使用pyqt5写的界面,界面展示部分作为项目的主线程,另外通过调用Thread,传入不同的参数又设置了五个子线程, ...
- Unity子线程与主线程交互(委托方式)
Unity Api无法从子线程访问, 但有些操作(例:IO存取文件)又必须子线程运行, 故实现在子线程做耗时操作, 完成后通知主线程更新状态 事件监听方式, 规避回调地狱:https://blog. ...
- 【EventBus】事件通信框架 ( 发送事件 | 判断发布线程是否是主线程 | 子线程切换主线程 | 主线程切换子线程 )
文章目录 前言 一.根据不同的线程模式进行不同的线程切换操作 二.完整代码示例 前言 发布线程发布事件之后 , 消息中心需要转发这些事件 , 并执行相应的订阅方法 ; 在转发的过程中 , 需要针对订阅 ...
- 子线程和主线程的关系
运行附录中test.py中的代码, 主线程和子线程啥关系? 首先多个子线程在运行的时候. 然后终端输入ps -ef|grep python 会发现: 虽然我们的脚本中是两个子线程,但是终端的监控中只能 ...
- Android笔记(三十一)Android中线程之间的通信(三)子线程给主线程发送消息...
先看简单示例:点击按钮,2s之后,TextView改变内容. package cn.lixyz.handlertest;import android.app.Activity; import andr ...
- 19 Handler 子线程向主线程发送信息
案例一 Message创建三种方法: package com.example.day19_handler_demo1;import android.os.Bundle; import android. ...
- MFC子线程访问主线程对话框程序的控件对象
最近在使用 VC 开发软件时需要用到多线程同步来解决开发过程中遇到的问题.本来以为只要象控制台程序一样,在主线程创建子线程,并设置好相应的对象事件就能解决问题,但是等到真正做起来,才在实践中发现原来事 ...
最新文章
- Python基础07-数据类型:字典dict
- java.text.SimpleDateFormat多线程下的问题
- 递归 反转链表 c语言程序,C语言反转链表的递归算法
- Java HashMap工作原理深入探讨
- 内容流推荐中的个性化标题生成框架
- 【纯技术贴】.NETStandard FreeSql v0.0.9 功能预览
- css表格文字超数量就竖排_求助!!一个非常棘手的问题。就是文字竖排显示的问题...
- MySQL复习资料——用于突击考试总结
- DataGridView 用户输入时,单元格输入值的设定
- 如何让cloudflare缓存html,CloudFlareCDN页面规则缓存设置教程
- WDM驱动程序入门(3)——安装步骤
- Adobe illustrator 图的放置和微调 - 连载 9
- Flyway 数据库脚本版本控制工具
- 动态规划(二)——经典问题之最长上升子序列
- [导入]Gentoo版Linux操作系统的前世今生 (3)
- PHP博客导入导出,Thinkphp5.0导入导出详解
- Kubernetes之配置与自定义DNS服务
- new 动手学深度学习V2环境安装
- 2021-08-20 Redis 基本类型:string set sortedSet Hash List
- 用C语言实现“电子词典”项目
热门文章
- 为红米寻找新的方向 卢伟冰向网友征集老人机需求
- 饭后什么事情正谋杀你的健康
- shell 12 21 filename重定向的含义和区别
- OpenGL(三)——OpenGL着色器基础
- set python用法_Python set()用法及代码示例
- Golang实践录:使用gin框架实现转发功能:一些负载均衡算法的实现
- 遇到一个在linux下无法跨网段发送接收广播包的问题
- u-boot移植随笔:u-boot2010.09移植到8MB Nor Flash的S3C2440,第一步搞定(补记)
- verilog从txt中读取_Verilog中的文件操作
- 【Flink】Flink AscendingTimestampExtractor - Timestamp monotony violated