Für eine .NET-Anwendung musste ich via Modem eine Internet-Verbindung aufbauen. Dabei wird das Password Authentication Protocol (PAP) verwendet. Da in der Version 1.1 des .NET-Frameworks keine RAS-Unterstützung vorhenden ist, schrieb ich eine .NET-Wrapper-Klasse, die den Zugriff auf die benötigten Funktionen des RASAPI (rasapi32.dll) ermöglicht.
Die Anwendung funktionierte auf meinem Entwicklungssystem (Windows 2000 Server) ohne Probleme. Als die Anwendung dann auf dem Einsatzsystem unter Windows 2003 Server getestet wurde, klappte die Einwahl nicht. Untersuchungen mit dem PortMon von sysinternals ergaben, dass alles funktionierte, aber bei der Authentifizierung zwar der Benutzername, nicht aber das Passwort übermittelt wurde.
Verschiedene Versuche mit .NET und C++-Programmen zeigten dann, dass die Einwahl mittels RASAPI mit einem C++-Programm funktioniert, mit einem .NET-Programm das Passwort aber jedesmal fehlte.
Recherchen im Internet ergaben keine Lösung, nicht einmal ein vorheriges Auftreten dieses Problems konnte ich finden.
Um dieses Problem in den Griff zu bekommen, schrieb ich eine kleine DLL, welche die RASAPI-Aufrufe kapselt. Die Funktionen dieser DLL sehen wie folgt aus:
#define DLLEXPORT extern "C" __declspec(dllexport)DLLEXPORT DWORD Dial(
LPCSTR connectionName,
LPCSTR number,
LPCSTR username,
LPCSTR password,
LPVOID callback,
LPHRASCONN hRas)
{
RASDIALEXTENSIONS rasDialExtensions;
rasDialExtensions.dwSize = sizeof(RASDIALEXTENSIONS);
rasDialExtensions.hwndParent = NULL;
rasDialExtensions.reserved = 0;
rasDialExtensions.dwfOptions = 0;
RASDIALPARAMS rasDialParams;
rasDialParams.dwSize = sizeof(RASDIALPARAMS);
strcpy(rasDialParams.szPhoneNumber, number);
strcpy(rasDialParams.szCallbackNumber, "");
strcpy(rasDialParams.szDomain, "");
strcpy(rasDialParams.szEntryName, connectionName);
strcpy(rasDialParams.szUserName, username);
strcpy(rasDialParams.szPassword, password);
DWORD res = RasDial(&rasDialExtensions, 0, &rasDialParams, 1, callback, hRas);
return res;
}DLLEXPORT DWORD HangUp(HRASCONN hRas)
{
return RasHangUp(hRas);
}DLLEXPORT DWORD GetConnectStatus(
HRASCONN hrasconn,
LPRASCONNSTATUS lprasconnstatus)
{
return RasGetConnectStatus(hrasconn, lprasconnstatus);
}
Die .NET-Anwendung ruft nun die Funktionen dieser DLL auf. Dadurch funktioniert die Einwahl nun auch unter Windows 2003 Server.
Hi, I read your posts on the msdn newsgroup. Please can you mail me your little c++ project and binary + .net code for calling it.
I have a very urgent problem and you made a workaround.
Please help me, it’s very stressy on my work.
Regards,
Hello Roland,
I receive error 623, Please can you send me your c# code. Does the wrapper also works on xp ?
Dim strPhoneNumber As String = „0025106000“
Dim strUserName As String = „username“
Dim strPassword As String = „password“
Dim strPhoneEntry As String = „Test“
Dim intreturn As Integer = Ras.Dial(strPhoneEntry, strPhoneNumber, strUserName, strPassword, mDialNotifyDelegate, mhRasHandle)
txtStatus.Text = „DialStatus = “ & intreturn & Environment.NewLine
_
Public Function Dial( _
ByVal lpszConnectionName As String, ByVal lpszPhoneNumber As String, _
ByRef lpszUserName As String, ByVal lpszPassword As String, _
ByVal lpvNotifier As RasDialFuncDelegate, ByRef lphRasConn As IntPtr) As Integer
End Function
The error code 623 means that the phonebook entry was not found, so ensure that the phonebook entry „Test“ (in your example) exists (check it under Settings->Network and Dial-up Connections).
All the ras error codes are described in the „Network and Dial-Up Connections“ Help file. This Help file can be found at c:\WINNT\help\netcfg.chm
Pingback: RasDial does not send password when called from .NET | keyongtech