Возникла необходимость написать небольшую утилиту, которая сможет настроить PPPoE соединение. Я «нагуглил» некоторые исходники из которых выделил следующий код:
Это прототип ;-)#include <windows.h>
#include <Ras.h>
#define WINVER 0x0501
#define _WIN32_WINNT 0x0501
#pragma comment(lib, "rasapi32.lib")
#pragma comment(lib, "Mpr.lib")
#include <windowsx.h>
#include <Winerror.h>
#include <Ras.h>
#include <shellapi.h>
#include <commdlg.h>
#include <rasdlg.h>
#include <raserror.h>
#include <commctrl.h>
#include <string>
#include <sstream>
#include <stdio.h>
#include <shlobj.h>
#include <shlwapi.h>
#include <stdint.h>
using namespace std;
#define CONN_NAME "Provider_NAME"
#define LOGIN "login0000"
#define PASSWORD "pass00000000"
void main()
{
// Настраиваем PPPoE соединение
RASENTRY RS;
memset(&RS, 0, sizeof(RASENTRY));
RS.dwSize = sizeof(RS);
RS.dwfOptions =
RASEO_PreviewUserPw | // Запрашивать имя пользователя и пароль
RASEO_ModemLights | // Вывести значёк в область уведомлений
// RASEO_PreviewDomain | // отображать поле "Домен" в окне ввода пользователя и пароля (вкладка "Параметры" - установить флажок "Включать домен входа в Windows")
// RASEO_PreviewPhoneNumber | // отображать выпадающий список "Набрать" в окне ввода пользователя и пароля
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_Internet | RASEO2_DontNegotiateMultilink | RASEO2_ReconnectIfDropped;
RS.dwIdleDisconnectSeconds = RASIDS_Disabled; // Не отключаться если нет активности
RS.dwfNetProtocols = RASNP_Ip; // протоколы Интернета
RS.dwFramingProtocol = RASFP_Ppp; // протокол Point-to-Point Protocol
RS.dwType = 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 = 60; // интервал между повторениями
lstrcpy(RS.szLocalPhoneNumber, TEXT("service"));
lstrcpy(RS.szDeviceType, RASDT_PPPoE); // RASDT_PPPoE - обуславливает тип подключения (PPPoE)
lstrcpy(RS.szDeviceName, TEXT("PPPoE"));
DWORD dwRet = RasSetEntryProperties(NULL,TEXT(CONN_NAME), &RS, sizeof(RS), NULL, 0);
switch (dwRet)
{
case ERROR_ACCESS_DENIED:
printf("The user does not have the correct privileges. Only an administrator can complete this task.\n");
break;
case ERROR_BUFFER_OVERFLOW:
printf("The address or buffer specified by lpRasEntry is invalid.\n");
break;
case ERROR_CANNOT_OPEN_PROFILE:
printf("The phone book is corrupted or missing components.\n");
break;
case ERROR_INVALID_PARAMETER:
printf("The RASENTRY structure pointed to by the lpRasEntry parameter does not contain adequate information. See the description for lpRasEntry to see what information is required.\n");
break;
case ERROR_SUCCESS:
printf("Create succeeds.\n");
break;
}
// Прописываем логин и пароль
RASDIALPARAMS RS_param;
memset(&RS_param, 0, sizeof(RASDIALPARAMS));
RS_param.dwSize = sizeof(RS_param);
lstrcpy(RS_param.szEntryName, TEXT(CONN_NAME));
lstrcpy(RS_param.szPhoneNumber, NULL);
lstrcpy(RS_param.szCallbackNumber, TEXT(""));
lstrcpy(RS_param.szUserName, TEXT(LOGIN));
lstrcpy(RS_param.szPassword, TEXT(PASSWORD));
lstrcpy(RS_param.szDomain, TEXT(""));
RS_param.dwSubEntry = 0;
RS_param.dwCallbackId = 0;
DWORD dwParam = RasSetEntryDialParams(NULL, &RS_param, FALSE);
switch (dwParam)
{
case ERROR_BUFFER_INVALID:
printf("The address or buffer specified by lprasdialparams is invalid.\n");
break;
case ERROR_CANNOT_OPEN_PHONEBOOK:
printf("The phone book is corrupted or missing components.\n");
break;
case ERROR_CANNOT_FIND_PHONEBOOK_ENTRY:
printf("The phone-book entry does not exist.\n");
break;
case ERROR_SUCCESS:
printf("Login add succeeds.\n");
break;
}
Sleep(3000);
}
Представленный выше код успешно компилируется и выполнился. Работоспособное PPPoE соединение действительно появляется среди сетевых интерфейсов, но логин и пароль оказываются не прописанными, то есть код, который отвечает за прописывание логина и пароля не работает и я не понимаю, почему.
Помогите решить эту проблему пожалуйста.
Используются
Windows 7,
Visual Studio 2012.
PS
Я по роду деятельности вовсе не программист и, возможно, поэтому не замечаю чего-то очевидного, что мешает работать этому коду правильно?