zoukankan      html  css  js  c++  java
  • 一个在.net下进行用户模拟的类

    实质上是通过WindowsIdentity.Impersonate()的方法,其中需要调用Win API来获得活用的Handle,用法其实很简单,因为在自己的代码中需要用到,就稍微封装了一下:

    ?public class IdentityImpersonation {

    ??[DllImport("advapi32.dll", SetLastError=true)]
    ??public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword,
    ???int dwLogonType, int dwLogonProvider, ref IntPtr phToken);

    ??[DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true)]
    ??public extern static bool DuplicateToken(IntPtr ExistingTokenHandle,
    ???int SECURITY_IMPERSONATION_LEVEL, ref IntPtr DuplicateTokenHandle);

    ??[DllImport("kernel32.dll", CharSet=CharSet.Auto)]
    ??public extern static bool CloseHandle(IntPtr handle);


    ??// 要模拟的用户的用户名、密码、域(机器名)
    ??private String _sImperUsername;
    ??private String _sImperPassword;
    ??private String _sImperDomain;
    ??// 记录模拟上下文
    ??private WindowsImpersonationContext _imperContext;
    ??private IntPtr _adminToken;
    ??private IntPtr _dupeToken;
    ??// 是否已停止模拟
    ??private Boolean _bClosed;

    ??public IdentityImpersonation(String impersonationUsername, String impersonationPassword, String impersonationDomain) {
    ???_sImperUsername = impersonationUsername;
    ???_sImperPassword = impersonationPassword;
    ???_sImperDomain = impersonationDomain;

    ???_adminToken = IntPtr.Zero;
    ???_dupeToken = IntPtr.Zero;
    ???_bClosed = true;
    ??}

    ??~IdentityImpersonation() {
    ???if(! _bClosed) {
    ????StopImpersonation();
    ???}
    ??}

    ??public Boolean BeginImpersonate() {
    ?
    ???Boolean bLogined = LogonUser(_sImperUsername, _sImperDomain, _sImperPassword, 2, 0, ref _adminToken);
    ???
    ???if(! bLogined) {
    ????return false;
    ???}

    ???Boolean bDuped = DuplicateToken(_adminToken, 2, ref _dupeToken);

    ???if(! bDuped) {
    ????return false;
    ???}

    ???WindowsIdentity fakeId = new WindowsIdentity(_dupeToken);
    ???_imperContext = fakeId.Impersonate();

    ???_bClosed = false;

    ???return true;
    ??}

    ??public void StopImpersonate() {
    ???_imperContext.Undo();
    ???CloseHandle(_dupeToken);
    ???CloseHandle(_adminToken);
    ???_bClosed = true;
    ??}
    ?}

    ?

    使用示例:

    IdentityImpersonation imper = new IdentityImpersonation("tsg", "123456", "webreal");
    imper.BeginImpersonation();
    // ...
    imper.StopImpersonation();

  • 相关阅读:
    python的正则表达式 re-------可以在字符串前加上 r 这个前缀来避免部分疑惑,因为 r 开头的python字符串是 raw 字符串,所以里面的所有字符都不会被转义
    mysql中max_allowed_packet参数的配置方法(避免大数据写入或者更新失败)
    提交 git 项目 到 github 在 centos 7
    常用正则表达式大全 (转)
    如何让vim编辑器永久显示行号
    Ubuntu下忘记MySQL密码重设方法
    Base64复习
    好用的正则表达式工具
    64位centos下安装python的PIL模块
    springboot中使用servlet通过配置类
  • 原文地址:https://www.cnblogs.com/kaneboy/p/2436672.html
Copyright © 2011-2022 走看看