如何使用C#/ .NET在Windows中使用拨号(RAS)连接?

我需要能够在C#.NET Framework应用程序中连接,断开连接并重新连接拨号网络连接。 在电话簿中创建连接可能也是有用/必要的。

是否有任何为C#或.NET编写的类或库可以很好地为我提供所有这些function? 任何人都有一些他们愿意分享的代码?

注意 :应用程序是无人值守的 ,就像Kiosk一样,因此要求用户操作是不可接受的。

查看CodePlex.com上的DotRas项目,它已完成整个API。

http://www.codeplex.com/DotRas

一种方法是通过围绕RAS的Interop。 RasDialDlg()可用于打开拨号网络连接而不显示对话框。 使用RasHangUp()断开连接。

RasEnumConnections()可用于列出可用连接。

dll是Rasapi32.dll – 标题位于ras.h和raserror.h中

这是从几个不同的类中删除的(为了可能的隐私问题省略了一些代码),因此它可能无法使用直接副本进行编译。 希望能帮助到你!

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); } } 
 using System; using System.ComponentModel; using System.Runtime.InteropServices; namespace MenelGameAuto.Internet { class RAS { #region  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; ///  /// Wykazuje wszystkie połączenia RAS. ///  [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; } ///  /// Pobranie wszystkich połączeń RAS. ///  /// Struktury połączeń RAS 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; } ///  /// Rozłącza internet. ///  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; } } }