系统部署在某些复杂的网络环境中,对权限的控制较为严格,无法给IIS用户授予更多的权限,而有些操作(比如对数据库的操作)又必须拥有权限才能成功。

ASP.NET在后台使用多线程进行数据处理时,主线程可以获取IIS用户的权限,而子线程则不能获取到权限,进而导致子线程的执行过程失败。

为了让子线程也和主线程拥有相同的权限,则可以使用Impersonate方法。

using System;
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

        protected void Page_Load(object sender, EventArgs e)
        {
            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让你的子线程也具有主线程的执行权限相关推荐

  1. Qt自定义事件实现及子线程向主线程传送事件消息

    近期在又一次学习Qt的时候,由于要涉及到子线程与主线程传递消息,所以便琢磨了一下.顺便把有用的记录下来,方便自己以后查询及各位同仁的參考! 特此声明,本篇博文主要讲述有用的,也就是直接说明怎么实现,就 ...

  2. android Handler Message传递参数,handler子线程和主线程通讯

    创建Handler private Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) { ...

  3. Python 多个线程按先后顺序执行,并保持各子线程和主线程的通信

    Python 多个线程按先后顺序执行,并保持各子线程和主线程的通信 摘要 最近有个项目使用pyqt5写的界面,界面展示部分作为项目的主线程,另外通过调用Thread,传入不同的参数又设置了五个子线程, ...

  4. Unity子线程与主线程交互(委托方式)

    Unity  Api无法从子线程访问, 但有些操作(例:IO存取文件)又必须子线程运行, 故实现在子线程做耗时操作, 完成后通知主线程更新状态 事件监听方式, 规避回调地狱:https://blog. ...

  5. 【EventBus】事件通信框架 ( 发送事件 | 判断发布线程是否是主线程 | 子线程切换主线程 | 主线程切换子线程 )

    文章目录 前言 一.根据不同的线程模式进行不同的线程切换操作 二.完整代码示例 前言 发布线程发布事件之后 , 消息中心需要转发这些事件 , 并执行相应的订阅方法 ; 在转发的过程中 , 需要针对订阅 ...

  6. 子线程和主线程的关系

    运行附录中test.py中的代码, 主线程和子线程啥关系? 首先多个子线程在运行的时候. 然后终端输入ps -ef|grep python 会发现: 虽然我们的脚本中是两个子线程,但是终端的监控中只能 ...

  7. Android笔记(三十一)Android中线程之间的通信(三)子线程给主线程发送消息...

    先看简单示例:点击按钮,2s之后,TextView改变内容. package cn.lixyz.handlertest;import android.app.Activity; import andr ...

  8. 19 Handler 子线程向主线程发送信息

    案例一 Message创建三种方法: package com.example.day19_handler_demo1;import android.os.Bundle; import android. ...

  9. MFC子线程访问主线程对话框程序的控件对象

    最近在使用 VC 开发软件时需要用到多线程同步来解决开发过程中遇到的问题.本来以为只要象控制台程序一样,在主线程创建子线程,并设置好相应的对象事件就能解决问题,但是等到真正做起来,才在实践中发现原来事 ...

最新文章

  1. Python基础07-数据类型:字典dict
  2. java.text.SimpleDateFormat多线程下的问题
  3. 递归 反转链表 c语言程序,C语言反转链表的递归算法
  4. Java HashMap工作原理深入探讨
  5. 内容流推荐中的个性化标题生成框架
  6. 【纯技术贴】.NETStandard FreeSql v0.0.9 功能预览
  7. css表格文字超数量就竖排_求助!!一个非常棘手的问题。就是文字竖排显示的问题...
  8. MySQL复习资料——用于突击考试总结
  9. DataGridView 用户输入时,单元格输入值的设定
  10. 如何让cloudflare缓存html,CloudFlareCDN页面规则缓存设置教程
  11. WDM驱动程序入门(3)——安装步骤
  12. Adobe illustrator 图的放置和微调 - 连载 9
  13. Flyway 数据库脚本版本控制工具
  14. 动态规划(二)——经典问题之最长上升子序列
  15. [导入]Gentoo版Linux操作系统的前世今生 (3)
  16. PHP博客导入导出,Thinkphp5.0导入导出详解
  17. Kubernetes之配置与自定义DNS服务
  18. new 动手学深度学习V2环境安装
  19. 2021-08-20 Redis 基本类型:string set sortedSet Hash List
  20. 用C语言实现“电子词典”项目

热门文章

  1. 为红米寻找新的方向 卢伟冰向网友征集老人机需求
  2. 饭后什么事情正谋杀你的健康
  3. shell 12 21 filename重定向的含义和区别
  4. OpenGL(三)——OpenGL着色器基础
  5. set python用法_Python set()用法及代码示例
  6. Golang实践录:使用gin框架实现转发功能:一些负载均衡算法的实现
  7. 遇到一个在linux下无法跨网段发送接收广播包的问题
  8. u-boot移植随笔:u-boot2010.09移植到8MB Nor Flash的S3C2440,第一步搞定(补记)
  9. verilog从txt中读取_Verilog中的文件操作
  10. 【Flink】Flink AscendingTimestampExtractor - Timestamp monotony violated