导航

yaosansi's Blog

当你背向太阳的时候,你只会看到自己的阴影!能力是有限的,努力无限的!

« [图解] 你不知道的 JavaScript - “this”ffmpeg: 免费的视频格式转换利器 »

一个在.net下进行用户模拟的类

  • 本站大部分内容从网上收集,收集目的仅供研究、学习。涉及版权或不希望收录您的文章请您及时与我联系。
  • 本站IM群,请自行选择。请各位朋友按照自己喜好加入。加入群后请及时发言,防止被清理。谢谢您的合作!!!
  • QQ群:Y①WEB开发(ASP.NET)号码:7351660 QQ群:Y②WEB开发(ASP+.NET)号码:11864905
  • QQ群:Y③WEB开发(DIV+CSS)号码:16610506 QQ群:Y④WEB开发(JS+AJAX)号码:16143998
  • QQ群:Y⑤WEB开发(新手)号码:12777715 MSN群:yaosansi[at]126.com

 

原文:http://blog.joycode.com/kaneboy/articles/3801.aspx

  1 ///   用户模拟角色类。实现在程序段内进行用户角色模拟。 
  2    ///  <example><![CDATA[使用的时候在你要执行特殊操作的代码段前面这样写:   
  3    ///         IdentityImpersonation   identityImpersonation   =   new   IdentityImpersonation("administrator", "yourpassword","yourhostname");   
  4    ///         identityImpersonation.BeginImpersonate();//开始管理员扮演   
  5    ///         //你的特殊操作   
  6    ///         ..   
  7    ///         .   
  8    ///       identityImpersonation.StopImpersonate();   //结束扮演]]>
  9    ///  </example>
 10    ///  

 11    public class IdentityImpersonation
 12    {
 13
 14        [DllImport("advapi32.dll", SetLastError = true)]
 15        public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, ref   IntPtr phToken);
 16
 17
 18
 19        [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
 20        public extern static bool DuplicateToken(IntPtr ExistingTokenHandle, int SECURITY_IMPERSONATION_LEVEL, ref   IntPtr DuplicateTokenHandle);
 21
 22
 23
 24        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
 25        public extern static bool CloseHandle(IntPtr handle);
 26
 27
 28
 29        //   要模拟的用户的用户名、密码、域(机器名)   
 30        private String _sImperUsername;
 31
 32        private String _sImperPassword;
 33
 34        private String _sImperDomain;
 35
 36        //   记录模拟上下文   
 37        private WindowsImpersonationContext _imperContext;
 38
 39        private IntPtr _adminToken;
 40
 41        private IntPtr _dupeToken;
 42
 43        //   是否已停止模拟   
 44        private Boolean _bClosed;
 45
 46
 47
 48
 49        /// <summary>
 50        /// 构造函数
 51        /// </summary>
 52        /// <param name="impersonationUsername">所要模拟的用户的用户名</param>
 53        /// <param name="impersonationPassword">所要模拟的用户的密码</param>
 54        /// <param name="impersonationDomain">所要模拟的用户所在的域</param>

 55        public IdentityImpersonation(String impersonationUsername, String impersonationPassword, String impersonationDomain)
 56        {
 57
 58            _sImperUsername = impersonationUsername;
 59            _sImperPassword = impersonationPassword;
 60            _sImperDomain = impersonationDomain;
 61
 62            _adminToken = IntPtr.Zero;
 63            _dupeToken = IntPtr.Zero;
 64            _bClosed = true;
 65
 66        }

 67
 68
 69
 70        /// <summary>
 71        /// 析构函数
 72        /// </summary>

 73        ~IdentityImpersonation()
 74        {
 75            if (!_bClosed)
 76            {
 77                StopImpersonate();
 78            }

 79        }

 80
 81
 82
 83        /// <summary>
 84        /// 开始身份角色模拟。   
 85        /// </summary>
 86        /// <returns></returns>

 87
 88
 89        public Boolean BeginImpersonate()
 90        {
 91            Boolean bLogined = LogonUser(_sImperUsername, _sImperDomain, _sImperPassword, 20ref   _adminToken);
 92            if (!bLogined)
 93            {
 94                return false;
 95            }

 96            Boolean bDuped = DuplicateToken(_adminToken, 2ref   _dupeToken);
 97            if (!bDuped)
 98            {
 99                return false;
100            }

101
102            WindowsIdentity fakeId = new WindowsIdentity(_dupeToken);
103            _imperContext = fakeId.Impersonate();
104            _bClosed = false;
105            return true;
106
107        }

108
109
110        /// <summary>
111        /// 停止身分角色模拟。 
112        /// </summary>

113        public void StopImpersonate()
114        {
115            _imperContext.Undo();
116            CloseHandle(_dupeToken);
117            CloseHandle(_adminToken);
118            _bClosed = true;
119
120        }

121
122    }

 

 

  1 /// <summary>
  2    /// 比如,从机器A操作实现把机器B的文件拷贝到机器A上,需要把机器B文件夹加上机器A的用户权限。 
  3    /// 这两个方法是对机器B建立连接,连接成功后,用File.Copy就可以了 
  4    ///if (Ping("机器B")) 
  5    ///   { 
  6    ///    if (Connect("机器B","机器A用户","机器A用户访问密码")) 
  7    ///    { 
  8    ///     File.Copy("\\机器B\文件路径\文件名称","机器A存放文件完整路径",true); 
  9    ///    } 
 10    ///   } 
 11    ///
 12    /// </summary>

 13    public class Computer
 14    {
 15        public static bool Ping(string remoteHost)
 16        {
 17            bool Flag = false;
 18            Process proc = new Process();
 19            try
 20            {
 21                proc.StartInfo.FileName = "cmd.exe";
 22                proc.StartInfo.UseShellExecute = false;
 23                proc.StartInfo.RedirectStandardInput = true;
 24                proc.StartInfo.RedirectStandardOutput = true;
 25                proc.StartInfo.RedirectStandardError = true;
 26                proc.StartInfo.CreateNoWindow = true;
 27                proc.Start();
 28                string dosLine = @"ping -n 1 " + remoteHost;
 29                proc.StandardInput.WriteLine(dosLine);
 30                proc.StandardInput.WriteLine("exit");
 31                while (proc.HasExited == false)
 32                {
 33                    proc.WaitForExit(500);
 34                }

 35                string pingResult = proc.StandardOutput.ReadToEnd();
 36                if (pingResult.IndexOf("(0% loss)"!= -1)
 37                {
 38                    Flag = true;
 39                }

 40                proc.StandardOutput.Close();
 41            }

 42            catch (Exception ex)
 43            {
 44            }

 45            finally
 46            {
 47                try
 48                {
 49                    proc.Close();
 50                    proc.Dispose();
 51                }

 52                catch
 53                {
 54                }

 55            }

 56            return Flag;
 57        }

 58
 59        public static bool Connect(string remoteHost, string userName, string passWord)
 60        {
 61            if (!Ping(remoteHost))
 62            {
 63                return false;
 64            }

 65            bool Flag = true;
 66            Process proc = new Process();
 67            try
 68            {
 69                proc.StartInfo.FileName = "cmd.exe";
 70                proc.StartInfo.UseShellExecute = false;
 71                proc.StartInfo.RedirectStandardInput = true;
 72                proc.StartInfo.RedirectStandardOutput = true;
 73                proc.StartInfo.RedirectStandardError = true;
 74                proc.StartInfo.CreateNoWindow = true;
 75                proc.Start();
 76                string dosLine = @"net use \\" + remoteHost + " " + passWord + " " + " /user:" + userName + ">NUL";
 77                proc.StandardInput.WriteLine(dosLine);
 78                proc.StandardInput.WriteLine("exit");
 79                while (proc.HasExited == false)
 80                {
 81                    proc.WaitForExit(1000);
 82                }

 83                string errormsg = proc.StandardError.ReadToEnd();
 84                if (errormsg != "")
 85                {
 86                    Flag = false;
 87                }

 88                proc.StandardError.Close();
 89            }

 90            catch (Exception ex)
 91            {
 92                Flag = false;
 93            }

 94            finally
 95            {
 96                try
 97                {
 98                    proc.Close();
 99                    proc.Dispose();
100                }

101                catch
102                {
103                }

104            }

105            return Flag;
106        }

107
108    }

 

原创文章如转载,请注明:转载自http://www.yaosansi.com
订阅本站,阅读更多文章