网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 
中国网管联盟
Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道
 当前位置: > bitsCN.com > DotNet > C# > 如何扮演另一个帐号(C#实现)  

如何扮演另一个帐号(C#实现)

2006-05-01  作者:BitsCN整理  来源:中国网管联盟  点评 投稿 收藏

如何扮演另一个帐号(C#实现)
 

using directives#region Using directives 网管联盟bitsCN@com

using System;
using System.Security.Principal;
using System.Runtime.InteropServices;
using System.Text.RegularExpressions;
#endregion 中国网管论坛bbs.bitsCN.com

namespace Impersonal
{
    class Program
    {
        测试代码#region 测试代码
        public static void Main(string[] args)
        {
            Console.WriteLine("当前用户是: "
    + WindowsIdentity.GetCurrent().Name);
            ImpersonatedWork testDel = new ImpersonatedWork(Test);
            ImpersonateAndDo("epro\\liping", "88888888", testDel);
            Console.WriteLine("当前用户是: "
    + WindowsIdentity.GetCurrent().Name);
        }
        static void Test()
        {

网管联盟bitsCN_com

            Console.WriteLine("当前用户是: "
                + WindowsIdentity.GetCurrent().Name);
        }
        #endregion 网管bitscn_com

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

网管下载dl.bitscn.com

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

网管bitscn_com

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

网管u家u.bitsCN.com

        public delegate void ImpersonatedWork();
        /**//// <summary>
        /// 以指定用户的身份去做一件事情
        /// </summary>
        /// <param name="UserName"></param>
        /// <param name="PWD"></param>
        /// <param name="WhatToDo"></param>
        public static void ImpersonateAndDo(string UserName, string PWD, ImpersonatedWork WhatToDo)
        {
            扮演用户#region 扮演用户
            string domainName = string.Empty;
            string userName = string.Empty;

网管bitscn_com


            IntPtr tokenHandle = new IntPtr(0);
            IntPtr dupeTokenHandle = new IntPtr(0);
            const int LOGON32_PROVIDER_DEFAULT = 0;
            const int LOGON32_LOGON_INTERACTIVE = 2;
            const int SecurityImpersonation = 2;
            if (! Regex.IsMatch(UserName, @"^\w+[\\]?\w+$"))
            {
                throw new ApplicationException("非法的用户名");
            }
            string[] tmp = UserName.Split(new char[] { '\\' });

网管网www_bitscn_com


            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, 网管论坛bbs_bitsCN_com
                LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT,
                ref tokenHandle);
            if (!returnValue)
            {
                throw new ApplicationException("取Handle出错了!");
            } 网管联盟bitsCN@com

            //Console.WriteLine("当前用户是: "
            //    + WindowsIdentity.GetCurrent().Name);

中国网管论坛bbs.bitsCN.com

            bool retVal = DuplicateToken(tokenHandle, SecurityImpersonation, ref dupeTokenHandle);
            if (!retVal)
            {
                CloseHandle(tokenHandle);
                throw new ApplicationException("复制Handle出错了!");
            }
            WindowsIdentity newId = new WindowsIdentity(dupeTokenHandle);
            WindowsImpersonationContext impersonatedUser = newId.Impersonate();
            #endregion
            以新用户身份调用#region 以新用户身份调用

网管联盟bitsCN_com

            WhatToDo();
            #endregion
            取消扮演#region 取消扮演
            impersonatedUser.Undo();
            if (tokenHandle != IntPtr.Zero)
                CloseHandle(tokenHandle);
            if (dupeTokenHandle != IntPtr.Zero)
                CloseHandle(dupeTokenHandle);
            #endregion
        }
    }
} 网管联盟bitsCN_com


TAGs实现   帐号   扮演   如何   if   tokenHandle   #endregion    
 上一篇:Visual C#中用WMI获取远程计算   下一篇:DotNET(C#) Socket基本编程
相关文章列表
如何扮演另一个帐号(C#实现) 评论:
loading.. 评论加载中…
评论:请自觉遵守互联网相关政策法规,评论不得超过250字。

验证码: 注册用户
本类热门排行:
1.DotNET(C#) Socket基本编程
2.Visual C#中用WMI获取远程计算
3.用C# 实现C/S模式下软件自动在线升级
4.使用C#实现阿拉伯数字到大写中文的转换
5.利用C#制作 ASP.NET 登录页面
6.C#简明教程
7.C#来创建和读取XML文档
8.C#的Windows编程中多语言的实现
9.C#中一些字符串操作的常用用法
10.C#委托的具体实现方法
最新推荐文章:
1.Delphi调用WebServices(C#)代码
2.利用C#制作 ASP.NET 登录页面
3.数得明白-用C#制作源代码统计软件
4.利用C#来做ASP.NET的登陆页面
5.C#编程入门基础 控制语句概要
6.C#中将DataSet的内容写成XML
7.使用VBA.NET压缩备份C#工程
8.在C#中动态调用native dll的导出函数
9.C#3.0之对象与集合初始化
10.C#向Excel报表中插入图片的2种方法
网管论坛交流:
·不疯魔不成活
·令你大开眼界的真正标准化机房,已整理重
·为赈灾,女孩舍身拍“裸照”
·Windows Server 2003服务器群集创建和配
·exchange2k3全套官方资料
·双儿一周岁了。。。特殊的礼物来啦。。
·存储备份技术版块守则
·无盘技术交流区守则
·DOS命令基础大全之命令详解<作者吐血
·Windows XP 操作系统默认设置需要注意的