• 一个在.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();

  • 相关阅读:
    如何查找YUM安装的JAVA_HOME环境变量详解
    Linux下设置和查看环境变量
    jar包部署脚本
    CentOS7开启防火墙及特定端口
    nohup 命令(设置后台进程): appending output to ‘nohup.out’ 问题
    重点|183道Java面试题可以说很详细了
    JVM性能调优
    【Notepad++】notepad++主题和字体设置(非常好看舒服的)
    spring-boot-maven-plugin 安装本地jar 包
    UserAgentUtils 获取浏览器信息
  • 原文地址:https://www.cnblogs.com/kaneboy/p/2436672.html
Copyright © 2020-2023  润新知