2009-04-06 6 views
4

Je dois pouvoir connecter, déconnecter et reconnecter une connexion réseau à distance dans une application C# .NET Framework. La création de la connexion dans le répertoire peut également être utile/nécessaire.Comment utiliser les connexions d'accès à distance (RAS) sous Windows à l'aide de C#/.NET?

Existe-t-il des classes ou des bibliothèques écrites pour C# ou .NET qui enveloppent joliment toutes ces fonctionnalités pour moi? Quelqu'un a-t-il du code qu'il serait prêt à partager?

Remarque: L'application est sans surveillance, comme un kiosque, et nécessitant donc une action de l'utilisateur est inacceptable.

Répondre

0

Ceci est découpé à partir de quelques classes différentes (du code omis pour d'éventuels problèmes de confidentialité) afin qu'il ne peut pas compiler avec une copie droite. J'espère que cela aide!

using System.Runtime.InteropServices; 

[DllImport("wininet.dll")] 
[return: MarshalAs(UnmanagedType.Bool)] 
public extern static bool InternetGetConnectedState(
    out int connectionDescription, 
    int reservedValue); 

[DllImport("wininet.dll", SetLastError = true)] 
[return: MarshalAs(UnmanagedType.I4)] 
public static extern int InternetAttemptConnect(int dwReserved); 

public sealed class InternetConnection 
{ 
    private InternetConnection() 
    { } 

    public static bool IsConnected() 
    { 
     int connectionDescription = 0; 

     return InternetGetConnectedState(out connectionDescription, 0); 
    } 

    public static int Connect() 
    { 
     return InternetAttemptConnect(0); 
    } 
} 
+0

Hmm ... Je pense que le problème avec l'utilisation WinInet est qu'il utilise les paramètres de connexion Internet des choses, et sera donc provoquer une boîte de dialogue pop-up demandant pour téléphone #, nom d'utilisateur/mot de passe –

3

Une façon de procéder consiste à utiliser Interop autour de RAS. RasDialDlg() peut être utilisé pour ouvrir une connexion réseau à distance sans afficher la boîte de dialogue. Utilisez RasHangUp() pour vous déconnecter. RasEnumConnections() peut être utilisé pour lister les connexions disponibles.

Le dll est Rasapi32.dll - en-têtes sont ras.h et raserror.h

0
using System; 
using System.ComponentModel; 
using System.Runtime.InteropServices; 

namespace MenelGameAuto.Internet 
{ 
    class RAS 
    { 
     #region <Fields> 

     private int rasConnectionsAmount; // ilość struktur typu RASCONN 
     #endregion 

     [DllImport("wininet.dll", CharSet = CharSet.Auto)] 
     static extern bool InternetGetConnectedState(
      ref int lpdwFlags, 
      int dwReserved); 

     const int MAX_PATH = 260; 
     const int RAS_MaxDeviceType = 16; 
     const int RAS_MaxPhoneNumber = 128; 
     const int RAS_MaxEntryName = 256; 
     const int RAS_MaxDeviceName = 128; 

     const int RAS_Connected = 0x2000; 

     /// <summary> 
     /// Wykazuje wszystkie połączenia RAS. 
     /// </summary> 
     [DllImport("rasapi32.dll", SetLastError = true, CharSet = CharSet.Auto)] 
     private static extern int RasEnumConnections([In, Out] RASCONN[] lprasconn, ref int lpcb,ref int lpcConnections); 

     [DllImport("rasapi32.dll", SetLastError = true, CharSet = CharSet.Auto)] 
     static extern uint RasHangUp(IntPtr hRasConn); 

     [DllImport("RASAPI32", SetLastError = true, CharSet = CharSet.Auto)] 
     static extern int RasGetConnectStatus(IntPtr hrasconn, ref RASCONNSTATUS lprasconnstatus); 

     [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] 
     struct RASCONN 
     { 
      public int dwSize; 
      public IntPtr hrasconn; 
      [MarshalAs(UnmanagedType.ByValTStr, SizeConst = RAS_MaxEntryName + 1)] 
      public string szEntryName; 
      [MarshalAs(UnmanagedType.ByValTStr, SizeConst = RAS_MaxDeviceType + 1)] 
      public string szDeviceType; 
      [MarshalAs(UnmanagedType.ByValTStr, SizeConst = RAS_MaxDeviceName + 1)] 
      public string szDeviceName; 
      [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_PATH)] 
      public string szPhonebook; 
      public int dwSubEntry; 
     } 

     [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] 
     struct RASCONNSTATUS 
     { 
      public int dwSize; 
      public int rasconnstate; 
      public int dwError; 
      [MarshalAs(UnmanagedType.ByValTStr, SizeConst = RAS_MaxDeviceType + 1)] 
      public string szDeviceType; 
      [MarshalAs(UnmanagedType.ByValTStr, SizeConst = RAS_MaxDeviceName + 1)] 
      public string szDeviceName; 
      [MarshalAs(UnmanagedType.ByValTStr, SizeConst = RAS_MaxPhoneNumber + 1)] 
      public string szPhoneNumber; 
     } 


     /// <summary> 
     /// Pobranie wszystkich połączeń RAS. 
     /// </summary> 
     /// <returns>Struktury połączeń RAS</returns> 
     private RASCONN[] GetRasConnections() 
     { 
      // Stworzenie tablicy, którą później należy przekazać funkcjom 
      int rasEnumReturn; 
      RASCONN[] rasconnStructs = new RASCONN[256]; 
      rasconnStructs.Initialize(); // inicjalizacja wszystkich pól struktury 
      rasconnStructs[0].dwSize = Marshal.SizeOf(typeof(RASCONN)); // inicjalizacja pierwszego pola pierwszej struktury na wartość wielkości tej struktury 
      int sizeOfRasconnStruct = rasconnStructs[0].dwSize * rasconnStructs.Length; // wielkość pojedynczej struktury * ilosc 

      // Wywołanie RasEnumConnections do zdobycia wszystkich aktywnych połączeń RAS 
      rasEnumReturn = RasEnumConnections(rasconnStructs, ref sizeOfRasconnStruct, ref rasConnectionsAmount); 

      // jeżeli RasEnumConnections nie zwróciło ERROR_SUCCESS 
      if (rasEnumReturn != 0) throw new Win32Exception(rasEnumReturn); 
      return rasconnStructs; 
     } 

     /// <summary> 
     /// Rozłącza internet. 
     /// </summary> 
     public void Disconnect() 
     { 
      RASCONN[] rasStructs = GetRasConnections(); 

      // Przejście przez każdą strukturę RASCONN 
      for (int i = 0; i < rasConnectionsAmount; i++) 
      { 
       // Pobranie pojedynczej struktury 
       RASCONN rStruct = rasStructs[i]; 

       // Jeżeli uchwyt do połączenia wynosi 0, to brak połączenia 
       if (rStruct.hrasconn == IntPtr.Zero) continue; // i następna struktura... 

       // Rozłączenie... 
       RasHangUp(rStruct.hrasconn); 
      } 
     } 

     public void Connect() 
     { 
      // TODO 
     } 

     public bool IsConnected() 
     { 
      RASCONN[] rasStructs = GetRasConnections(); 

      RASCONNSTATUS rasConnStatus = new RASCONNSTATUS(); 
      rasConnStatus.dwSize = Marshal.SizeOf(typeof(RASCONNSTATUS)); 

      for (int i = 0; i < rasConnectionsAmount; ++i) 
      { 
       // Pobranie pojedynczej struktury 
       RASCONN rStruct = rasStructs[i]; 

       int statusResult = RasGetConnectStatus(rStruct.hrasconn, ref rasConnStatus); 
       if (statusResult != 0) throw new Win32Exception(statusResult); 
       if(rasConnStatus.rasconnstate == RAS_Connected) return true; 
      } 
      return false; 
     } 
    } 
} 
+7

LOL @ Connect() méthode corps: // TODO –

Questions connexes