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);
        }

    }

}

 

C#调用windows本身的logonUser方法

[本文轉自博客堂]在Windows Vista运行Visual Studio 2005(without SP1)时,最好使用Vista的Run as administrator的功能,否则有些功能就不...
  • zmwgfh
  • zmwgfh
  • 2007年11月07日 17:04
  • 10366

使用Win32API LogonUser 在C#程序中进行域认证

使用C#的用户在编写的WinForm程序中,如果需要使用域账号进行认证管理一般需使用Win32API LogonUser()进行。这里提供一段我使用的完整的验证代码,大家可以根据需要自己进行适当的修改...
  • DKman803
  • DKman803
  • 2008年02月13日 13:13
  • 5124

asp.net(C#)中实现身份模拟(转贴)

asp.net(C#)中实现身份模拟   ...
  • deansroom
  • deansroom
  • 2008年03月04日 11:15
  • 515

AdDomain

using System;using System.Collections.Generic;using System.Text;using System.Security.Principal;usin...
  • ipqxiang
  • ipqxiang
  • 2007年12月26日 14:21
  • 536

开源:ICanSeeYou远程控制软件(所有C#源代码)

引自开源贴: http://community.csdn.net/Expert/topic/5499/5499359.xml?temp=.4488489ICanSeeYou远程控制软件(所有C#源代码...
  • fengart
  • fengart
  • 2007年04月29日 03:54
  • 10095

C#实现的远程桌面控制

  • 2016年07月23日 22:57
  • 395KB
  • 下载

C#局域网写文件

using System; using System.Collections; using System.Configuration; using System.Data; using System....
  • wxg22526451
  • wxg22526451
  • 2008年03月24日 16:36
  • 840

我在服务程序里用CreateProcessWithLogon

小 虾米 22:50:46我是用的 Delphivar  Domain,UserName,Pwd: String;  hToken : THandle;  si: TStartupInfo;  pi:...
  • fsc2988877
  • fsc2988877
  • 2007年03月03日 23:15
  • 1845

C#使用RDP远程桌面

由于本人是做数据库维护经常使用到远程桌面,但是windows自带的远程桌面难以区分很不方便,所以我自己写了一个RDP。 RDP一共修改了两次。 第一种思路就是使用windows自带的RDP,保存成...
  • qq461548977
  • qq461548977
  • 2015年10月29日 09:55
  • 2871

C#模拟域登录

如果希望使用C#进行后台域登录,需要使用到advapi32.dll这个程序集。advapi32.dll是一个高级API应用程序接口服务库的一部分,包含的函数与对象的安全性,注册表的操控以及事件日志有关...
  • mx5721
  • mx5721
  • 2015年01月14日 12:49
  • 1890
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#登录远程windows系统
举报原因:
原因补充:

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