VPN Verbindung aufbauen
-
Hallo,
Wie kann ich mit C++ eine VPN Verbindung aufbauen? Kennt jemand die passende WinAPI Funktion dazu?
-
Hat da keiner eine Idee, das muss doch möglich sein.
-
Du willst das machen was das Programm "Cisco Systems VPN Client" macht?
-
Die Frage ist vielleicht zu Oberflächlich...
Ansonsten siehe: Virtual Private Network Connections
http://msdn.microsoft.com/library/en-us/rras/rras/virtual_private_network_connections.aspRAS: http://msdn.microsoft.com/library/en-us/rras/rras/about_remote_access_service.asp
-
Ok,
versuch mal zu erklären, was ich genau vorhabe. Ich bin dabei mir einen Connector zu schreiben, der den default Gateway ausliest und anhand dessen entscheidet, in welchem Netzwerk ich mich befinde und verbindet dementsprechend Netzlaufwerke. Da ich die Möglichkeit habe, von mir zuhause aus über eine VPN Verbindung auch jene Netzlaufwerke, auf den Schulservern zu verbinden, möchte ich einen Button haben, der bei einem klick die VPN Verbindung zur Schule herstellt, und anschliessend auch diese Netzlaufwerke verbindent.
Ich hofe das war verständlich. Nun suche ich die Funktion, bei der ich Host, Benutzername und Passwort eingeben kann und die mir dann die Verbindung herstellt.
-
Um ein Netzwerklaufwerk zu verbinden solltest Du WNetAddConnection2 verwenden:
http://msdn.microsoft.com/library/en-us/wnet/wnet/wnetaddconnection2.aspDen default gateway bekommst Du wie folgt raus:
#include <windows.h> #include <stdio.h> #include <stdlib.h> #include <Iphlpapi.h> #pragma comment(lib, "Iphlpapi.lib") // returns 0, if no gateway is found... DWORD GetDefaultGateway() { PMIB_IPFORWARDTABLE pIpForwardTable = NULL; ULONG dwSize = 0; BOOL bOrder = FALSE; DWORD dwStatus = 0; // Find out how big our buffer needs to be dwStatus = GetIpForwardTable(pIpForwardTable, &dwSize, bOrder); if (dwStatus == ERROR_INSUFFICIENT_BUFFER) { // Allocate the memory for the table if (!(pIpForwardTable = (PMIB_IPFORWARDTABLE)malloc(dwSize))) { _tprintf(TEXT("Malloc failed, Out of Memory!\r\n")); return 0; } // Now get the table dwStatus = GetIpForwardTable(pIpForwardTable, &dwSize, bOrder); } if (dwStatus != ERROR_SUCCESS) { _tprintf(TEXT("GetIpForwardTable Failed, ERROR %d\r\n"), dwStatus); if (pIpForwardTable) free(pIpForwardTable); return 0; } // Search for the row in the table we want. The default gateway has a destination // of 0.0.0.0 for (unsigned long int i=0; i < pIpForwardTable->dwNumEntries; i++) { if (pIpForwardTable->table[i].dwForwardDest == 0) { // We've found the default gateway DWORD dwRet = pIpForwardTable->table[i].dwForwardNextHop; if (pIpForwardTable) free(pIpForwardTable); return dwRet; } } if (pIpForwardTable) free(pIpForwardTable); return 0; } int _tmain(int argc, _TCHAR* argv[]) { DWORD dwDefaultGateay = GetDefaultGateway(); printf("\nDefault Gateway is: %d.%d.%d.%d", LOBYTE(LOWORD(dwDefaultGateay)), HIBYTE(LOWORD(dwDefaultGateay)), LOBYTE(HIWORD(dwDefaultGateay)), HIBYTE(HIWORD(dwDefaultGateay)) ); }
-
Das mit dem Gateway und dem Netzlaufwerk verbinden funktioniert bereits, habs so wie du gelöst. Das Problem ist, dass ich keine Ahnung habe, wie ich die VPN Verbindung aufbauen kann.
-
Du musst eine VPN Verbindung einrichten und per RASDial "wählen"...
http://msdn.microsoft.com/library/en-us/rras/rras/rasdial.asp
-
Danke schon mal für die Info, hab das mal folgender massen probiert:
RASDIALPARAMS Para; BOOL password=true; LPBOOL ppassword = &password; DWORD Error=RasGetEntryDialParams(NULL,&Para,ppassword); if(Error != 0) //<= Error = 632 { MessageBox(NULL,"can't read DialParams", "Error",MB_OK|MB_ICONERROR); return; } Error=RasDial(NULL,NULL,&Para,NULL,Application->Handle,NULL); if(Error != 0) { MessageBox(NULL,"can't establishe the connection", "Error",MB_OK|MB_ICONERROR); return; }
Ich habe eine VPN Verbindung eingerichtet und als standart definiert. Kriege an der gekennzeichneten Stelle den Fehlercode 632. Was mache ich falsch?
Gibt es auch eine Möglichkeit, die Einrichtung der VPN Verbindung meinem Programm zu überlassen?
-
Du solltest etwas besser die Doku lesen
Pointer to a RASDIALPARAMS structure.
On input, the dwSize member specifies the size of the RASDIALPARAMS structure, and the szEntryName member specifies a valid phone-book entry.Fazit:
RASDIALPARAMS rdParams; ZeroMemory(&rdParams, sizeof(RASDIALPARAMS)); rdParams.dwSize = sizeof(RASDIALPARAMS);
-
Ok,
viel dank, dass du mir hilfst. Ich hab dies noch eingefüght, jetzt krieg ich den ErrorCode 623, kannst du noch einen anderen Fehler erkennen, oder hast du zumindest ne Ahnung, was dieser ErrorCode zu bedeuten hat?
-
623 Der Telefonbucheintrag für diese Verbindung konnte nicht gefunden werden.
-
Versuch mal mit GetLastError() mehr Informationen zu bekommen.
Eventuelle Fehlercodes kannst du hier nachschlagen, diese haben aber nichts mit deinem Fehlercode 623 zu tun.
Sie betreffen nur GetLastError().Zerebus
-
du hast die RASDIALPARAMS struktur ja gar nicht richtig ausgefüllt
-
Ok, danke.
@Zerebus GetLastError() habe ich scho versucht, gibt allerdings 0 zurück. Aber den Fehler hinter diesem Fehler Code wurde mir ja mitgeteilt.
Die Sache mit dem Telefonbucheintrag hab ich eh nicht so ganz kapiert. Das macht mir eher den Anschein, als könnte ich so eine Dial-Up Verbindung herstellen, ich möchte aber die VPN Verbindung normal über mein Cabel Internet Verbindung herstellen, so wie das auch passiert, wenn ich auf Start->Einstellungen->Netzwerkverbindungen->VPNblablabla klicke.
-
Und wie füll ich die richtig?
-
Also, mit dem folgenden Code bekommst Du zuerst mal raus wie den der Eintrag heisst:
#include <windows.h> #include <tchar.h> #include <stdio.h> #include <ras.h> #include <raserror.h> #pragma comment(lib, "Rasapi32.lib") int _tmain() { DWORD dwCb = sizeof(RASENTRYNAME); DWORD dwErr = ERROR_SUCCESS; DWORD dwRetries = 5; DWORD dwEntries = 0; RASENTRYNAME* lpRasEntryName = NULL; // // Loop through in case the information from RAS changes between calls. // while (dwRetries--) { // // If the memory is allocated, free it. // if (NULL != lpRasEntryName) { HeapFree(GetProcessHeap(), 0, lpRasEntryName); lpRasEntryName = NULL; } // // Allocate the size need for the RAS structure. // lpRasEntryName = (RASENTRYNAME*) HeapAlloc(GetProcessHeap(), 0, dwCb); if (NULL == lpRasEntryName) { dwErr = ERROR_NOT_ENOUGH_MEMORY; break; } // // Set the structure size for version checking purposes. // lpRasEntryName->dwSize = sizeof(RASENTRYNAME); // // Call the RAS API, bail on the loop if we are successful or an unknown // error occurs. // dwErr = RasEnumEntries( NULL, NULL, lpRasEntryName, &dwCb, &dwEntries); if (ERROR_BUFFER_TOO_SMALL != dwErr) { break; } } // // In the success case print the names of the entries. // if (ERROR_SUCCESS == dwErr) { DWORD i; printf("Phone-book entries in the default phone book:\n\n"); for (i = 0; i < dwEntries; i++) { _tprintf(_T("'%s'\n"), lpRasEntryName[i].szEntryName); } } else { printf("RasEnumEntries failed: Error = %d\n", dwErr); } // // Free the memory if necessary. // if (NULL != lpRasEntryName) { HeapFree(GetProcessHeap(), 0, lpRasEntryName); lpRasEntryName = NULL; } }
-
Und wählen kannst Du dann wie folgt (bitte anstelle "VPN-Test" den passenden Namen eintragen!):
#include <windows.h> #include <tchar.h> #include <stdio.h> #include <ras.h> #include <raserror.h> #pragma comment(lib, "Rasapi32.lib") int _tmain() { RASDIALPARAMS rdParams; ZeroMemory(&rdParams, sizeof(RASDIALPARAMS)); rdParams.dwSize = sizeof(RASDIALPARAMS); _tcscpy(rdParams.szEntryName, _T("VPN-Test")); BOOL pPassword; DWORD dwError = RasGetEntryDialParams(NULL, &rdParams, &pPassword); if(dwError != 0) { _tprintf(_T("Can't read DialParams (%d)"), dwError); return 1; } HRASCONN con = NULL; dwError = RasDial(NULL, NULL, &rdParams, 0, NULL, &con); if(dwError != 0) { _tprintf(_T("Can't establishe the connection (%d)"), dwError); return 2; } }
-
Funktioniert bestens, tausend dank.
Wie kann ich die Verbindung wieder trennen? Und gibts es eventuel noch eine Möglichkeit, dass einrichten der Verbindung meinem Programm zu überlassen?
-
Bitteschön...
Aber es ist eigentlich nicht zuviel verlangt, wenn man sich zumindest die Hilfe durchliest... dann wären Deine Fragen bzgl. dem Auflegen schon beantwortet...
http://msdn.microsoft.com/library/en-us/rras/rras/rasdial.aspBzgl. dem neu anlegen: Es ist nicht ganz einfach... schau Dir mal alle Funktionen an die es da gibt...
http://msdn.microsoft.com/library/en-us/rras/rras/remote_access_service_functions.asp