#define WINVER 0x0501#define _WIN32_WINNT 0x0501#pragma comment(lib, "rasapi32.lib")#pragma comment(lib, "Mpr.lib")#include <windows.h>#include <windowsx.h>#include <ras.h>#include <shellapi.h>#include <commdlg.h>#include <rasdlg.h>#include <raserror.h>#include <commctrl.h>#include <string>#include <sstream>using namespace std;class Vpn{private: DWORD dwRet; HRASCONN connection;public: LPCWSTR vpnName; LPCWSTR vpnAdress; LPCWSTR vpnLogin; LPCWSTR vpnPassword; Vpn() { vpnName = TEXT("VPN-connection"); vpnAdress = TEXT(""); vpnLogin = TEXT("client1"); vpnPassword = TEXT("client1"); } void create() { RASENTRY RS; memset(&RS, 0, sizeof(RASENTRY)); RS.dwSize = sizeof(RS); RS.dwfOptions = //RASEO_PreviewUserPw | //RASEO_ModemLights | // RASEO_PreviewDomain | // отображать поле "Домен" в окне ввода пользователя и пароля (вкладка "Параметры" - установить флажок "Включать домен входа в Windows") RASEO_ShowDialingProgress | // вкладка "Параметры" - Параметры набора номера: установить флажок "Отображать ход подключения" RASEO_RemoteDefaultGateway | // вкладка "Сеть" - "Протокол Интернета (TCP/IP)" - кнопка "Дополнительно" - установить флажок "Использовать основной шлюз в удаленной сети" RASEO_SwCompression | // вкладка "Сеть" - кнопка "Параметры" - установить флажок "Использовать программное сжатие данных" // RASEO_RequirePAP | // вкладка "Безопасность" - "Дополнительные (выборочные параметры)" - установить флажок "Незашифрованный пароль (PAP)" // RASEO_RequireSPAP | // вкладка "Безопасность" - "Дополнительные (выборочные параметры)" - установить флажок "Протокол проверки пароля Shiva (SPAP)" RASEO_RequireCHAP | // вкладка "Безопасность" - "Дополнительные (выборочные параметры)" - установить флажок "Протокол проверки пароля CHAP" // RASEO_RequireMsCHAP | // вкладка "Безопасность" - "Дополнительные (выборочные параметры)" - установить флажок "Протокол проверки пароля Microsoft (MS-CHAP)" // RASEO_RequireW95MSCHAP | // вкладка "Безопасность" - "Дополнительные (выборочные параметры)" - установить флажок "Разрешить старый протокол MS-CHAP для Windows 95" RASEO_RequireMsCHAP2 | // вкладка "Безопасность" - "Дополнительные (выборочные параметры)" - установить флажок "Протокол проверки пароля Microsoft (MS-CHAP v2)" RASEO_SecureLocalFiles; // вкладка "Сеть" - Компоненты, используемые этим подключением: снять флажок "Использовать основной шлюз в удаленной сети"; RS.dwfOptions2 = RASEO2_DontNegotiateMultilink | RASEO2_ReconnectIfDropped; RS.dwfNetProtocols = RASNP_Ip; // протокол Интернета RS.dwFramingProtocol = RASFP_Ppp; // протокол Point-to-Point Protocol RS.dwType = RASET_Vpn; // тип подключения RASET_Broadband RS.dwVpnStrategy = VS_Default; // вкладка "Сеть" - По умолчанию RS.dwEncryptionType = ET_Optional; // параметры шифрования (ET_None, ET_Require, ET_RequireMax, ET_Optional) RS.dwDialMode = RASEDM_DialAll; RS.dwRedialCount = 99; // число повторов набора номера RS.dwRedialPause = 120; // интервал между повторениями lstrcpy(RS.szLocalPhoneNumber, vpnAdress); lstrcpy(RS.szDeviceType, TEXT("VPN")); // RASDT_PPPoE - обуславливает тип подключения (PPPoE) lstrcpy(RS.szDeviceName, TEXT("VPN")); dwRet = RasSetEntryProperties(NULL, vpnName, &RS, sizeof(RS), NULL, 0); } void open() { RASDIALPARAMS dial_params; dial_params.dwSize = sizeof(RASDIALPARAMS); wcscpy(dial_params.szEntryName, vpnName); wcscpy(dial_params.szPhoneNumber, L""); wcscpy(dial_params.szCallbackNumber, L""); wcscpy(dial_params.szUserName, vpnLogin); wcscpy(dial_params.szPassword, vpnPassword); wcscpy(dial_params.szDomain, L""); dial_params.dwSubEntry = 0; dial_params.dwCallbackId = 0; connection = NULL; dwRet = RasDial(NULL, NULL, &dial_params, 0, NULL, &connection); } void hangUp() { RASCONN ras[20]; DWORD dSize, dNumber; ras[0].dwSize = sizeof(RASCONN); dSize = sizeof( ras ); dwRet = RasEnumConnections(ras, &dSize, &dNumber); if (dwRet != 0) { return; } for (DWORD dCount = 0; dCount < dNumber; dCount++) { if (!_wcsicmp(ras[dCount].szEntryName, vpnName)) { HRASCONN hRasConn = ras[dCount].hrasconn; dwRet = RasHangUp(hRasConn); if (dwRet == 0) //Info("Информация", "Cоединение разорвано"); int i = 0; } } } void start() { open(); if (dwRet != 0) { if (dwRet == ERROR_CANNOT_FIND_PHONEBOOK_ENTRY) { create(); // Если соединения нет, то создаем if (dwRet != 0) //Info("Ошибка", "Невозможно создать VPN-соединение"); int i = 0; else open(); } } if (dwRet == 0) //Info("Информация", "Установлено соединение"); int i = 0; else //Info("Ошибка", "Невозможно установить VPN-соединение"); int i = 0; }};