Задать вопрос
karabanov
@karabanov
Системный администратор

Настройка PPPoE. Часть кода не работает?

Возникла необходимость написать небольшую утилиту, которая сможет настроить 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

Я по роду деятельности вовсе не программист и, возможно, поэтому не замечаю чего-то очевидного, что мешает работать этому коду правильно?
  • Вопрос задан
  • 4052 просмотра
Подписаться 5 Оценить Комментировать
Решения вопроса 1
karabanov
@karabanov Автор вопроса
Системный администратор
ВНЕЗАПНО!
Установил все обновления для Visual Studio 2012 и код начал работать так, как должен.
Ндаа…
Продукты майкрософта такие продукты.
Такой простой код, состоящий сплош…
Да ну их. Пойду поскорее допишу эту утилитку и обратно GNU/Linux установлю.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы