C#登录远程windows系统

原创 2007年09月26日 16:17:00
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.Runtime.InteropServices;
using System.Security.Principal;
using System.Security.Permissions;

namespace
{
    
public enum LogonType : int
    
{
        LOGON32_LOGON_INTERACTIVE 
= 2,
        LOGON32_LOGON_NETWORK 
= 3,
        LOGON32_LOGON_BATCH 
= 4,
        LOGON32_LOGON_SERVICE 
= 5,
        LOGON32_LOGON_UNLOCK 
= 7,
        LOGON32_LOGON_NETWORK_CLEARTEXT 
= 8,    // Only for Win2K or higher
        LOGON32_LOGON_NEW_CREDENTIALS = 9        // Only for Win2K or higher
    }
;

    
public enum LogonProvider : int
    
{
        LOGON32_PROVIDER_DEFAULT 
= 0,
        LOGON32_PROVIDER_WINNT35 
= 1,
        LOGON32_PROVIDER_WINNT40 
= 2,
        LOGON32_PROVIDER_WINNT50 
= 3
    }
;

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

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

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


    
/// <summary>
    
/// Summary description for NetworkSecurity.
    
/// </summary>

    public class NetworkSecurity
    
{
        
public NetworkSecurity()
        
{
            
//
            
// TODO: Add constructor logic here
            
//
        }


        
public static Hashtable LogonTypeEntry;
        
public static Hashtable LogonProviderEntry;

        
static NetworkSecurity()
        
{
            LogonTypeEntry 
= new Hashtable();
            LogonTypeEntry.Add(
"LOGON32_LOGON_INTERACTIVE", LogonType.LOGON32_LOGON_INTERACTIVE);
            LogonTypeEntry.Add(
"LOGON32_LOGON_NETWORK", LogonType.LOGON32_LOGON_NETWORK);
            LogonTypeEntry.Add(
"LOGON32_LOGON_BATCH", LogonType.LOGON32_LOGON_BATCH);
            LogonTypeEntry.Add(
"LOGON32_LOGON_SERVICE", LogonType.LOGON32_LOGON_SERVICE);
            LogonTypeEntry.Add(
"LOGON32_LOGON_UNLOCK", LogonType.LOGON32_LOGON_UNLOCK);
            LogonTypeEntry.Add(
"LOGON32_LOGON_NETWORK_CLEARTEXT", LogonType.LOGON32_LOGON_NETWORK_CLEARTEXT);
            LogonTypeEntry.Add(
"LOGON32_LOGON_NEW_CREDENTIALS", LogonType.LOGON32_LOGON_NEW_CREDENTIALS);

            LogonProviderEntry 
= new Hashtable();
            LogonProviderEntry.Add(
"LOGON32_PROVIDER_DEFAULT", LogonProvider.LOGON32_PROVIDER_DEFAULT);
            LogonProviderEntry.Add(
"LOGON32_PROVIDER_WINNT35", LogonProvider.LOGON32_PROVIDER_WINNT35);
            LogonProviderEntry.Add(
"LOGON32_PROVIDER_WINNT40", LogonProvider.LOGON32_PROVIDER_WINNT40);
            LogonProviderEntry.Add(
"LOGON32_PROVIDER_WINNT50", LogonProvider.LOGON32_PROVIDER_WINNT50);
        }


        
public const int SecurityImpersonation = 2;

        
public static WindowsImpersonationContext ImpersonateUser(string strDomain,
            
string strLogin,
            
string strPwd,
            LogonType logonType,
            LogonProvider logonProvider)
        
{
            IntPtr tokenHandle 
= new IntPtr(0);
            IntPtr dupeTokenHandle 
= new IntPtr(0);
            
try
            
{
                tokenHandle 
= IntPtr.Zero;
                dupeTokenHandle 
= IntPtr.Zero;

                
// Call LogonUser to obtain a handle to an access token.
                bool returnValue = SecuUtil32.LogonUser(
                    strLogin,
                    strDomain,
                    strPwd,
                    (
int)logonType,
                    (
int)logonProvider,
                    
ref tokenHandle);
                
if (false == returnValue)
                
{
                    
int ret = Marshal.GetLastWin32Error();
                    
string strErr = String.Format("LogonUser failed with error code : {0}", ret);
                    
throw new ApplicationException(strErr, null);
                }


                
bool retVal = SecuUtil32.DuplicateToken(tokenHandle, SecurityImpersonation, ref dupeTokenHandle);
                
if (false == retVal)
                
{
                    SecuUtil32.CloseHandle(tokenHandle);
                    
throw new ApplicationException("Failed to duplicate token"null);
                }


                
// The token that is passed to the following constructor must 
                
// be a primary token in order to use it for impersonation.
                WindowsIdentity newId = new WindowsIdentity(dupeTokenHandle);
                WindowsImpersonationContext impersonatedUser 
= newId.Impersonate();

                
return impersonatedUser;
            }

            
catch (Exception ex)
            
{
                
throw new ApplicationException(ex.Message, ex);
            }


            
//return null;
        }


        
public static WindowsImpersonationContext ImpersonateUser(string strDomain,
            
string strLogin,
            
string strPwd,
            
string logonType,
            
string logonProvider)
        
{
            
if (!LogonTypeEntry.ContainsKey(logonType) || !LogonProviderEntry.ContainsKey(logonProvider))
            
{
                
return null;
            }

            
return ImpersonateUser(strDomain, strLogin, strPwd, (LogonType)LogonTypeEntry[logonType], (LogonProvider)LogonProviderEntry[logonProvider]);
        }


        
//登录接口
        public static bool LogonAndGetToken(string strDomain,
            
string strLogin,
            
string strPwd,
            LogonType logonType,
            LogonProvider logonProvider, 
ref IntPtr accessToken)
        
{
            
try
            
{

                IntPtr orgToken 
= IntPtr.Zero;
                accessToken 
= IntPtr.Zero;

                
// Call LogonUser to obtain a handle to an access token.
                bool returnValue = SecuUtil32.LogonUser(
                    strLogin,
                    strDomain,
                    strPwd,
                    (
int)logonType,
                    (
int)logonProvider,
                    
ref orgToken);
                
if (false == returnValue)
                
{
                    
int ret = Marshal.GetLastWin32Error();
                    
string strErr = String.Format("LogonUser failed with error code : {0}", ret);
                    
throw new ApplicationException(strErr, null);
                }


                
bool retVal = SecuUtil32.DuplicateToken(orgToken, SecurityImpersonation, ref accessToken);
                
if (false == retVal)
                
{
                    SecuUtil32.CloseHandle(orgToken);
                    
throw new ApplicationException("Failed to duplicate token"null);
                }


                
/* TO TEST */
                SecuUtil32.CloseHandle(orgToken);
                
return true;
            }

            
catch (Exception ex)
            
{
                
throw new ApplicationException(ex.Message, ex);
            }

        }


        
public static bool LogonAndGetToken(string strDomain,
            
string strLogin,
            
string strPwd,
            
string logonType,
            
string logonProvider, ref IntPtr accessToken)
        
{
            
if (!LogonTypeEntry.ContainsKey(logonType) || !LogonProviderEntry.ContainsKey(logonProvider))
            
{
                
return false;
            }


            
return LogonAndGetToken(strDomain, strLogin, strPwd, (LogonType)LogonTypeEntry[logonType], (LogonProvider)LogonProviderEntry[logonProvider], ref accessToken);
        }


        
public static WindowsImpersonationContext ImpersonateUser(IntPtr access_token)
        
{
            
try
            
{
                WindowsIdentity newId 
= new WindowsIdentity(access_token);
                WindowsImpersonationContext impersonatedUser 
= newId.Impersonate();

                
return impersonatedUser;
            }

            
catch (Exception ex)
            
{
                
throw new ApplicationException(ex.Message, ex);
            }

        }


        
public static bool CloseToken(IntPtr token)
        
{
            
return SecuUtil32.CloseHandle(token);
        }

    }

}

 

相关文章推荐

windows系统通过eclipse远程MapReduce服务器

本文主要介绍在windows系统中通过eclipse编写MapReduce程序,远程访问Hadoop服务器。前提是Linux服务器中已经部署成功hadoop环境。...

Windows系统下通过xmanager远程桌面控制Linux

有两种方法可以实现远程管理Linux桌面窗口,其中一个就是是我们所选择的X显示管理器(X display manager)或者说xdm,另一个流行的解决方案是vnc。我选择xdm而不是vnc出于两点原...
  • ytfy12
  • ytfy12
  • 2016年03月05日 17:27
  • 683

【干货收藏】云服务器从选配置、到远程链接、到环境配置的新手入门百问-Windows系统篇

云服务新手入门百问-Windows系统篇 目前对于阿里云所提供的操作系统镜像而言,无论是Windows系还是Linux系任何一种平台都有很多种可以供大家选择。这两个系统都有各自的优点和缺点,...

Windows系统SMB/RDP远程命令执行漏洞

介于此次爆发的漏洞事件危害太过严重,本文当回搬运工,分享此次NSA方程式组织泄露的0day事件。由于信息量太过庞大,没有对其中的技术细节进行研究,不过请相信我,赶紧拔电源吧。 事件具体细节请参考...
  • god_7z1
  • god_7z1
  • 2017年05月01日 23:35
  • 4744

Windows系统下远程连接BeagleBone Black开源电路板桌面

参考资料:BeagleBone Black快速入门教程BeagleBone Black(简称BBB)中的文件虽然可以通过SSH终端通过命令行进行操作,但在桌面环境中进行操作可能会更方便一些。BBB提供...

RedHat6.5如何被windows系统远程桌面连接

一、redhat 6.5远程桌面配置 服务器端: 1、设置允许其它人查看您的远程桌面 在“系统”-“首选项”-“远程桌面”-在“允许其它人查看您的远程桌面”前打勾;在“允许其它用户控...

windows系统账号(域账号)建立远程链接服务器--图文

1. 选择到链接服务器,右键新建链接服务器: 2. 编辑常规信息:服务器类型选择SQLSERVER、链接服务器处输入远程服务器名称或IP地址: 3. 安全性选项...

ubuntu远程桌面连接windows系统

简单使用 工作机换成战斗机了,改用ubuntu,原来的windows7上东西笔记多,还不想重装。用rdeasktop来远程连接windows: sudo apt-get install rde...

LoadRunner之设置监控本地和远程Windows系统资源

一般在客户端通过LoadRunner对服务器进行压力测试,都需要实时监控服务器端的系统资源,本篇主要简单介绍一下如何设置在LoadRunner的Controller中配置监控Windows Resou...

imac如何访问远程windows系统的共享文件

直接看图吧! 重点:smb://Windows主机的IP地址 Mac OS X 访问 Windows 共享文件夹 Mac 如何访问 Windows 的共享文件夹?方法很简单,点击 F...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#登录远程windows系统
举报原因:
原因补充:

(最多只允许输入30个字)