因為工作需要,需要用程序來控制VPN代理,在google搜了搜,還有不少朋友有同樣的需求,但是目前在網(wǎng)上搜索到的解決方案,都還遺留了一些問題。只好自己手動把方案補齊了一下,談不上原創(chuàng),大牛們飄過就行。 先談?wù)勛约旱男枨蟀桑褪轻槍θ鐖D示中的VPN連接,咱們至少需要以下四個基本功能
1.新建一個VPN
2.修改指定名字VPN的主機ip地址
3.監(jiān)視當前連接狀態(tài)
4.刪除指定名稱的VPN
直接上代碼吧,這里面引用了【DotRas.dll】 大家可以到官網(wǎng)http://dotras.codeplex.com/下載
using System;using System.Collections.Generic;using System.Text;using System.Diagnostics;using DotRas;using System.Text.RegularExPRessions;namespace XXX{ public class VPNHelper { // 系統(tǒng)路徑 C:/windows/system32/ private static string WinDir = Environment.GetFolderPath(Environment.SpecialFolder.System) + @"/"; // rasdial.exe private static string RasDialFileName = "rasdial.exe"; // VPN路徑 C:/windows/system32/rasdial.exe private static string VPNPROCESS = WinDir + RasDialFileName; // VPN地址 public string IPToPing { get; set; } // VPN名稱 public string VPNName { get; set; } // VPN用戶名 public string UserName { get; set; } // VPN密碼 public string PassWord { get; set; } public VPNHelper() { } /// <summary> /// 帶參構(gòu)造函數(shù) /// </summary> /// <param name="_vpnIP"></param> /// <param name="_vpnName"></param> /// <param name="_userName"></param> /// <param name="_passWord"></param> public VPNHelper(string _vpnIP, string _vpnName, string _userName, string _passWord) { this.IPToPing = _vpnIP; this.VPNName = _vpnName; this.UserName = _userName; this.PassWord = _passWord; } /// <summary> /// 嘗試連接VPN(默認VPN) /// </summary> /// <returns></returns> public void TryConnectVPN() { this.TryConnectVPN(this.VPNName,this.UserName,this.PassWord); } /// <summary> /// 嘗試斷開連接(默認VPN) /// </summary> /// <returns></returns> public void TryDisConnectVPN() { this.TryDisConnectVPN(this.VPNName); } /// <summary> /// 創(chuàng)建或更新一個默認的VPN連接 /// </summary> public void CreateOrUpdateVPN() { this.CreateOrUpdateVPN(this.VPNName, this.IPToPing); } /// <summary> /// 嘗試刪除連接(默認VPN) /// </summary> /// <returns></returns> public void TryDeleteVPN() { this.TryDeleteVPN(this.VPNName); } /// <summary> /// 嘗試連接VPN(指定VPN名稱,用戶名,密碼) /// </summary> /// <returns></returns> public void TryConnectVPN(string connVpnName,string connUserName,string connPassWord) { try { string args = string.Format("{0} {1} {2}", connVpnName, connUserName, connPassWord); ProcessStartInfo myProcess = new ProcessStartInfo(VPNPROCESS, args); myProcess.CreateNoWindow = true; myProcess.UseShellExecute = false; Process.Start(myProcess); } catch (Exception Ex) { Debug.Assert(false, Ex.ToString()); } } /// <summary> /// 嘗試斷開VPN(指定VPN名稱) /// </summary> /// <returns></returns> public void TryDisConnectVPN(string disConnVpnName) { try { string args = string.Format(@"{0} /d", disConnVpnName); ProcessStartInfo myProcess = new ProcessStartInfo(VPNPROCESS, args); myProcess.CreateNoWindow = true; myProcess.UseShellExecute = false; Process.Start(myProcess); } catch (Exception Ex) { Debug.Assert(false, Ex.ToString()); } } /// <summary> /// 創(chuàng)建或更新一個VPN連接(指定VPN名稱,及IP) /// </summary> public void CreateOrUpdateVPN(string updateVPNname,string updateVPNip) { RasDialer dialer = new RasDialer(); RasphoneBook allUsersPhoneBook = new RasPhoneBook(); allUsersPhoneBook.Open(true); // 如果已經(jīng)該名稱的VPN已經(jīng)存在,則更新這個VPN服務(wù)器地址 if (allUsersPhoneBook.Entries.Contains(updateVPNname)) { allUsersPhoneBook.Entries[updateVPNname].PhoneNumber = updateVPNip; // 不管當前VPN是否連接,服務(wù)器地址的更新總能成功,如果正在連接,則需要VPN重啟后才能起作用 allUsersPhoneBook.Entries[updateVPNname].Update(); } // 創(chuàng)建一個新VPN else { RasEntry entry = RasEntry.CreateVpnEntry(updateVPNname, updateVPNip, RasVpnStrategy.PPTpFirst, RasDevice.GetDeviceByName("(PPTP)", RasDeviceType.Vpn)); allUsersPhoneBook.Entries.Add(entry); dialer.EntryName = updateVPNname; dialer.PhoneBookPath = RasPhoneBook.GetPhoneBookPath(RasPhoneBookType.AllUsers); } } /// <summary> /// 刪除指定名稱的VPN /// 如果VPN正在運行,一樣會在電話本里刪除,但是不會斷開連接,所以,最好是先斷開連接,再進行刪除操作 /// </summary> /// <param name="delVpnName"></param> public void TryDeleteVPN(string delVpnName) { RasDialer dialer = new RasDialer(); RasPhoneBook allUsersPhoneBook = new RasPhoneBook(); allUsersPhoneBook.Open(); if (allUsersPhoneBook.Entries.Contains(delVpnName)) { allUsersPhoneBook.Entries.Remove(delVpnName); } } /// <summary> /// 獲取當前正在連接中的VPN名稱 /// </summary> public List<string> GetCurrentConnectingVPNNames() { List<string> ConnectingVPNList = new List<string>(); Process proIP = new Process(); proIP.StartInfo.FileName = "cmd.exe "; proIP.StartInfo.UseShellExecute = false; proIP.StartInfo.RedirectStandardInput = true; proIP.StartInfo.RedirectStandardOutput = true; proIP.StartInfo.RedirectStandardError = true; proIP.StartInfo.CreateNoWindow = true;//不顯示cmd窗口 proIP.Start(); proIP.StandardInput.WriteLine(RasDialFileName); proIP.StandardInput.WriteLine("exit"); // 命令行運行結(jié)果 string strResult = proIP.StandardOutput.ReadToEnd(); proIP.Close(); // 用正則表達式匹配命令行結(jié)果,只限于簡體中文系統(tǒng)哦^_^ Regex regger = new Regex("(?<=已連接/r/n)(.*/n)*(?=命令已完成)", RegexOptions.Multiline); // 如果匹配,則說有正在連接的VPN if (regger.IsMatch(strResult)) { string[] list = regger.Match(strResult).Value.ToString().Split('/n'); for(int index = 0 ; index < list.Length;index++) { if (list[index]!=string.Empty) ConnectingVPNList.Add(list[index].Replace("/r","")); } } // 沒有正在連接的VPN,則直接返回一個空List<string> return ConnectingVPNList; } }}
注:該類可以方便的對VPN進行【增】,【刪】,【改】,【連接】,【斷開】操作,在操作前后可以用GetCurrentConnectingVPNNames方法來得到正在使用中的VPN名稱列表,這樣一來,可以輕松判斷【連接】或【斷開】是否成功執(zhí)行。 當然,鑒于【連接】,【斷開】操作有一定的延遲,建議操作執(zhí)行后等待一定時間,再使用GetCurrentConnectingVPNNames方法來查看執(zhí)行結(jié)果
轉(zhuǎn)載自:http://blog.sina.com.cn/s/blog_6221a3490100kpka.html
新聞熱點
疑難解答