百度一下 藏锋者 就能快速找到本站! 每日资讯归档 下载藏锋者到桌面一键访问

当前位置:主页 > 网络安全 > VPN自动连接编程实现

VPN自动连接编程实现

所在栏目:网络安全 时间:04-12 17:05 分享:

很多情况下,例如扫描、自动登录等操作都会用到VPN,但是随之而来的问题也需要解决。我们显然想要达到这个目的:自动登录指定IP的VPN,拨号连接。惯性思维是找寻相关编程函数,我看网上大部分人也是导入某个ras动态库,然后利用函数进行操作,最重要的是,还不能完全实现上面的目的!

VPN自动连接编程原理与思路

在系统目录下有个名为“rasdial.exe”的文件,在命令提示符下执行帮助函数,可得到其参数说明,如图1所示。

我们只需要用到3个参数:“rasdial.exe VPN连接名称 用户名 密码”。

从这里可以得知,我们是没有自主IP权的。我们考虑系统保存IP的位置,在监视注册表无果后,转而考虑系统文件。发现关键文件路径:“C:\Documents and Settings\USERNAME\Application Data\Microsoft\Network\Connections\Pbk rasphone.pbk”,文件内容如下:

[vpn]
Encoding=1
Type=2
AutoLogon=0
UseRasCredentials=1
DialParamsUID=80352375
Guid=9D1E6E5A44553E42A5AB645767AE17D0
BaseProtocol=1
VpnStrategy=2
ExcludedProtocols=0
……(省略部分)
IpPrioritizeRemote=1
IpHeaderCompression=0
IpAddress=0.0.0.0
IpDnsAddress=0.0.0.0
IpDns2Address=0.0.0.0
IpWinsAddress=0.0.0.0
IpWins2Address=0.0.0.0
IpAssign=1
IpNameAssign=1
IpFrameSize=1006
IpDnsFlags=1
IpNBTFlags=1
TcpWindowSize=0
UseFlags=0
IpSecFlags=0
IpDnsSuffix=

NETCOMPONENTS=
ms_server=1
ms_msclient=1

MEDIA=rastapi
Port=VPN2-0
Device=WAN Miniport (L2TP)

DEVICE=vpn
PhoneNumber=1.2.3.4 //这里就是VPN的连接IP了
AreaCode=
CountryCode=1
CountryID=1
UseDialingRules=0
Comment=
LastSelectedPhone=0
PromoteAlternates=0
TryNextAlternateOnFail=1

可以看出这是关于一个VPN连接的表述信息的。第一行的“[vpn]”标识该连接的名字。事实证明,如果我们不按照“新建网络连接”的步骤,而直接在这个文件添加类似如上描述信息,是完全同功效的:打开网上邻居属性,会发现已经多出一个连接图标了。

现在整理一下思路:得到需要连接的VPN的IP后,我们可以通过操作文件rasphone.pbk,选择创建一个新的连接还是改写原有连接。改写之后,再执行“rasdial.exe VPN连接名称 用户名 密码”,成功连接。

VPN自动连接代码实现

我选择的是覆盖某个已建立好的VPN连接。覆盖函数如下:

bool WriteIP(string ip)
{
string path =
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
path += "\\Microsoft\\Network\\Connections\\Pbk\\rasphone.pbk";
FileStream NewFile =
new FileStream(path, FileMode.Open, FileAccess.ReadWrite);
StreamReader NewStreamR = new StreamReader(NewFile);//覆盖
bool exist=false;
String reader = NewStreamR.ReadToEnd();
String []rds = reader.Split('\n');
int pos = 0,pos_=0;
foreach (String result in rds)
{
if(result.StartsWith("["+connectname+"]"))
{
exist=true;
pos++;
break;
}
pos++;
}
if (!exist)
return false;//没找到
foreach (String result in rds)
{
if (pos_ < pos)//继续上次的位置
{
pos_++;
continue;
}
if (result.StartsWith("PhoneNumber="))
{
rds[pos_] = "PhoneNumber=" + ip + "\r";
break;
}
pos_++;
}
//重组数据
String newdata="";
foreach(String temp in rds)
{
newdata += temp + "\n";
}
NewStreamR.Close();//先关闭
StreamWriter NewStreamW = new StreamWriter(path,false);//覆盖模式
NewStreamW.Write(newdata);
NewStreamW.Flush();
NewStreamW.Close();
return true;
}

这样我们就把要登录的IP更新好了,接下来我们开始连接VPN。

public bool VPNConnect()
{
if (string.IsNullOrEmpty(IP) | string.IsNullOrEmpty(connectname) | string.IsNullOrEmpty(username) | string.IsNullOrEmpty(password))
return false;
WriteIP(IP);
Process.Start("rasdial.exe "+connectname+" "+username+" "+password);
return true;
}

假设归属VPN这个类,调用方法如下:

VPN v = new VPN();
v.connectname = "vpn";//连接名字
v.IP = "127.0.0.1";
v.password = "magic";
v.username = "dog";
v.VPNConnect();

这样,我们就比较完美的解决了VPN的自动连接问题了。有这方面需要的读者,按照我上面的思路继续完善,测试看看吧。

VPN自动连接编程实现 免费邮件订阅: 邮件订阅

图片推荐

热点排行榜

CopyRight? 2013 www.cangfengzhe.com All rights reserved