Автосоздание VPN-подключения

Технические вопросы по UTM 5.0
Makariy
Сообщения: 227
Зарегистрирован: Ср авг 27, 2008 14:08

Автосоздание VPN-подключения

Сообщение Makariy »

кто на чем делает?
пробовал на CMAK - не на всех компьютерах создается

gil
Сообщения: 355
Зарегистрирован: Вт ноя 11, 2008 14:28

Сообщение gil »

да-да, очень интересует ответ на этот вопрос тоже..

starchik
Сообщения: 461
Зарегистрирован: Сб ноя 22, 2008 22:07

Сообщение starchik »

сам делаю CMAK'ом еще небыло пробелмм, на любой винде создаеттся подключение. еще небыло ни одного случая что не создалось подключение.

Makariy
Сообщения: 227
Зарегистрирован: Ср авг 27, 2008 14:08

Сообщение Makariy »

starchik писал(а):сам делаю CMAK'ом еще небыло пробелмм, на любой винде создаеттся подключение. еще небыло ни одного случая что не создалось подключение.
у вас все еще впереди...

Аватара пользователя
Magnum72
Сообщения: 1947
Зарегистрирован: Чт сен 22, 2005 06:54
Контактная информация:

Сообщение Magnum72 »

Makariy писал(а):
starchik писал(а):сам делаю CMAK'ом еще небыло пробелмм, на любой винде создаеттся подключение. еще небыло ни одного случая что не создалось подключение.
у вас все еще впереди...
Чем не устраивает копирование файла rasphone в нужное место?

Makariy
Сообщения: 227
Зарегистрирован: Ср авг 27, 2008 14:08

Сообщение Makariy »

Magnum72 писал(а): Чем не устраивает копирование файла rasphone в нужное место?
зачем такие сложности? :)
уже написали своё на C++ и RASAPI
запускаеш программу она сама делает подключение и создает ярлык на рабочий стол

Pulse
Сообщения: 945
Зарегистрирован: Вт окт 03, 2006 12:58

Сообщение Pulse »

Makariy писал(а):
Magnum72 писал(а): Чем не устраивает копирование файла rasphone в нужное место?
зачем такие сложности? :)
уже написали своё на C++ и RASAPI
запускаеш программу она сама делает подключение и создает ярлык на рабочий стол
на win7 не было проблем?

Makariy
Сообщения: 227
Зарегистрирован: Ср авг 27, 2008 14:08

Сообщение Makariy »

Pulse писал(а): на win7 не было проблем?
нет, не было

Denisk
Сообщения: 5
Зарегистрирован: Пн ноя 09, 2009 09:12

Сообщение Denisk »

Код: Выделить всё

/*
by DenisK
Cоздание ярлыка стащено с netpatch :)
*/

#include <stdio.h>
#include <windows.h>
#include <tchar.h>
#include <string.h>
#include <shlobj.h>
#include <shlwapi.h>
#include <ras.h>
#include <Objbase.h>
#include <rasdlg.h>
#include <shellapi.h>
#pragma comment &#40;lib, "RASDlg.lib"&#41;
#pragma comment &#40;lib, "RASAPI32.lib"&#41;
#pragma comment &#40;lib, "Kernel32.lib"&#41;
#pragma comment &#40;lib, "user32.lib"&#41;
#pragma comment &#40;lib, "shell32.lib"&#41;
#pragma comment &#40;lib, "Ole32.lib"&#41;
#pragma comment &#40;lib, "shlwapi.lib"&#41;

//#include "resource.h"
#pragma optimize&#40;"gsy",on&#41; 


bool __fastcall CreateShortCut&#40;LPWSTR pwzShortCutFileName,  LPCITEMIDLIST pidl,
                               LPTSTR pszWorkingDirectory, WORD wHotKey, int iCmdShow&#41;;
int short_cut_startup&#40;char *connection_name, LPWSTR link_name&#41;;
LPITEMIDLIST GetNextItemID&#40;LPCITEMIDLIST pidl&#41;;
UINT GetSize&#40;LPCITEMIDLIST pidl&#41;;
LPITEMIDLIST Append&#40;LPCITEMIDLIST pidlBase, LPCITEMIDLIST pidlAdd&#41;;

LPMALLOC pMalloc;

int main&#40;void&#41; 
&#123;
LPRASENTRY      lpVPNParam;
    DWORD           ret;
    DWORD           cb;
 
    cb = 0;
    RasGetEntryProperties&#40;NULL, NULL, NULL, &cb, NULL, NULL&#41;;
 
    lpVPNParam = &#40;LPRASENTRY&#41;malloc&#40;cb&#41;;
    memset&#40;&#40;void*&#41;lpVPNParam, 0, cb&#41;;
 
    lpVPNParam->dwSize = cb;
    lpVPNParam->dwfOptions 				= RASEO_PreviewUserPw | RASEO_ShowDialingProgress | RASEO_Custom | RASEO_RequireMsCHAP2 | RASEO_RemoteDefaultGateway | RASEO_ModemLights;
    lpVPNParam->dwfOptions2				= RASEO2_DisableNbtOverIP | RASEO2_ReconnectIfDropped | RASEO2_Internet | RASEO2_SecureClientForMSNet | RASEO2_SecureFileAndPrint;
    //lpVPNParam->dwfOptions3             = 0;
    lpVPNParam->dwfNetProtocols         = RASNP_Ip;
    lpVPNParam->dwFramingProtocol       = RASFP_Ppp;
    lpVPNParam->dwEncryptionType        = ET_None;
    lpVPNParam->dwRedialPause           = 10;
    lpVPNParam->dwType                  = RASET_Vpn;
	lpVPNParam->dwVpnStrategy			= VS_PptpOnly;
	lpVPNParam->dwRedialCount			= 99;
    sprintf&#40;lpVPNParam->szDeviceType, "vpn"&#41;;
    sprintf&#40;lpVPNParam->szLocalPhoneNumber, "vpn.mtcv.ru"&#41;;
    ret = RasSetEntryProperties&#40;NULL, "Интернет", lpVPNParam, cb, NULL, 0&#41;;
    free&#40;lpVPNParam&#41;;
    //printf&#40;"VPN CREATED"&#41;;
	ShowWindow&#40;GetConsoleWindow&#40;&#41;,SW_HIDE&#41;;
    MessageBox&#40;NULL, "Впн создана!", "ОК!", MB_OK&#41;;
	 if&#40;short_cut_startup&#40;"Интернет", L"Интернет.lnk"&#41;&#41;
        MessageBox&#40;NULL, "Ярлык vpn создан", "ОК!", MB_OK&#41;;
    else MessageBox&#40;NULL, "Не могу создать ярлык!", "ОК!", MB_ICONERROR&#41;;
    Sleep&#40;2000&#41;;
	//ShellExecute&#40; NULL, "open", "cmd.exe","rasdial.exe Интернет", "C&#58;\\", SW_SHOWNORMAL&#41;;
	return 0;
	
&#125;



/* Main function which creating shortcut on desktop */
int short_cut_startup&#40;char *connection_name, LPWSTR link_name&#41;
&#123;
    LPITEMIDLIST pidConnections = NULL;
    LPITEMIDLIST pidlItems = NULL;
    LPITEMIDLIST pidlDesk = NULL;
    IShellFolder *psfFirstFolder = NULL;
    IShellFolder *psfDeskTop = NULL;
    IShellFolder *pConnections = NULL;
    LPENUMIDLIST ppenum = NULL;
    ULONG celtFetched;
    HRESULT hr;
    STRRET str_curr_connection_name;
    TCHAR curr_connection_name&#91;MAX_PATH&#93; = "";    /* Connection point name */
    TCHAR desktop_path&#91;MAX_PATH&#93;="";            /* Path to desktop */
    TCHAR full_link_name&#91;MAX_PATH&#93;="";            /* Full shortcut name */
    LPITEMIDLIST full_pid;                        /* Full shortcut pid */

   
    CoInitialize&#40; NULL &#41;;
    /* Allocating memory for Namespace objects */
    hr = SHGetMalloc&#40;&pMalloc&#41;;
    hr = SHGetFolderLocation&#40;NULL, CSIDL_CONNECTIONS, NULL, NULL, &pidConnections&#41;;

    /* Get full path to desktop */
    SHGetFolderPath&#40;NULL, CSIDL_DESKTOP, NULL, 0, desktop_path&#41;;

    hr = SHGetDesktopFolder&#40;&psfDeskTop&#41;;
    hr = psfDeskTop->BindToObject&#40;pidConnections, NULL, IID_IShellFolder, &#40;LPVOID *&#41; &pConnections&#41;;
    hr = pConnections->EnumObjects&#40;NULL,SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &ppenum&#41;;

    /* Loop for searching our connection */
    while&#40;hr = ppenum->Next&#40;1,&pidlItems, &celtFetched&#41; == S_OK && &#40;celtFetched&#41; == 1&#41;
    &#123;
        pConnections->GetDisplayNameOf&#40;pidlItems, SHGDN_INFOLDER, &str_curr_connection_name&#41;;
        StrRetToBuf&#40;&str_curr_connection_name, pidlItems, curr_connection_name, MAX_PATH&#41;;
        if&#40;!strcmp&#40;curr_connection_name,connection_name&#41;&#41;
            goto found;
    &#125;
    MessageBox&#40;NULL, "Имя соединения не найдено", "ОК!", MB_ICONERROR&#41;;
    return 0;
found&#58;
    /* Append PIDLs */
    full_pid=Append&#40;pidConnections,pidlItems&#41;;
    SetCurrentDirectory&#40;desktop_path&#41;;
    if&#40;!CreateShortCut&#40;link_name, full_pid, "C&#58;\\windows", 0, SW_SHOWNORMAL&#41;&#41;
        return 0;

    ppenum->Release&#40;&#41;;
    pMalloc->Free&#40;pidlItems&#41;;
    pMalloc->Free&#40;pidConnections&#41;;
    pMalloc->Release&#40;&#41;;
    pConnections->Release&#40;&#41;;
    CoUninitialize&#40;&#41;;
    return 1;
&#125;

bool __fastcall CreateShortCut&#40;LPWSTR pwzShortCutFileName,  LPCITEMIDLIST pidl,
                               LPTSTR pszWorkingDirectory, WORD wHotKey, int iCmdShow&#41;
&#123; 
    IShellLink * pSL; 
    IPersistFile * pPF; 
    HRESULT hRes; 
    hRes = CoCreateInstance&#40;CLSID_ShellLink, 0,CLSCTX_INPROC_SERVER, 
                            IID_IShellLink, &#40;LPVOID *&#41;&pSL&#41;; 
    if&#40; SUCCEEDED&#40;hRes&#41; &#41; 
    &#123; 
        hRes=pSL->SetIDList&#40;pidl&#41;;
        if&#40;SUCCEEDED&#40;hRes&#41;&#41;
        &#123; 
            hRes = pSL->SetHotkey&#40;wHotKey&#41;; 
            if&#40; SUCCEEDED&#40;hRes&#41; &#41; 
            &#123; 
                hRes = pSL->SetShowCmd&#40;iCmdShow&#41;; 
                if&#40; SUCCEEDED&#40;hRes&#41; &#41; 
                &#123; 
                    hRes = pSL->QueryInterface&#40;IID_IPersistFile,&#40;LPVOID *&#41;&pPF&#41;; 
                    if&#40; SUCCEEDED&#40;hRes&#41; &#41; 
                    &#123; 
                        hRes = pPF->Save&#40;pwzShortCutFileName,TRUE&#41;; 
                        pPF->Release&#40;&#41;; 
                    &#125;
                &#125;
            &#125;
        &#125;
        pSL->Release&#40;&#41;; 
    &#125;
    return SUCCEEDED&#40;hRes&#41;; 
&#125;

/******************************************************************************/
/* Functions copied from http&#58;//msdn.microsoft.com */

LPITEMIDLIST GetNextItemID&#40;LPCITEMIDLIST pidl&#41; 
&#123; 
   // Check for valid pidl.
   if&#40;pidl == NULL&#41;
      return NULL;

   // Get the size of the specified item identifier. 
   int cb = pidl->mkid.cb; 

   // If the size is zero, it is the end of the list. 

   if &#40;cb == 0&#41; 
      return NULL; 

   // Add cb to pidl &#40;casting to increment by bytes&#41;. 
   pidl = &#40;LPITEMIDLIST&#41; &#40;&#40;&#40;LPBYTE&#41; pidl&#41; + cb&#41;; 

   // Return NULL if it is null-terminating, or a pidl otherwise. 
   return &#40;pidl->mkid.cb == 0&#41; ? NULL &#58; &#40;LPITEMIDLIST&#41; pidl; 
&#125; 

/* Get size of PIDL */
UINT GetSize&#40;LPCITEMIDLIST pidl&#41;
&#123;
    UINT cbTotal = 0;
    if &#40;pidl&#41;
    &#123;
        cbTotal += sizeof&#40;pidl->mkid.cb&#41;;    // Terminating null character
        while &#40;pidl&#41;
        &#123;
            cbTotal += pidl->mkid.cb;
            pidl = GetNextItemID&#40;pidl&#41;;
        &#125;
    &#125;
    return cbTotal;
&#125;

/* Appending PIDLs */
LPITEMIDLIST Append&#40;LPCITEMIDLIST pidlBase, LPCITEMIDLIST pidlAdd&#41;
&#123;
    if&#40;pidlBase == NULL&#41;
        return NULL;
    if&#40;pidlAdd == NULL&#41;
        return &#40;LPITEMIDLIST&#41;pidlBase;
    
    LPITEMIDLIST pidlNew;

    UINT cb1 = GetSize&#40;pidlBase&#41; - sizeof&#40;pidlBase->mkid.cb&#41;;
    UINT cb2 = GetSize&#40;pidlAdd&#41;;

    pidlNew = &#40;LPITEMIDLIST&#41;pMalloc->Alloc&#40;cb1 + cb2&#41;;
    if &#40;pidlNew&#41;
    &#123;
        CopyMemory&#40;pidlNew, pidlBase, cb1&#41;;
        CopyMemory&#40;&#40;&#40;LPSTR&#41;pidlNew&#41; + cb1, pidlAdd, cb2&#41;;
    &#125;
    return pidlNew;
&#125;
Код еще сыроват, проверял на WinXp sp3;Windows7, всё работает.
размер выходного файла сжатого upx 24кб..
(антивирусы на ехе файл не ругаются)
компилить можно через cl.exe (visual c++ 2008)
Иконки, и прочую информацию добавите сами :D

gil
Сообщения: 355
Зарегистрирован: Вт ноя 11, 2008 14:28

Сообщение gil »

Код: Выделить всё

if&#40;!CreateShortCut&#40;link_name, full_pid, "C&#58;\\windows", 0, SW_SHOWNORMAL&#41;&#41;
не нравится.. а если у меня винда на диске D?? или c:\\win.000??

плюс не нравится оператор goto.. заменить на булевую переменную, и добавить if.. типа

Код: Выделить всё

...
bool found = false;
...
	/* Loop for searching our connection */ 
	while&#40;hr = ppenum->Next&#40;1,&pidlItems, &celtFetched&#41; == S_OK && &#40;celtFetched&#41; == 1&#41; 
	&#123; 
		pConnections->GetDisplayNameOf&#40;pidlItems, SHGDN_INFOLDER, &str_curr_connection_name&#41;;
		StrRetToBuf&#40;&str_curr_connection_name, pidlItems, curr_connection_name, MAX_PATH&#41;;
		if&#40;!strcmp&#40;curr_connection_name,connection_name&#41;&#41;
			found = true;
	&#125;
	if &#40;!found&#41;
	&#123;
		MessageBox&#40;NULL, "Имя соединения не найдено", "ОК!", MB_ICONERROR&#41;;
		return 0;
	&#125;
	/* Append PIDLs */ 
	full_pid=Append&#40;pidConnections,pidlItems&#41;; 
	SetCurrentDirectory&#40;desktop_path&#41;; 
	if&#40;!CreateShortCut&#40;link_name, full_pid, "C&#58;\\windows", 0, SW_SHOWNORMAL&#41;&#41; 
		return 0; 

Denisk
Сообщения: 5
Зарегистрирован: Пн ноя 09, 2009 09:12

Сообщение Denisk »

Нато он и сырой код, можно конечно зделать чтоб и C: и D чекал на наличие папки виндовс. :wink:. Либо через переменные среды раскрутить поиск...

Denisk
Сообщения: 5
Зарегистрирован: Пн ноя 09, 2009 09:12

Сообщение Denisk »

Код: Выделить всё

if&#40;!CreateShortCut&#40;link_name, full_pid, "%windir%", 0, SW_SHOWNORMAL&#41;&#41;

JAO
Сообщения: 1153
Зарегистрирован: Вт дек 11, 2007 08:17

Сообщение JAO »

GetWindowsDirectory

gil
Сообщения: 355
Зарегистрирован: Вт ноя 11, 2008 14:28

Сообщение gil »

так разве найдет? думаю, GetWinDir(), или как оно там..
давно на сях ничего не делал, да и под винду тоже :)

Denisk
Сообщения: 5
Зарегистрирован: Пн ноя 09, 2009 09:12

Сообщение Denisk »

char Buff[1024];
GetWindowsDirectory( Buff, 1024 );
так работает если подставить :)
как будет возможность проверю с нестандартными путями windows.

Ответить