Шустрый

Профиль
Группа: Участник
Сообщений: 58
Регистрация: 16.10.2009
Репутация: нет Всего: нет
|
Цитата(Maks1509 @ 30.10.2009, 20:33) | Делал давно, код проверял на Windows 2000, XP, Vista, 7, работоспособен. Информацию долго искал по различным форумам. Пришлось создавать свои заголовочные модули, но результат вцелом оправдал себя.
Код | 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
|