DoRas一点使用心得
为了对抗伟大的墙,又续了一年半的vpn。可是最近遇到了点小麻烦,由于这家小型的vpn服务提供商无法在windows10兼容使用预共享秘钥作为身份验证的类l2pt连接方式。在windows下的设置方式如下:

后来只好自己研究做一个简单的vpn连接器。

主要使用的是DotRas的连接库。官网连接https://dotras.codeplex.com/
这里要说官网下载的1.3版SDK,好像功能有点单一无法满足需求。所以推荐大家使用下载的1.2版的SDK,http://dotras.codeplex.com/releases/view/32289
用C#做了一个调用DotRas.dll的类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using DotRas;
using System.Diagnostics;
using System.Text.RegularExpressions;
namespace MyVPN
{
class RasapiHelper
{
System.Windows.Forms.ToolStripLabel stateLable;
public const string EntryName = "VPN_Connection";
private RasHandle handle = null;
private DotRas.RasPhoneBook AllUsersPhoneBook;
private DotRas.RasDialer Dialer;
public RasapiHelper(System.ComponentModel.IContainer component)
{
this.AllUsersPhoneBook = new DotRas.RasPhoneBook(component);
this.Dialer = new DotRas.RasDialer(component);
this.Dialer.StateChanged += new System.EventHandler<DotRas.StateChangedEventArgs>(this.Dialer_StateChanged);
this.Dialer.DialCompleted += new System.EventHandler<DotRas.DialCompletedEventArgs>(this.Dialer_DialCompleted);
}
public void CreateOrUpdataEntry()
{
this.AllUsersPhoneBook.Open(true);
if (!this.AllUsersPhoneBook.Entries.Contains(EntryName))
{
RasEntry entry = RasEntry.CreateVpnEntry(EntryName, "127.0.0.1", RasVpnStrategy.L2tpOnly, RasDevice.GetDeviceByName("(L2TP)", RasDeviceType.Vpn));
entry.Options.UsePreSharedKey = true;
this.AllUsersPhoneBook.Entries.Add(entry);
}
this.AllUsersPhoneBook.Entries[EntryName].UpdateCredentials(RasPreSharedKey.Client, "prekey");
this.AllUsersPhoneBook.Entries[EntryName].Update();
}
public void UpdataIPAddress(string IP)
{
this.AllUsersPhoneBook.Entries[EntryName].PhoneNumber = IP;
this.AllUsersPhoneBook.Entries[EntryName].Update();
}
public void Connect()
{
this.Dialer.EntryName = EntryName;
this.Dialer.PhoneBookPath = this.AllUsersPhoneBook.Path;
try
{
this.Dialer.Credentials = new NetworkCredential("username", "password");
this.handle = this.Dialer.DialAsync();
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.ToString());
}
}
public void Disconnect()
{
if (this.Dialer.IsBusy)
{
this.Dialer.DialAsyncCancel();
}
else
{
RasConnection connection = RasConnection.GetActiveConnectionByHandle(this.handle);
if (connection != null)
{
connection.HangUp();
}
}
this.stateLable.Text = ("Disconnection!");
}
private void Dialer_StateChanged(object sender, StateChangedEventArgs e)
{
this.stateLable.Text = e.State.ToString();
//this.StatusTextBox.AppendText(e.State.ToString() + "\r\n");
}
public void toolStripShowState(System.Windows.Forms.ToolStripLabel toolSpLabe)
{
this.stateLable = toolSpLabe;
}
private void Dialer_DialCompleted(object sender, DialCompletedEventArgs e)
{
if (e.Cancelled)
{
this.stateLable.Text = "Cancelled!";
}
else if (e.TimedOut)
{
this.stateLable.Text = ("Connection attempt timed out!");
}
else if (e.Error != null)
{
this.stateLable.Text = (e.Error.ToString());
}
else if (e.Connected)
{
this.stateLable.Text = ("Connection successful!");
}
if (!e.Connected)
{
this.stateLable.Text = ("Disconnection!");
// The connection was not connected, disable the disconnect button.
}
}
}
}主要的核心问题是
this.AllUsersPhoneBook.Entries[EntryName].UpdateCredentials(RasPreSharedKey.Client, "prekey"); //设置预共享秘钥 this.AllUsersPhoneBook.Entries[EntryName].Update(); //更新连接信息
UpdateCredentials方法在官网下载要V1.2版的dll才有,如果是1.3我估计需要自己编译才能有这个方法出来。
有4条评论