Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Как создать Высокоскоростное подключение?


Автор: vladislavus 14.3.2009, 19:50
Привет, всем!
Вообщем нужно написать утилитку которая будет создавать подключение к интернету в Windows XP.
Тип подключения: Высокоскоростное подключение к Интернету запрашивающее логин и пароль.
Виндовый мастер делает Минипорт WAN (PPPoE).
В WinAPI я несилен поэтому полученую информацию в интернете переваривал тяжело...
Да и то попадалось не создание подключения, а использывание т. е. различные примеры звонилок.

Нашел интерфейсный модуль для rasapi32.dll http://www.delphisources.ru/pages/faq/base/archives/rasapi.zip

Но врубиться в него чет немогу.

Ребят, если несложно киньте кусок кода для создания подключения. smile 

Зарание - Спасибо!  

Автор: skyboy 14.3.2009, 20:02
ничего похожего на createconnection не нашел, так что скорре всего интерфейсный модуль подобного не позволит.
надо либо смотреть, что и в каком виде экспортирует rasapi32.dll и дополнять интерфейсный модуль самостоятельно, либо обратиться к командам оболочки системы(как там, createprocess, что ли?) и выполнить "netsh ras add ...."

Автор: MadMas 14.3.2009, 20:31
Что-то вроде такого с использованием модуля rasAPI

Код

NeedBytes:=0;
HeapAlloc(GetProcessHeap, HEAP_ZERO_MEMORY, NeedBytes);
RasEntry.dwSize := sizeof(TRasEntry); 
dwError:=RasGetEntryPropertiesA(nil, '', nil, NeedBytes, nil, 0); //get structure size
 if dwError=603 then //ERROR_BUFFER_TOO_SMALL
 begin
    Fillchar(RasEntry, sizeof(TRasEntry), 0); 
    with RasEntry do
                    begin
    dwCountryID := 7;
    dwCountryCode := 7;
    szAreaCode := '';
    szLocalPhoneNumber:=ip_VPN;
    szDeviceType:= RASDT_Vpn;
    dwfNetProtocols := RASNP_Ip;
    dwFramingProtocol := RASFP_Ppp;
    dwVpnStrategy := 1;
    dwfOptions := RASEO_PreviewUserPw;
    dwType:=5;
                      end;

    RasEntry.dwSize := sizeof(TRasEntry);
    dwError:=RasSetEntryPropertiesA(nil,
                      PChar(name_of_connection),
                      @RasEntry,
                      sizeof(TRasEntry),
                      nil,
                      0);
  if dwError=0 then ShowMessage('VPN!');
end;
 end;



Автор: vladislavus 15.3.2009, 10:30
skyboy, 
вот и я не нашел.
> и выполнить "netsh ras add ...."
что то так нет добавления соеденения ч/з минипорт wan (pppoe)


Автор: vladislavus 15.3.2009, 11:17
MadMas, 
пасиб, поковыряю.

Автор: vladislavus 15.3.2009, 14:18
ну вот есть прогресс!!!  smile 
вот код который создает нужное подключение
Код

var
  NeedBytes,dwError:integer;
  RasEntry: TRasEntry;
begin
  NeedBytes:=0;
  HeapAlloc(GetProcessHeap, HEAP_ZERO_MEMORY, NeedBytes);
  RasEntry.dwSize := sizeof(TRasEntry);
  Fillchar(RasEntry, sizeof(TRasEntry), 0);
  with RasEntry do
  begin
   szDeviceType:= 'PPPoE';
   dwfOptions := RDEOPT_SetSoftwareCompression + RDEOPT_PreviewUserPw;
  end;
  RasEntry.dwSize := sizeof(TRasEntry);
  dwError:=RasSetEntryPropertiesA(
    nil,
    PChar('Test connect 1'),
    @RasEntry,
    sizeof(TRasEntry),
    nil,
    0);
  if dwError=0 then ShowMessage('Ok!');
end;


но как прописать логин и пароль???  буду искать smile 

Автор: vladislavus 15.3.2009, 20:07
Всем спасибо! Проблема решена! Вот код который создает подключение ч\з минипорт wan с логином и паролем

Код


var
  NeedBytes,dwError:integer;
  RasEntry: TRasEntry;
  RasDialParams:TRasDialParams;
  EntryName : String;
begin
  EntryName := 'Мой конект';
  NeedBytes:=0;
  HeapAlloc(GetProcessHeap, HEAP_ZERO_MEMORY, NeedBytes);
  RasEntry.dwSize := sizeof(TRasEntry);
  Fillchar(RasEntry, sizeof(TRasEntry), 0);

  with RasEntry do
  begin
   szDeviceType:= 'PPPoE';
   // настройки соединения
   dwfOptions := RDEOPT_PreviewUserPw or
                 RASEO_IpHeaderCompression or
                 RASEO_ModemLights or
                 RASEO_IpHeaderCompression;
  end;

  RasEntry.dwSize := sizeof(TRasEntry);
  dwError:=RasSetEntryPropertiesA(
    nil,
    PChar(EntryName),
    @RasEntry,
    sizeof(TRasEntry),
    nil,
    0);

  // настройки логинов и паролей
  RasDialParams.dwSize := sizeof(TRasDialParams);
  StrPCopy(RasDialParams.szEntryName,EntryName);
  StrPCopy(RasDialParams.szUserName,'Васин логин');
  StrPCopy(RasDialParams.szPassword,'Васин пароль');

  RasSetEntryDialParams(nil,  RasDialParams,  False);
end;


Автор: crazynetwork 28.10.2009, 20:01
В виндовс 7 этот код не хочет работать. И второй вопрос, как всетаки создать именно VPN подключение???

Автор: darkmamba 29.10.2009, 12:46
Какой нужно модуль подключать?

Автор: crazynetwork 29.10.2009, 16:51
Цитата(darkmamba @ 29.10.2009,  12:46)
Какой нужно модуль подключать?

В Uses надо прописать RAS.
А теперь вопрос. Какой функцией вызвать само соединение после того как оно уже создалось?

Автор: Maks1509 30.10.2009, 20:33
Делал давно, код проверял на Windows 2000, XP, Vista, 7, работоспособен. Информацию долго искал по различным форумам. Пришлось создавать свои заголовочные модули, но результат вцелом оправдал себя. smile 
Код

function CreateRasVpnConnection(szEntryName, szPhoneName, szUserName, szPassword: WideString): LRESULT;
var
  rEntry  : RASENTRYW;
  rDial   : RASDIALPARAMSW;
  lpCred  : RASCREDENTIALSW;
  dwSize  : Integer;
  EntrySize  : Integer;
  InfoSize  : Integer;
  dwFlags : DWORD;
  dwFlags2: DWORD;
  dwRes   : DWORD;
begin
  // следующий оператор выполняется если версия ОС = 5.0 или <= 4.0, что соответствует
  // Windows 2000 или Windows NT. В этих ОС в структуре RASENTRY отсутствовали поля
  // начиная с dwfOptions2 (включительно). программа собранная в Windows XP имеет
  // структуру RASENTRY большего размера чем используется в Win 2000 и Win NT, поэтому
  // при попытке вызвать функцию RasSetEntryProperties с указанием размера структуры
  // через sizeof(RASENTRY) происходит ошибка. значение 2088 соответствует
  // размеру RASENTRY без полей начиная с dwfOptions2. таким образом даже используя
  // структуру большего чем нужно для Win 2000 и Win NT размера можно сделать
  // корректный вызов функции RasSetEntryProperties.

  // для ANSI функций размер структуры в этом случае такой
  {if IsWindowsXP then
    dwSize := SizeOf(RASENTRYW)
  else
    dwSize := 2088;}

  // более универсальный способ - система сама возвратит нужный размер структуры
  // и не требуется проверять версию ОС.

  dwSize := SizeOf(RASENTRYW);
  RasGetEntryPropertiesW(nil, nil, nil, EntrySize, nil, InfoSize);
  if (EntrySize < dwSize) then
    dwSize := EntrySize;

  // Задаём флаговые параметры VPN соединения

  dwFlags := // Вкладка 'Параметры', флаг 'Запрашивать имя, пароль, сертификат и т.д.', вкл
             RASEO_PreviewUserPw or
             // Вкладка 'Общие', флаг 'При подключении вывести значок в области уведомлений', вкл
             RASEO_ModemLights or
             // Вкладка 'Общие', флаг 'Отображать ход подключения', вкл
             RASEO_ShowDialingProgress or
             // Использовать основной шлюз
             RASEO_RemoteDefaultGateway or
             // Зашифрованный пароль будет использоваться при проверке подлинности с сервером
             RASEO_RequireEncryptedPw or
             // Использовать автоматически логин, пароль и домен из Windows
             RASEO_RequireDataEncryption or
             // Пароль будет зашифрован по схеме Microsoft
             RASEO_RequireMsEncryptedPw;

  dwFlags2 := // Вкладка 'Параметры', флаг 'Согласовывать многоканальное подключение для одноканальных', выкл
              RASEO2_DontNegotiateMultilink or
              // Вкладка 'Параметры', флаг 'Перезвонить при разрыве связи', вкл
              RASEO2_ReconnectIfDropped;

  // Заполняем структуру RASENTRY

  ZeroMemory(@rEntry, SizeOf(RASENTRYW));

  rEntry.dwSize                  := dwSize;
  rEntry.dwfOptions              := dwFlags;
  // Тип используемого протокола = TCP/IP
  rEntry.dwfNetProtocols         := RASNP_Ip;
  // Тип используемого протокола сервера удаленного доступа = Point-to-Point Protocol (PPP)
  rEntry.dwFramingProtocol       := RASFP_Ppp;
  // Тип создаваемого подключения - Виртуальная частная сеть (VPN)
  rEntry.dwType                  := RASET_Vpn;
  // Значение выпадающего списка 'Тип VPN' = 'Автоматически'
  // Вызывается сначала только PPTP, если же попытка заканчивается неудачей, то вызывается L2TP
  rEntry.dwVpnStrategy           := VS_Default;
  rEntry.dwfOptions2             := dwFlags2;
  // Вкладка 'Безопасность', флаг 'Требуется шифрование данных', вкл
  // Диалог 'Дополнительные параметры безопасности', список 'Шифрование данных' = 'обязательное'
  // Тип шифрования данных при подключении = Шифрование не используется
  rEntry.dwEncryptionType        := ET_None;
  // Используем соединение устройств с множеством «подвходов»
  rEntry.dwDialMode              := RASEDM_DialAll;
  // Вкладка 'Параметры', 'Число повторений набора номера' = 3
  rEntry.dwRedialCount           := 3;
  // Вкладка 'Параметры', 'Интервал между повторениями' = 60 секунд
  rEntry.dwRedialPause           := 60;
  lstrcpyW(rEntry.szLocalPhoneNumber, @szPhoneName[1]);
  lstrcpyW(rEntry.szDeviceType, RASDT_Vpn);

  // Создаем новое подключение с нужными параметрами

  dwRes := RasSetEntryPropertiesW(nil, @szEntryName[1], @rEntry, dwSize, nil, 0);
  case dwRes of
    ERROR_SUCCESS:
      begin

        // выполняем проверку версии ОС. начиная с ОС Win XP и старше, логин и
        // пароль (фактически это нам и требуется) можно изменить функцией
        // RasSetCredentials, а в предыдущих ОС можно с помощью функции
        // RasSetEntryDialParams. в Win XP еще можно изменить пароль функцией
        // RasSetEntryDialParams, а вот уже в Win Vista и старше не получится.

        if IsWindowsXP then
          begin

            // Заполняем структуру RASCREDENTIALS

            ZeroMemory(@lpCred, SizeOf(RASCREDENTIALSW));

            lpCred.dwMask := RASCM_UserName or RASCM_Password;
            lpCred.dwSize := SizeOf(RASCREDENTIALSW);
            lstrcpyW(lpCred.szUserName, @szUserName[1]);
            lstrcpyW(lpCred.szPassword, @szPassword[1]);

            // Изменяем логин и пароль созданного подключения

            dwRes := RasSetCredentialsW(nil, @szEntryName[1], lpCred, FALSE);

          end
        else
          begin

            // Заполняем структуру RASDIALPARAMS

            ZeroMemory(@rDial, SizeOf(RASDIALPARAMSW));
            rDial.dwSize := SizeOf(RASDIALPARAMSW);
            lstrcpyW(rDial.szEntryName, @szEntryName[1]);
            lstrcpyW(rDial.szUserName, @szUserName[1]);
            lstrcpyW(rDial.szPassword, @szPassword[1]);

            // Изменяем логин и пароль созданного подключения

            dwRes := RasSetEntryDialParamsW(nil, @rDial, FALSE);

          end;

      end;
  end;

  Result := dwRes;
end;


Код

unit F_Ras;

interface

uses
  Windows;

const
  raslib = 'rasapi32.dll';

// RASIPADDR structure

type
  PRASIPADDR = ^RASIPADDR;
  RASIPADDR = record
    a: Byte;
    b: Byte;
    c: Byte;
    d: Byte;
  end;

const
  RAS_MaxAreaCode       = 10;
  RAS_MaxPhoneNumber    = 128;
  RAS_MaxDeviceType     = 16;
  RAS_MaxDeviceName     = 128;
  RAS_MaxPadType        = 32;
  RAS_MaxX25Address     = 200;
  RAS_MaxFacilities     = 200;
  RAS_MaxUserData       = 200;
  RAS_MaxDnsSuffix      = 255;
  RAS_MaxEntryName      = 256;
  RAS_MaxCallbackNumber = RAS_MaxPhoneNumber;
  UNLEN                 = 256; // Maximum user name length
  PWLEN                 = 256; // Maximum password length
  CNLEN                 = 15; // Computer name length
  DNLEN                 = CNLEN; // Maximum domain name length

// RASCREDENTIALS structure

type
  RASCREDENTIALSA = record
    dwSize    : DWORD;
    dwMask    : DWORD;
    szUserName: Array [0..UNLEN] of AnsiChar;
    szPassword: Array [0..PWLEN] of AnsiChar;
    szDomain  : Array [0..DNLEN] of AnsiChar;
  end;

  RASCREDENTIALSW = record
    dwSize    : DWORD;
    dwMask    : DWORD;
    szUserName: Array [0..UNLEN] of WideChar;
    szPassword: Array [0..PWLEN] of WideChar;
    szDomain  : Array [0..DNLEN] of WideChar;
  end;

  LPRASCREDENTIALSW = ^RASCREDENTIALSW;
  LPRASCREDENTIALSA = ^RASCREDENTIALSA;
  LPRASCREDENTIALS = ^RASCREDENTIALS;
  RASCREDENTIALS = RASCREDENTIALSA;

const
  // RASCREDENTIALS dwMask values

  RASCM_UserName = $00000001;
  RASCM_Password = $00000002;

// RASDIALPARAMS structure

type
  tagRASDIALPARAMSA = record
    dwSize          : DWORD;
    szEntryName     : Array [0..RAS_MaxEntryName] of AnsiChar;
    szPhoneNumber   : Array [0..RAS_MaxPhoneNumber] of AnsiChar;
    szCallbackNumber: Array [0..RAS_MaxCallbackNumber] of AnsiChar;
    szUserName      : Array [0..UNLEN] of AnsiChar;
    szPassword      : Array [0..PWLEN] of AnsiChar;
    szDomain        : Array [0..DNLEN] of AnsiChar;
    // {$IFDEF WINVER_0x401_OR_GREATER}
    dwSubEntry      : DWORD;
    dwCallbackId    : DWORD;
  end;

  tagRASDIALPARAMSW = record
    dwSize          : DWORD;
    szEntryName     : Array [0..RAS_MaxEntryName] of WideChar;
    szPhoneNumber   : Array [0..RAS_MaxPhoneNumber] of WideChar;
    szCallbackNumber: Array [0..RAS_MaxCallbackNumber] of WideChar;
    szUserName      : Array [0..UNLEN] of WideChar;
    szPassword      : Array [0..PWLEN] of WideChar;
    szDomain        : Array [0..DNLEN] of WideChar;
    // {$IFDEF WINVER_0x401_OR_GREATER}
    dwSubEntry      : DWORD;
    dwCallbackId    : DWORD;
  end;

  PRASDIALPARAMSA = ^RASDIALPARAMSA;
  PRASDIALPARAMSW = ^RASDIALPARAMSW;
  PRASDIALPARAMS = PRASDIALPARAMSA;
  tagRASDIALPARAMS = tagRASDIALPARAMSA;
  RASDIALPARAMSA = tagRASDIALPARAMSA;
  RASDIALPARAMSW = tagRASDIALPARAMSW;
  RASDIALPARAMS = RASDIALPARAMSA;

// RASENTRY structure

type
  tagRASENTRYA = record
    dwSize                    : DWORD;
    dwfOptions                : DWORD;
    // Настройки телефонного номера
    dwCountryID               : DWORD;
    dwCountryCode             : DWORD;
    szAreaCode                : Array [0..RAS_MaxAreaCode] of AnsiChar;
    szLocalPhoneNumber        : Array [0..RAS_MaxPhoneNumber] of AnsiChar;
    dwAlternateOffset         : DWORD;
    // PPP(Протокол Point-to-point)/Ip
    ipaddr                    : RASIPADDR;
    ipaddrDns                 : RASIPADDR;
    ipaddrDnsAlt              : RASIPADDR;
    ipaddrWins                : RASIPADDR;
    ipaddrWinsAlt             : RASIPADDR;
    // Протокол
    dwFrameSize               : DWORD;
    dwfNetProtocols           : DWORD;
    dwFramingProtocol         : DWORD;
    // Сценарии
    szScript                  : Array [0..MAX_PATH-1] of AnsiChar;
    // Автодозвон
    szAutodialDll             : Array [0..MAX_PATH-1] of AnsiChar;
    szAutodialFunc            : Array [0..MAX_PATH-1] of AnsiChar;
    // Устройство
    szDeviceType              : Array [0..RAS_MaxDeviceType] of AnsiChar;
    szDeviceName              : Array [0..RAS_MaxDeviceName]of AnsiChar;
    // X.25
    szX25PadType              : Array [0..RAS_MaxPadType] of AnsiChar;
    szX25Address              : Array [0..RAS_MaxX25Address] of AnsiChar;
    szX25Facilities           : Array [0..RAS_MaxFacilities] of AnsiChar;
    szX25UserData             : Array [0..RAS_MaxUserData] of AnsiChar;
    dwChannels                : DWORD;
    // Зарезервировано
    dwReserved1               : DWORD;
    dwReserved2               : DWORD;
    //  {$IFDEF WINVER_0x401_OR_GREATER}
    // Подключение из многих соединений
    dwSubEntries              : DWORD;
    dwDialMode                : DWORD;
    dwDialExtraPercent        : DWORD;
    dwDialExtraSampleSeconds  : DWORD;
    dwHangUpExtraPercent      : DWORD;
    dwHangUpExtraSampleSeconds: DWORD;
    // Время простоя до разъединения
    dwIdleDisconnectSeconds   : DWORD;
    // {$IFDEF WINVER_0x500_OR_GREATER}
    dwType                    : DWORD;
    dwEncryptionType          : DWORD;
    dwCustomAuthKey           : DWORD;
    guidId                    : TGUID;
    szCustomDialDll           : Array [0..MAX_PATH-1] of AnsiChar;
    dwVpnStrategy             : DWORD;
    //  {$IFDEF WINVER_0x501_OR_GREATER}
    dwfOptions2               : DWORD;
    dwfOptions3               : DWORD;
    szDnsSuffix               : Array [0..RAS_MaxDnsSuffix] of AnsiChar;
    dwTcpWindowSize           : DWORD;
    szPrerequisitePbk         : Array [0..MAX_PATH-1] of AnsiChar;
    szPrerequisiteEntry       : Array [0..RAS_MaxEntryName] of AnsiChar;
    dwRedialCount             : DWORD;
    dwRedialPause             : DWORD;
    //  {$IFDEF WINVER_0x600_OR_GREATER}
    //    ipv6addrDns   : RASIPV6ADDR;
    //    ipv6addrDnsAlt: RASIPV6ADDR;
    //  {$ENDIF}
    //    dwIPv4InterfaceMetric: DWORD;
    //    dwIPv6InterfaceMetric: DWORD;
  end;

  tagRASENTRYW = record
    dwSize                    : DWORD;
    dwfOptions                : DWORD;
    // Настройки телефонного номера
    dwCountryID               : DWORD;
    dwCountryCode             : DWORD;
    szAreaCode                : Array [0..RAS_MaxAreaCode] of WideChar;
    szLocalPhoneNumber        : Array [0..RAS_MaxPhoneNumber] of WideChar;
    dwAlternateOffset         : DWORD;
    // PPP(Протокол Point-to-point)/Ip
    ipaddr                    : RASIPADDR;
    ipaddrDns                 : RASIPADDR;
    ipaddrDnsAlt              : RASIPADDR;
    ipaddrWins                : RASIPADDR;
    ipaddrWinsAlt             : RASIPADDR;
    // Протокол
    dwFrameSize               : DWORD;
    dwfNetProtocols           : DWORD;
    dwFramingProtocol         : DWORD;
    // Сценарии
    szScript                  : Array [0..MAX_PATH-1] of WideChar;
    // Автодозвон
    szAutodialDll             : Array [0..MAX_PATH-1] of WideChar;
    szAutodialFunc            : Array [0..MAX_PATH-1] of WideChar;
    // Устройство
    szDeviceType              : Array [0..RAS_MaxDeviceType] of WideChar;
    szDeviceName              : Array [0..RAS_MaxDeviceName]of WideChar;
    // X.25
    szX25PadType              : Array [0..RAS_MaxPadType] of WideChar;
    szX25Address              : Array [0..RAS_MaxX25Address] of WideChar;
    szX25Facilities           : Array [0..RAS_MaxFacilities] of WideChar;
    szX25UserData             : Array [0..RAS_MaxUserData] of WideChar;
    dwChannels                : DWORD;
    // Зарезервировано
    dwReserved1               : DWORD;
    dwReserved2               : DWORD;
    //  {$IFDEF WINVER_0x401_OR_GREATER}
    // Подключение из многих соединений
    dwSubEntries              : DWORD;
    dwDialMode                : DWORD;
    dwDialExtraPercent        : DWORD;
    dwDialExtraSampleSeconds  : DWORD;
    dwHangUpExtraPercent      : DWORD;
    dwHangUpExtraSampleSeconds: DWORD;
    // Время простоя до разъединения
    dwIdleDisconnectSeconds   : DWORD;
    // {$IFDEF WINVER_0x500_OR_GREATER}
    dwType                    : DWORD;
    dwEncryptionType          : DWORD;
    dwCustomAuthKey           : DWORD;
    guidId                    : TGUID;
    szCustomDialDll           : Array [0..MAX_PATH-1] of WideChar;
    dwVpnStrategy             : DWORD;
    //  {$IFDEF WINVER_0x501_OR_GREATER}
    dwfOptions2               : DWORD;
    dwfOptions3               : DWORD;
    szDnsSuffix               : Array [0..RAS_MaxDnsSuffix] of WideChar;
    dwTcpWindowSize           : DWORD;
    szPrerequisitePbk         : Array [0..MAX_PATH-1] of WideChar;
    szPrerequisiteEntry       : Array [0..RAS_MaxEntryName] of WideChar;
    dwRedialCount             : DWORD;
    dwRedialPause             : DWORD;
    //  {$IFDEF WINVER_0x600_OR_GREATER}
    //    ipv6addrDns   : RASIPV6ADDR;
    //    ipv6addrDnsAlt: RASIPV6ADDR;
    //  {$ENDIF}
    //    dwIPv4InterfaceMetric: DWORD;
    //    dwIPv6InterfaceMetric: DWORD;
  end;

  tagRASENTRY = tagRASENTRYA;
  RASENTRYA = tagRASENTRYA;
  RASENTRYW = tagRASENTRYW;
  RASENTRY = RASENTRYA;

const
// RASENTRY dwfOptions bit flags

  RASEO_UseCountryAndAreaCodes    = $00000001;
  RASEO_SpecificIpAddr            = $00000002;
  RASEO_SpecificNameServers       = $00000004;
  RASEO_IpHeaderCompression       = $00000008;
  RASEO_RemoteDefaultGateway      = $00000010;
  RASEO_DisableLcpExtensions      = $00000020;
  RASEO_TerminalBeforeDial        = $00000040;
  RASEO_TerminalAfterDial         = $00000080;
  RASEO_ModemLights               = $00000100;
  RASEO_SwCompression             = $00000200;
  RASEO_RequireEncryptedPw        = $00000400;
  RASEO_RequireMsEncryptedPw      = $00000800;
  RASEO_RequireDataEncryption     = $00001000;
  RASEO_NetworkLogon              = $00002000;
  RASEO_UseLogonCredentials       = $00004000;
  RASEO_PromoteAlternates         = $00008000;
  RASEO_SecureLocalFiles          = $00010000;
  RASEO_RequireEAP                = $00020000;
  RASEO_RequirePAP                = $00040000;
  RASEO_RequireSPAP               = $00080000;
  RASEO_Custom                    = $00100000;
  RASEO_PreviewPhoneNumber        = $00200000;
  RASEO_SharedPhoneNumbers        = $00800000;
  RASEO_PreviewUserPw             = $01000000;
  RASEO_PreviewDomain             = $02000000;
  RASEO_ShowDialingProgress       = $04000000;
  RASEO_RequireCHAP               = $08000000;
  RASEO_RequireMsCHAP             = $10000000;
  RASEO_RequireMsCHAP2            = $20000000;
  RASEO_RequireW95MSCHAP          = $40000000;
  RASEO_CustomScript              = $80000000;

// RASENTRY dwfOptions bit flags

  RASEO2_DontNegotiateMultilink   = $00000004;
  RASEO2_ReconnectIfDropped       = $00000100;

// RASENTRY dwProtocols bit flags

  RASNP_Ip = $00000004;

// RASENTRY dwFramingProtocols bit flags

  RASFP_Ppp = $00000001;

// RASENTRY dwIdleDisconnectSeconds constants

  RASIDS_Disabled = $FFFFFFFF;

// RASENTRY szDeviceType default strings

  RASDT_Vpn = 'vpn';

// RASENTRY dwDialMode values

  RASEDM_DialAll = 1;

// The entry type used to determine which UI properties
// are to be presented to user.  This generally corresponds
// to a Connections "add" wizard selection.

  RASET_Vpn = 2; // Virtual private network

// There is currently no difference between RASCTRYINFOA and RASCTRYINFOW.
// This may change in the future.

  ET_None    = 0; // No encryption
  VS_Default = 0; // default (PPTP for now)

function RasSetEntryPropertiesA(lpszPhonebook, szEntry: PAnsiChar; lpbEntry: Pointer; dwEntrySize: Longint; lpbDeviceInfo: Pointer; dwDeviceInfoSize: Longint): Longint; stdcall;
function RasSetEntryPropertiesW(lpszPhonebook, szEntry: PWideChar; lpbEntry: Pointer; dwEntrySize: Longint; lpbDeviceInfo: Pointer; dwDeviceInfoSize: Longint): Longint; stdcall;
function RasSetEntryProperties(lpszPhonebook, szEntry: PAnsiChar; lpbEntry: Pointer; dwEntrySize: Longint; lpbDeviceInfo: Pointer; dwDeviceInfoSize: Longint): Longint; stdcall;

function RasGetEntryPropertiesA(lpszPhonebook, szEntry: PAnsiChar; lpbEntry: Pointer; var lpdwEntrySize: Longint; lpbDeviceInfo: Pointer; var lpdwDeviceInfoSize: Longint): Longint; stdcall;
function RasGetEntryPropertiesW(lpszPhonebook, szEntry: PWideChar; lpbEntry: Pointer; var lpdwEntrySize: Longint; lpbDeviceInfo: Pointer; var lpdwDeviceInfoSize: Longint): Longint; stdcall;
function RasGetEntryProperties(lpszPhonebook, szEntry: PAnsiChar; lpbEntry: Pointer; var lpdwEntrySize: Longint; lpbDeviceInfo: Pointer; var lpdwDeviceInfoSize: Longint): Longint; stdcall;

function RasSetEntryDialParamsA(lpszPhonebook: PAnsiChar; lprasdialparams: PRASDIALPARAMSA; fRemovePassword: BOOL): DWORD; stdcall;
function RasSetEntryDialParamsW(lpszPhonebook: PWideChar; lprasdialparams: PRASDIALPARAMSW; fRemovePassword: BOOL): DWORD; stdcall;
function RasSetEntryDialParams(lpszPhonebook: PAnsiChar; lprasdialparams: PRASDIALPARAMS; fRemovePassword: BOOL): DWORD; stdcall;

function RasGetEntryDialParamsA(lpszPhoneBook: PAnsiChar; var lpDialParams: RASDIALPARAMSA; var lpfPassword: LongBool): Longint; stdcall;
function RasGetEntryDialParamsW(lpszPhoneBook: PWideChar; var lpDialParams: RASDIALPARAMSW; var lpfPassword: LongBool): Longint; stdcall;
function RasGetEntryDialParams(lpszPhoneBook: PAnsiChar; var lpDialParams: RASDIALPARAMS; var lpfPassword: LongBool): Longint; stdcall;

function RasSetCredentialsA(lpszPhoneBook, lpszEntry: PAnsiChar; var lpCredentials: RASCREDENTIALSA; fRemovePassword: LongBool): Longint; stdcall;
function RasSetCredentialsW(lpszPhoneBook, lpszEntry: PWideChar; var lpCredentials: RASCREDENTIALSW; fRemovePassword: LongBool): Longint; stdcall;
function RasSetCredentials(lpszPhoneBook, lpszEntry: PAnsiChar; var lpCredentials: RASCREDENTIALS; fRemovePassword: LongBool): Longint; stdcall;

implementation

function RasSetEntryPropertiesA; external raslib name 'RasSetEntryPropertiesA';
function RasSetEntryPropertiesW; external raslib name 'RasSetEntryPropertiesW';
function RasSetEntryProperties;  external raslib name 'RasSetEntryPropertiesA';

function RasGetEntryPropertiesA; external raslib name 'RasGetEntryPropertiesA';
function RasGetEntryPropertiesW; external raslib name 'RasGetEntryPropertiesW';
function RasGetEntryProperties;  external raslib name 'RasGetEntryPropertiesA';

function RasSetEntryDialParamsA; external raslib name 'RasSetEntryDialParamsA';
function RasSetEntryDialParamsW; external raslib name 'RasSetEntryDialParamsW';
function RasSetEntryDialParams;  external raslib name 'RasSetEntryDialParamsA';

function RasGetEntryDialParamsA; external raslib name 'RasGetEntryDialParamsA';
function RasGetEntryDialParamsW; external raslib name 'RasGetEntryDialParamsW';
function RasGetEntryDialParams;  external raslib name 'RasGetEntryDialParamsA';

function RasSetCredentialsA;     external raslib name 'RasSetCredentialsA';
function RasSetCredentialsW;     external raslib name 'RasSetCredentialsW';
function RasSetCredentials;      external raslib name 'RasSetCredentialsA';

end.

Автор: crazynetwork 31.10.2009, 14:15
Огромное мега спасибо. Сегодня проверю на работоспособность и обязательно отпишусь =)



Где описана    IsWindowsXP   ???

Автор: Maks1509 31.10.2009, 16:24
crazynetwork

Код

function IsWindowsXP: Boolean;
var
  os: TOSVersionInfoA;
begin
  ZeroMemory(@os, SizeOf(TOSVersionInfoA));
  os.dwOSVersionInfoSize := SizeOf(os);
  GetVersionExA(os);
  Result := ((os.dwPlatformId = VER_PLATFORM_WIN32_NT) and (os.dwMajorVersion >= 5) and (os.dwMinorVersion >= 1));
end;


По аналогии можно и другие типы систем определить. smile

Автор: crazynetwork 31.10.2009, 20:23
Такс, подключение создается с нужными параметрами что в принципе и раньше делалось. А как же все таки вызвать ПРОГРАММНЫЙ  дозвон?

Автор: Maks1509 2.11.2009, 00:01
Заполнить структуру TRasDialParams и вызвать RasDial вроде бы.

Автор: crazynetwork 4.11.2009, 20:13
Опять же РасДиал нигде не описана. Структуру мы заполняли когда создавали подклчение. ТОесть оно уже есть с нужным логином, паролем и т.д. Теперь как то его надо запустить. Вопрос как?

Автор: Maks1509 5.11.2009, 20:43
http://google.com/codesearch?hl=ru&lr=&q=ras+lang%3Apascal&sbtn=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA
Вообще гугл код - удобная штука. smile Там же этих дозвонщиков непомерное количество.

Автор: crazynetwork 8.11.2009, 22:33
Мужики, нихрена не получаеся чего только уже не делал. Выручайте. Делфи 2010, винда7. Соединение создается со всеми нужными параметрами. Вызвать дозвон програмно, ну никак не получается. ПОМОГАЙТЕ.

Автор: darkmamba 14.11.2009, 01:15
Может это поможет ?

Код

DWORD RasDial(
  LPRASDIALEXTENSIONS lpRasDialExtensions,
  LPCTSTR lpszPhonebook,
  LPRASDIALPARAMS lpRasDialParams,
  DWORD dwNotifierType,
  LPVOID lpvNotifier,
  LPHRASCONN lphRasConn
);

Автор: crazynetwork 7.6.2010, 20:54
Цитата(Maks1509 @ 30.10.2009,  20:33)
Делал давно, код проверял на Windows 2000, XP, Vista, 7, работоспособен. Информацию долго искал по различным форумам. Пришлось создавать свои заголовочные модули, но результат вцелом оправдал себя. smile 
Код

function CreateRasVpnConnection(szEntryName, szPhoneName, szUserName, szPassword: WideString): LRESULT;
var
  rEntry  : RASENTRYW;
  rDial   : RASDIALPARAMSW;
  lpCred  : RASCREDENTIALSW;
  dwSize  : Integer;
  EntrySize  : Integer;
  InfoSize  : Integer;
  dwFlags : DWORD;
  dwFlags2: DWORD;
  dwRes   : DWORD;
begin
  // следующий оператор выполняется если версия ОС = 5.0 или <= 4.0, что соответствует
  // Windows 2000 или Windows NT. В этих ОС в структуре RASENTRY отсутствовали поля
  // начиная с dwfOptions2 (включительно). программа собранная в Windows XP имеет
  // структуру RASENTRY большего размера чем используется в Win 2000 и Win NT, поэтому
  // при попытке вызвать функцию RasSetEntryProperties с указанием размера структуры
  // через sizeof(RASENTRY) происходит ошибка. значение 2088 соответствует
  // размеру RASENTRY без полей начиная с dwfOptions2. таким образом даже используя
  // структуру большего чем нужно для Win 2000 и Win NT размера можно сделать
  // корректный вызов функции RasSetEntryProperties.

  // для ANSI функций размер структуры в этом случае такой
  {if IsWindowsXP then
    dwSize := SizeOf(RASENTRYW)
  else
    dwSize := 2088;}

  // более универсальный способ - система сама возвратит нужный размер структуры
  // и не требуется проверять версию ОС.

  dwSize := SizeOf(RASENTRYW);
  RasGetEntryPropertiesW(nil, nil, nil, EntrySize, nil, InfoSize);
  if (EntrySize < dwSize) then
    dwSize := EntrySize;

  // Задаём флаговые параметры VPN соединения

  dwFlags := // Вкладка 'Параметры', флаг 'Запрашивать имя, пароль, сертификат и т.д.', вкл
             RASEO_PreviewUserPw or
             // Вкладка 'Общие', флаг 'При подключении вывести значок в области уведомлений', вкл
             RASEO_ModemLights or
             // Вкладка 'Общие', флаг 'Отображать ход подключения', вкл
             RASEO_ShowDialingProgress or
             // Использовать основной шлюз
             RASEO_RemoteDefaultGateway or
             // Зашифрованный пароль будет использоваться при проверке подлинности с сервером
             RASEO_RequireEncryptedPw or
             // Использовать автоматически логин, пароль и домен из Windows
             RASEO_RequireDataEncryption or
             // Пароль будет зашифрован по схеме Microsoft
             RASEO_RequireMsEncryptedPw;

  dwFlags2 := // Вкладка 'Параметры', флаг 'Согласовывать многоканальное подключение для одноканальных', выкл
              RASEO2_DontNegotiateMultilink or
              // Вкладка 'Параметры', флаг 'Перезвонить при разрыве связи', вкл
              RASEO2_ReconnectIfDropped;

  // Заполняем структуру RASENTRY

  ZeroMemory(@rEntry, SizeOf(RASENTRYW));

  rEntry.dwSize                  := dwSize;
  rEntry.dwfOptions              := dwFlags;
  // Тип используемого протокола = TCP/IP
  rEntry.dwfNetProtocols         := RASNP_Ip;
  // Тип используемого протокола сервера удаленного доступа = Point-to-Point Protocol (PPP)
  rEntry.dwFramingProtocol       := RASFP_Ppp;
  // Тип создаваемого подключения - Виртуальная частная сеть (VPN)
  rEntry.dwType                  := RASET_Vpn;
  // Значение выпадающего списка 'Тип VPN' = 'Автоматически'
  // Вызывается сначала только PPTP, если же попытка заканчивается неудачей, то вызывается L2TP
  rEntry.dwVpnStrategy           := VS_Default;
  rEntry.dwfOptions2             := dwFlags2;
  // Вкладка 'Безопасность', флаг 'Требуется шифрование данных', вкл
  // Диалог 'Дополнительные параметры безопасности', список 'Шифрование данных' = 'обязательное'
  // Тип шифрования данных при подключении = Шифрование не используется
  rEntry.dwEncryptionType        := ET_None;
  // Используем соединение устройств с множеством «подвходов»
  rEntry.dwDialMode              := RASEDM_DialAll;
  // Вкладка 'Параметры', 'Число повторений набора номера' = 3
  rEntry.dwRedialCount           := 3;
  // Вкладка 'Параметры', 'Интервал между повторениями' = 60 секунд
  rEntry.dwRedialPause           := 60;
  lstrcpyW(rEntry.szLocalPhoneNumber, @szPhoneName[1]);
  lstrcpyW(rEntry.szDeviceType, RASDT_Vpn);

  // Создаем новое подключение с нужными параметрами

  dwRes := RasSetEntryPropertiesW(nil, @szEntryName[1], @rEntry, dwSize, nil, 0);
  case dwRes of
    ERROR_SUCCESS:
      begin

        // выполняем проверку версии ОС. начиная с ОС Win XP и старше, логин и
        // пароль (фактически это нам и требуется) можно изменить функцией
        // RasSetCredentials, а в предыдущих ОС можно с помощью функции
        // RasSetEntryDialParams. в Win XP еще можно изменить пароль функцией
        // RasSetEntryDialParams, а вот уже в Win Vista и старше не получится.

        if IsWindowsXP then
          begin

            // Заполняем структуру RASCREDENTIALS

            ZeroMemory(@lpCred, SizeOf(RASCREDENTIALSW));

            lpCred.dwMask := RASCM_UserName or RASCM_Password;
            lpCred.dwSize := SizeOf(RASCREDENTIALSW);
            lstrcpyW(lpCred.szUserName, @szUserName[1]);
            lstrcpyW(lpCred.szPassword, @szPassword[1]);

            // Изменяем логин и пароль созданного подключения

            dwRes := RasSetCredentialsW(nil, @szEntryName[1], lpCred, FALSE);

          end
        else
          begin

            // Заполняем структуру RASDIALPARAMS

            ZeroMemory(@rDial, SizeOf(RASDIALPARAMSW));
            rDial.dwSize := SizeOf(RASDIALPARAMSW);
            lstrcpyW(rDial.szEntryName, @szEntryName[1]);
            lstrcpyW(rDial.szUserName, @szUserName[1]);
            lstrcpyW(rDial.szPassword, @szPassword[1]);

            // Изменяем логин и пароль созданного подключения

            dwRes := RasSetEntryDialParamsW(nil, @rDial, FALSE);

          end;

      end;
  end;

  Result := dwRes;
end;


Код

unit F_Ras;

interface

uses
  Windows;

const
  raslib = 'rasapi32.dll';

// RASIPADDR structure

type
  PRASIPADDR = ^RASIPADDR;
  RASIPADDR = record
    a: Byte;
    b: Byte;
    c: Byte;
    d: Byte;
  end;

const
  RAS_MaxAreaCode       = 10;
  RAS_MaxPhoneNumber    = 128;
  RAS_MaxDeviceType     = 16;
  RAS_MaxDeviceName     = 128;
  RAS_MaxPadType        = 32;
  RAS_MaxX25Address     = 200;
  RAS_MaxFacilities     = 200;
  RAS_MaxUserData       = 200;
  RAS_MaxDnsSuffix      = 255;
  RAS_MaxEntryName      = 256;
  RAS_MaxCallbackNumber = RAS_MaxPhoneNumber;
  UNLEN                 = 256; // Maximum user name length
  PWLEN                 = 256; // Maximum password length
  CNLEN                 = 15; // Computer name length
  DNLEN                 = CNLEN; // Maximum domain name length

// RASCREDENTIALS structure

type
  RASCREDENTIALSA = record
    dwSize    : DWORD;
    dwMask    : DWORD;
    szUserName: Array [0..UNLEN] of AnsiChar;
    szPassword: Array [0..PWLEN] of AnsiChar;
    szDomain  : Array [0..DNLEN] of AnsiChar;
  end;

  RASCREDENTIALSW = record
    dwSize    : DWORD;
    dwMask    : DWORD;
    szUserName: Array [0..UNLEN] of WideChar;
    szPassword: Array [0..PWLEN] of WideChar;
    szDomain  : Array [0..DNLEN] of WideChar;
  end;

  LPRASCREDENTIALSW = ^RASCREDENTIALSW;
  LPRASCREDENTIALSA = ^RASCREDENTIALSA;
  LPRASCREDENTIALS = ^RASCREDENTIALS;
  RASCREDENTIALS = RASCREDENTIALSA;

const
  // RASCREDENTIALS dwMask values

  RASCM_UserName = $00000001;
  RASCM_Password = $00000002;

// RASDIALPARAMS structure

type
  tagRASDIALPARAMSA = record
    dwSize          : DWORD;
    szEntryName     : Array [0..RAS_MaxEntryName] of AnsiChar;
    szPhoneNumber   : Array [0..RAS_MaxPhoneNumber] of AnsiChar;
    szCallbackNumber: Array [0..RAS_MaxCallbackNumber] of AnsiChar;
    szUserName      : Array [0..UNLEN] of AnsiChar;
    szPassword      : Array [0..PWLEN] of AnsiChar;
    szDomain        : Array [0..DNLEN] of AnsiChar;
    // {$IFDEF WINVER_0x401_OR_GREATER}
    dwSubEntry      : DWORD;
    dwCallbackId    : DWORD;
  end;

  tagRASDIALPARAMSW = record
    dwSize          : DWORD;
    szEntryName     : Array [0..RAS_MaxEntryName] of WideChar;
    szPhoneNumber   : Array [0..RAS_MaxPhoneNumber] of WideChar;
    szCallbackNumber: Array [0..RAS_MaxCallbackNumber] of WideChar;
    szUserName      : Array [0..UNLEN] of WideChar;
    szPassword      : Array [0..PWLEN] of WideChar;
    szDomain        : Array [0..DNLEN] of WideChar;
    // {$IFDEF WINVER_0x401_OR_GREATER}
    dwSubEntry      : DWORD;
    dwCallbackId    : DWORD;
  end;

  PRASDIALPARAMSA = ^RASDIALPARAMSA;
  PRASDIALPARAMSW = ^RASDIALPARAMSW;
  PRASDIALPARAMS = PRASDIALPARAMSA;
  tagRASDIALPARAMS = tagRASDIALPARAMSA;
  RASDIALPARAMSA = tagRASDIALPARAMSA;
  RASDIALPARAMSW = tagRASDIALPARAMSW;
  RASDIALPARAMS = RASDIALPARAMSA;

// RASENTRY structure

type
  tagRASENTRYA = record
    dwSize                    : DWORD;
    dwfOptions                : DWORD;
    // Настройки телефонного номера
    dwCountryID               : DWORD;
    dwCountryCode             : DWORD;
    szAreaCode                : Array [0..RAS_MaxAreaCode] of AnsiChar;
    szLocalPhoneNumber        : Array [0..RAS_MaxPhoneNumber] of AnsiChar;
    dwAlternateOffset         : DWORD;
    // PPP(Протокол Point-to-point)/Ip
    ipaddr                    : RASIPADDR;
    ipaddrDns                 : RASIPADDR;
    ipaddrDnsAlt              : RASIPADDR;
    ipaddrWins                : RASIPADDR;
    ipaddrWinsAlt             : RASIPADDR;
    // Протокол
    dwFrameSize               : DWORD;
    dwfNetProtocols           : DWORD;
    dwFramingProtocol         : DWORD;
    // Сценарии
    szScript                  : Array [0..MAX_PATH-1] of AnsiChar;
    // Автодозвон
    szAutodialDll             : Array [0..MAX_PATH-1] of AnsiChar;
    szAutodialFunc            : Array [0..MAX_PATH-1] of AnsiChar;
    // Устройство
    szDeviceType              : Array [0..RAS_MaxDeviceType] of AnsiChar;
    szDeviceName              : Array [0..RAS_MaxDeviceName]of AnsiChar;
    // X.25
    szX25PadType              : Array [0..RAS_MaxPadType] of AnsiChar;
    szX25Address              : Array [0..RAS_MaxX25Address] of AnsiChar;
    szX25Facilities           : Array [0..RAS_MaxFacilities] of AnsiChar;
    szX25UserData             : Array [0..RAS_MaxUserData] of AnsiChar;
    dwChannels                : DWORD;
    // Зарезервировано
    dwReserved1               : DWORD;
    dwReserved2               : DWORD;
    //  {$IFDEF WINVER_0x401_OR_GREATER}
    // Подключение из многих соединений
    dwSubEntries              : DWORD;
    dwDialMode                : DWORD;
    dwDialExtraPercent        : DWORD;
    dwDialExtraSampleSeconds  : DWORD;
    dwHangUpExtraPercent      : DWORD;
    dwHangUpExtraSampleSeconds: DWORD;
    // Время простоя до разъединения
    dwIdleDisconnectSeconds   : DWORD;
    // {$IFDEF WINVER_0x500_OR_GREATER}
    dwType                    : DWORD;
    dwEncryptionType          : DWORD;
    dwCustomAuthKey           : DWORD;
    guidId                    : TGUID;
    szCustomDialDll           : Array [0..MAX_PATH-1] of AnsiChar;
    dwVpnStrategy             : DWORD;
    //  {$IFDEF WINVER_0x501_OR_GREATER}
    dwfOptions2               : DWORD;
    dwfOptions3               : DWORD;
    szDnsSuffix               : Array [0..RAS_MaxDnsSuffix] of AnsiChar;
    dwTcpWindowSize           : DWORD;
    szPrerequisitePbk         : Array [0..MAX_PATH-1] of AnsiChar;
    szPrerequisiteEntry       : Array [0..RAS_MaxEntryName] of AnsiChar;
    dwRedialCount             : DWORD;
    dwRedialPause             : DWORD;
    //  {$IFDEF WINVER_0x600_OR_GREATER}
    //    ipv6addrDns   : RASIPV6ADDR;
    //    ipv6addrDnsAlt: RASIPV6ADDR;
    //  {$ENDIF}
    //    dwIPv4InterfaceMetric: DWORD;
    //    dwIPv6InterfaceMetric: DWORD;
  end;

  tagRASENTRYW = record
    dwSize                    : DWORD;
    dwfOptions                : DWORD;
    // Настройки телефонного номера
    dwCountryID               : DWORD;
    dwCountryCode             : DWORD;
    szAreaCode                : Array [0..RAS_MaxAreaCode] of WideChar;
    szLocalPhoneNumber        : Array [0..RAS_MaxPhoneNumber] of WideChar;
    dwAlternateOffset         : DWORD;
    // PPP(Протокол Point-to-point)/Ip
    ipaddr                    : RASIPADDR;
    ipaddrDns                 : RASIPADDR;
    ipaddrDnsAlt              : RASIPADDR;
    ipaddrWins                : RASIPADDR;
    ipaddrWinsAlt             : RASIPADDR;
    // Протокол
    dwFrameSize               : DWORD;
    dwfNetProtocols           : DWORD;
    dwFramingProtocol         : DWORD;
    // Сценарии
    szScript                  : Array [0..MAX_PATH-1] of WideChar;
    // Автодозвон
    szAutodialDll             : Array [0..MAX_PATH-1] of WideChar;
    szAutodialFunc            : Array [0..MAX_PATH-1] of WideChar;
    // Устройство
    szDeviceType              : Array [0..RAS_MaxDeviceType] of WideChar;
    szDeviceName              : Array [0..RAS_MaxDeviceName]of WideChar;
    // X.25
    szX25PadType              : Array [0..RAS_MaxPadType] of WideChar;
    szX25Address              : Array [0..RAS_MaxX25Address] of WideChar;
    szX25Facilities           : Array [0..RAS_MaxFacilities] of WideChar;
    szX25UserData             : Array [0..RAS_MaxUserData] of WideChar;
    dwChannels                : DWORD;
    // Зарезервировано
    dwReserved1               : DWORD;
    dwReserved2               : DWORD;
    //  {$IFDEF WINVER_0x401_OR_GREATER}
    // Подключение из многих соединений
    dwSubEntries              : DWORD;
    dwDialMode                : DWORD;
    dwDialExtraPercent        : DWORD;
    dwDialExtraSampleSeconds  : DWORD;
    dwHangUpExtraPercent      : DWORD;
    dwHangUpExtraSampleSeconds: DWORD;
    // Время простоя до разъединения
    dwIdleDisconnectSeconds   : DWORD;
    // {$IFDEF WINVER_0x500_OR_GREATER}
    dwType                    : DWORD;
    dwEncryptionType          : DWORD;
    dwCustomAuthKey           : DWORD;
    guidId                    : TGUID;
    szCustomDialDll           : Array [0..MAX_PATH-1] of WideChar;
    dwVpnStrategy             : DWORD;
    //  {$IFDEF WINVER_0x501_OR_GREATER}
    dwfOptions2               : DWORD;
    dwfOptions3               : DWORD;
    szDnsSuffix               : Array [0..RAS_MaxDnsSuffix] of WideChar;
    dwTcpWindowSize           : DWORD;
    szPrerequisitePbk         : Array [0..MAX_PATH-1] of WideChar;
    szPrerequisiteEntry       : Array [0..RAS_MaxEntryName] of WideChar;
    dwRedialCount             : DWORD;
    dwRedialPause             : DWORD;
    //  {$IFDEF WINVER_0x600_OR_GREATER}
    //    ipv6addrDns   : RASIPV6ADDR;
    //    ipv6addrDnsAlt: RASIPV6ADDR;
    //  {$ENDIF}
    //    dwIPv4InterfaceMetric: DWORD;
    //    dwIPv6InterfaceMetric: DWORD;
  end;

  tagRASENTRY = tagRASENTRYA;
  RASENTRYA = tagRASENTRYA;
  RASENTRYW = tagRASENTRYW;
  RASENTRY = RASENTRYA;

const
// RASENTRY dwfOptions bit flags

  RASEO_UseCountryAndAreaCodes    = $00000001;
  RASEO_SpecificIpAddr            = $00000002;
  RASEO_SpecificNameServers       = $00000004;
  RASEO_IpHeaderCompression       = $00000008;
  RASEO_RemoteDefaultGateway      = $00000010;
  RASEO_DisableLcpExtensions      = $00000020;
  RASEO_TerminalBeforeDial        = $00000040;
  RASEO_TerminalAfterDial         = $00000080;
  RASEO_ModemLights               = $00000100;
  RASEO_SwCompression             = $00000200;
  RASEO_RequireEncryptedPw        = $00000400;
  RASEO_RequireMsEncryptedPw      = $00000800;
  RASEO_RequireDataEncryption     = $00001000;
  RASEO_NetworkLogon              = $00002000;
  RASEO_UseLogonCredentials       = $00004000;
  RASEO_PromoteAlternates         = $00008000;
  RASEO_SecureLocalFiles          = $00010000;
  RASEO_RequireEAP                = $00020000;
  RASEO_RequirePAP                = $00040000;
  RASEO_RequireSPAP               = $00080000;
  RASEO_Custom                    = $00100000;
  RASEO_PreviewPhoneNumber        = $00200000;
  RASEO_SharedPhoneNumbers        = $00800000;
  RASEO_PreviewUserPw             = $01000000;
  RASEO_PreviewDomain             = $02000000;
  RASEO_ShowDialingProgress       = $04000000;
  RASEO_RequireCHAP               = $08000000;
  RASEO_RequireMsCHAP             = $10000000;
  RASEO_RequireMsCHAP2            = $20000000;
  RASEO_RequireW95MSCHAP          = $40000000;
  RASEO_CustomScript              = $80000000;

// RASENTRY dwfOptions bit flags

  RASEO2_DontNegotiateMultilink   = $00000004;
  RASEO2_ReconnectIfDropped       = $00000100;

// RASENTRY dwProtocols bit flags

  RASNP_Ip = $00000004;

// RASENTRY dwFramingProtocols bit flags

  RASFP_Ppp = $00000001;

// RASENTRY dwIdleDisconnectSeconds constants

  RASIDS_Disabled = $FFFFFFFF;

// RASENTRY szDeviceType default strings

  RASDT_Vpn = 'vpn';

// RASENTRY dwDialMode values

  RASEDM_DialAll = 1;

// The entry type used to determine which UI properties
// are to be presented to user.  This generally corresponds
// to a Connections "add" wizard selection.

  RASET_Vpn = 2; // Virtual private network

// There is currently no difference between RASCTRYINFOA and RASCTRYINFOW.
// This may change in the future.

  ET_None    = 0; // No encryption
  VS_Default = 0; // default (PPTP for now)

function RasSetEntryPropertiesA(lpszPhonebook, szEntry: PAnsiChar; lpbEntry: Pointer; dwEntrySize: Longint; lpbDeviceInfo: Pointer; dwDeviceInfoSize: Longint): Longint; stdcall;
function RasSetEntryPropertiesW(lpszPhonebook, szEntry: PWideChar; lpbEntry: Pointer; dwEntrySize: Longint; lpbDeviceInfo: Pointer; dwDeviceInfoSize: Longint): Longint; stdcall;
function RasSetEntryProperties(lpszPhonebook, szEntry: PAnsiChar; lpbEntry: Pointer; dwEntrySize: Longint; lpbDeviceInfo: Pointer; dwDeviceInfoSize: Longint): Longint; stdcall;

function RasGetEntryPropertiesA(lpszPhonebook, szEntry: PAnsiChar; lpbEntry: Pointer; var lpdwEntrySize: Longint; lpbDeviceInfo: Pointer; var lpdwDeviceInfoSize: Longint): Longint; stdcall;
function RasGetEntryPropertiesW(lpszPhonebook, szEntry: PWideChar; lpbEntry: Pointer; var lpdwEntrySize: Longint; lpbDeviceInfo: Pointer; var lpdwDeviceInfoSize: Longint): Longint; stdcall;
function RasGetEntryProperties(lpszPhonebook, szEntry: PAnsiChar; lpbEntry: Pointer; var lpdwEntrySize: Longint; lpbDeviceInfo: Pointer; var lpdwDeviceInfoSize: Longint): Longint; stdcall;

function RasSetEntryDialParamsA(lpszPhonebook: PAnsiChar; lprasdialparams: PRASDIALPARAMSA; fRemovePassword: BOOL): DWORD; stdcall;
function RasSetEntryDialParamsW(lpszPhonebook: PWideChar; lprasdialparams: PRASDIALPARAMSW; fRemovePassword: BOOL): DWORD; stdcall;
function RasSetEntryDialParams(lpszPhonebook: PAnsiChar; lprasdialparams: PRASDIALPARAMS; fRemovePassword: BOOL): DWORD; stdcall;

function RasGetEntryDialParamsA(lpszPhoneBook: PAnsiChar; var lpDialParams: RASDIALPARAMSA; var lpfPassword: LongBool): Longint; stdcall;
function RasGetEntryDialParamsW(lpszPhoneBook: PWideChar; var lpDialParams: RASDIALPARAMSW; var lpfPassword: LongBool): Longint; stdcall;
function RasGetEntryDialParams(lpszPhoneBook: PAnsiChar; var lpDialParams: RASDIALPARAMS; var lpfPassword: LongBool): Longint; stdcall;

function RasSetCredentialsA(lpszPhoneBook, lpszEntry: PAnsiChar; var lpCredentials: RASCREDENTIALSA; fRemovePassword: LongBool): Longint; stdcall;
function RasSetCredentialsW(lpszPhoneBook, lpszEntry: PWideChar; var lpCredentials: RASCREDENTIALSW; fRemovePassword: LongBool): Longint; stdcall;
function RasSetCredentials(lpszPhoneBook, lpszEntry: PAnsiChar; var lpCredentials: RASCREDENTIALS; fRemovePassword: LongBool): Longint; stdcall;

implementation

function RasSetEntryPropertiesA; external raslib name 'RasSetEntryPropertiesA';
function RasSetEntryPropertiesW; external raslib name 'RasSetEntryPropertiesW';
function RasSetEntryProperties;  external raslib name 'RasSetEntryPropertiesA';

function RasGetEntryPropertiesA; external raslib name 'RasGetEntryPropertiesA';
function RasGetEntryPropertiesW; external raslib name 'RasGetEntryPropertiesW';
function RasGetEntryProperties;  external raslib name 'RasGetEntryPropertiesA';

function RasSetEntryDialParamsA; external raslib name 'RasSetEntryDialParamsA';
function RasSetEntryDialParamsW; external raslib name 'RasSetEntryDialParamsW';
function RasSetEntryDialParams;  external raslib name 'RasSetEntryDialParamsA';

function RasGetEntryDialParamsA; external raslib name 'RasGetEntryDialParamsA';
function RasGetEntryDialParamsW; external raslib name 'RasGetEntryDialParamsW';
function RasGetEntryDialParams;  external raslib name 'RasGetEntryDialParamsA';

function RasSetCredentialsA;     external raslib name 'RasSetCredentialsA';
function RasSetCredentialsW;     external raslib name 'RasSetCredentialsW';
function RasSetCredentials;      external raslib name 'RasSetCredentialsA';

end.

Подключение создается и работает. Кто знает как по умолчанию создать подключение что бы было отключено шифрование 7

Автор: crazynetwork 10.6.2010, 11:05
Всем спасибо, разобрался!

Автор: scorpio8882 1.10.2010, 22:12
Цитата

crazynetwork
    Всем спасибо, разобрался!


с народом поделись, а то уже час голову ломаю

Автор: scorpio8882 1.10.2010, 23:21
Подскажите пожалуйста, как можно подогнать эти исходники к созданию vpn такого типа:
Код

[internet]
Encoding=1
Type=2
AutoLogon=0
UseRasCredentials=1
DialParamsUID=32463000
Guid=217549EFC5D3414496FFCB68EB905841
BaseProtocol=1
VpnStrategy=2
ExcludedProtocols=0
LcpExtensions=1
DataEncryption=8
SwCompression=0
NegotiateMultilinkAlways=1
SkipNwcWarning=0
SkipDownLevelDialog=0
SkipDoubleDialDialog=0
DialMode=1
DialPercent=75
DialSeconds=120
HangUpPercent=10
HangUpSeconds=120
OverridePref=15
RedialAttempts=999999999
RedialSeconds=30
IdleDisconnectSeconds=0
RedialOnLinkFailure=1
CallbackMode=0
CustomDialDll=
CustomDialFunc=
CustomRasDialDll=
AuthenticateServer=0
ShareMsFilePrint=0
BindMsNetClient=0
SharedPhoneNumbers=0
GlobalDeviceSettings=0
PrerequisiteEntry=
PrerequisitePbk=
PreferredPort=VPN4-0
PreferredDevice=Минипорт WAN (L2TP)
PreferredBps=0
PreferredHwFlow=1
PreferredProtocol=1
PreferredCompression=1
PreferredSpeaker=1
PreferredMdmProtocol=0
PreviewUserPw=1
PreviewDomain=0
PreviewPhoneNumber=0
ShowDialingProgress=1
ShowMonitorIconInTaskBar=1
CustomAuthKey=-1
AuthRestrictions=608
TypicalAuth=2
IpPrioritizeRemote=1
IpHeaderCompression=0
IpAddress=0.0.0.0
IpDnsAddress=0.0.0.0
IpDns2Address=0.0.0.0
IpWinsAddress=0.0.0.0
IpWins2Address=0.0.0.0
IpAssign=1
IpNameAssign=1
IpFrameSize=1006
IpDnsFlags=0
IpNBTFlags=1
TcpWindowSize=0
UseFlags=0
IpSecFlags=0
IpDnsSuffix=

NETCOMPONENTS=
ms_server=0
ms_msclient=0
ms_psched=1

MEDIA=rastapi
Port=VPN4-0
Device=Минипорт WAN (L2TP)

DEVICE=vpn
PhoneNumber=10.10.0.20
AreaCode=
CountryCode=1
CountryID=1
UseDialingRules=0
Comment=
LastSelectedPhone=0
PromoteAlternates=0
TryNextAlternateOnFail=1


Добавлено через 2 минуты и 16 секунд
т.е. в свойствах vpn-соединения снять галочку "Требуется шифрование", во вкладке "Сеть" убрать галочки со всех компонентов кроме интернет протокола.

Автор: JnK 19.1.2011, 15:44
Цитата(scorpio8882 @ 1.10.2010,  22:12)
Цитата

crazynetwork
    Всем спасибо, разобрался!


с народом поделись, а то уже час голову ломаю

Убирает галочку Требовать шифрования.
Код

rEntry.dwEncryptionType := 196608;


Кто может подсказать где можно поправить в коде, что бы под Vista при создании:
 1. Безопасность - ставилось Обычные (рекомендуемые параметры)
 2. Галочка сохранять имя пользователя и пароль , только для меня.?

Автор: greenfox82 5.2.2011, 20:54
Доброго времени суток. Подскажите, пожалуйста, а как сделать созданное подключение PPPoE - подключением по умолчанию. В msdn ничего не нарыл. Буду очень признателен за помощь.

Автор: Maks1509 10.2.2011, 00:14
greenfox82

Моя версия такая:

Код

function CreateDefault(pszEntryName: WideString): LRESULT;
const
  pszSubKey: LPWSTR = 'SOFTWARE\Microsoft\RAS AutoDial\Default';
  pszValue : LPWSTR = 'DefaultInternet';
  dwDesired: Array [Boolean] of DWORD = (0, KEY_WOW64_64KEY);
var
  dwRet  : DWORD;
  regKey : HKEY;
  cbData : DWORD;
  Dispos : DWORD;
  function IsOnWow64: Boolean;
  var
    IsWow64Process: function(hProcess: THandle; var Wow64Process : BOOL): BOOL; stdcall;
    Wow64Process: BOOL;
  begin
   Result := False;
   IsWow64Process := GetProcAddress(GetModuleHandle(Kernel32), 'IsWow64Process');
   if Assigned(IsWow64Process) then
     if IsWow64Process(GetCurrentProcess, Wow64Process) then
       Result := Wow64Process;
  end;
begin
  Result := 0;
  dwRet := RegCreateKeyExW(HKEY_LOCAL_MACHINE, pszSubKey, 0, nil,
    REG_OPTION_NON_VOLATILE, KEY_WRITE or dwDesired[IsOnWow64], nil, regKey, @Dispos);
  if (dwRet <> ERROR_SUCCESS) then
    dwRet := RegOpenKeyExW(HKEY_LOCAL_MACHINE, pszSubKey, 0, KEY_WRITE or
      dwDesired[IsOnWow64], regKey);
  if (dwRet = ERROR_SUCCESS) then
  begin
    cbData := (lstrlenW(LPWSTR(pszEntryName)) + 1) * SizeOf(WideChar);
    Result := RegSetValueExW(regKey, pszValue, 0, REG_SZ, LPWSTR(pszEntryName),
      cbData);
    RegCloseKey(regKey);
  end;
end;

Автор: greenfox82 10.2.2011, 21:44
Maks1509

Огромнейшее-преогромнейшее спасибо!!! smile 

Автор: JnK 20.4.2011, 12:36
Кто может подсказать, как заставить программно Windows Vista/Seven запоминать имя пользователя и пароль?! в созданном VPN подключении.

Автор: crazynetwork 20.5.2011, 22:57
Рабочий код. Сам потратил много времени...

Код

procedure TForm1.doDialClick(Sender: TObject);
var
    I, Location: integer ;
      name,ip,login,pass: string;
     Extensions: TRasDialExtensions;
     XParams: TRasDialParams;
begin
    login:=Edit1.Text;
    pass:=Edit2.Text;
    CreateRasVpnConnection('vpn','ip',login,pass);

    //sleep(10);

    DialName := 'vpn';
    LabelConn.Caption := DialName ;

    TimerStatus.Enabled := false ;
    doDial.Enabled := false ;


    MagRasCon.EntryName := DialName ;
    MagRasCon.PBLocation := Location ;   // 5.21 keep location
    MagRasCon.PhoneNumber :=    '' ;  // use the one in the phonebook
    ConnLog.Lines.Add ('Starting to Dial Connection: ' + DialName) ;
    ConnLog.Lines.Add ('Phonebook Location: ' +
                             MasRasPBLocationStr [MagRasCon.PBLocation]) ;  // 5.21 show location


    DialHandle := 0 ;
    if MagRasCon.AutoConnectEx (DialHandle) <> 0 then
    begin
        // fails here is dialling did not even start
        ConnLog.Lines.Add  ('Dialling Failed - ' + MagRasCon.StatusStr) ;
        beep ;
        TimerStatus.Enabled := true ;
        doDial.Enabled := true ;
        exit ;
    end ;

    doHangup.Enabled := true ;
end;


Автор: teres 12.1.2013, 16:46
Цитата(crazynetwork @ 20.5.2011,  22:57)
Рабочий код. Сам потратил много времени...

Код

procedure TForm1.doDialClick(Sender: TObject);
var
    I, Location: integer ;
      name,ip,login,pass: string;
     Extensions: TRasDialExtensions;
     XParams: TRasDialParams;
begin
    login:=Edit1.Text;
    pass:=Edit2.Text;
    CreateRasVpnConnection('vpn','ip',login,pass);

    //sleep(10);

    DialName := 'vpn';
    LabelConn.Caption := DialName ;

    TimerStatus.Enabled := false ;
    doDial.Enabled := false ;


    MagRasCon.EntryName := DialName ;
    MagRasCon.PBLocation := Location ;   // 5.21 keep location
    MagRasCon.PhoneNumber :=    '' ;  // use the one in the phonebook
    ConnLog.Lines.Add ('Starting to Dial Connection: ' + DialName) ;
    ConnLog.Lines.Add ('Phonebook Location: ' +
                             MasRasPBLocationStr [MagRasCon.PBLocation]) ;  // 5.21 show location


    DialHandle := 0 ;
    if MagRasCon.AutoConnectEx (DialHandle) <> 0 then
    begin
        // fails here is dialling did not even start
        ConnLog.Lines.Add  ('Dialling Failed - ' + MagRasCon.StatusStr) ;
        beep ;
        TimerStatus.Enabled := true ;
        doDial.Enabled := true ;
        exit ;
    end ;

    doHangup.Enabled := true ;
end;


Помогите не могу разобраться в коде, где записать процедуру?? И как создать подключение чтобы ввод был через Логин Едит1, Пароль Едит2. создать подключение Button 1.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)