Как мне работать с подключениями удаленного доступа (RAS) в Windows, используя C # /. NET? - PullRequest
4 голосов
/ 06 апреля 2009

Мне нужно иметь возможность подключаться, отключаться и повторно подключаться по телефонной линии в приложении C # .NET Framework. Создание соединения в телефонной книге также может быть полезным / необходимым.

Существуют ли какие-либо классы или библиотеки, написанные для C # или .NET, которые прекрасно подходят для меня? У кого-нибудь есть какой-нибудь код, которым они хотели бы поделиться?

Примечание : приложение без присмотра , подобно киоску, и, следовательно, требующее действий пользователя неприемлемо.

Ответы [ 4 ]

9 голосов
/ 09 апреля 2009

Проверьте проект DotRas на CodePlex.com, у него есть весь API.

http://www.codeplex.com/DotRas

3 голосов
/ 06 апреля 2009

Один из способов сделать это - через Interop вокруг RAS. RasDialDlg () можно использовать для открытия подключения удаленного доступа без отображения диалогового окна. Используйте RasHangUp () для отключения.

RasEnumConnections () можно использовать для просмотра списка доступных соединений.

dll - это Rasapi32.dll - заголовки находятся в ras.h и raserror.h

0 голосов
/ 26 июля 2009
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;
        }
    }
}
0 голосов
/ 06 апреля 2009

Это вырезано из пары разных классов (некоторые коды опущены из-за возможных проблем с конфиденциальностью), поэтому может не скомпилироваться с прямой копией. Надеюсь, это поможет!

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