using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Net; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using DotRas; namespace StartServerWPF.Modules.Main { public class VPNHelper { public RasDialer dialer; public RasHandle handle; public RasConnection connect; //public RasPhoneBook allUsersPhoneBook; // 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(string vpnName, string vpnIP, string userName, string passWord) { VPNName = vpnName; IPToPing = vpnIP; UserName = userName; PassWord = passWord; dialer = new RasDialer(); dialer.EntryName = vpnName; dialer.PhoneBookPath = RasPhoneBook.GetPhoneBookPath(RasPhoneBookType.AllUsers); } public VPNHelper() { } /// /// 尝试连接VPN /// /// public string ConnectVPN(string vpnName, string userName, string passWord) { try { dialer.EntryName = vpnName; // Set the credentials the dialer should use. dialer.Credentials = new NetworkCredential(userName, passWord); // NOTE: The entry MUST be in the phone book before the connection can be dialed. // Begin dialing the connection; this will raise events from the dialer instance. handle = dialer.DialAsync(); return "VPN连接成功!"; // Enable the disconnect button for use later. //this.DisconnectButton.Enabled = true; } catch (Exception ex) { return ex.ToString(); //this.StatusTextBox.AppendText(ex.ToString()); } } /// /// 尝试断开连接(默认VPN) /// /// [Obsolete] public void DisConnectVPN(string vpnName) { if (dialer.IsBusy) { // The connection attempt has not been completed, cancel the attempt. dialer.DialAsyncCancel(); } else { // The connection attempt has completed, attempt to find the connection in the active connections. RasConnection connection = RasConnection.GetActiveConnectionByName(vpnName, dialer.PhoneBookPath); if (connection != null) { // The connection has been found, disconnect it. connection.HangUp(); } } } /// /// 创建或更新一个VPN连接(指定VPN名称,及IP) /// [Obsolete] public void CreateOrUpdateVPN(string updateVPNname, string updateVPNip) { RasDialer dialer = new RasDialer(); RasPhoneBook allUsersPhoneBook = new RasPhoneBook(); allUsersPhoneBook.Open(); // 如果已经该名称的VPN已经存在,则更新这个VPN服务器地址 if (allUsersPhoneBook.Entries.Contains(updateVPNname)) { allUsersPhoneBook.Entries[updateVPNname].PhoneNumber = updateVPNip; // 不管当前VPN是否连接,服务器地址的更新总能成功,如果正在连接,则需要VPN重启后才能起作用 allUsersPhoneBook.Entries[updateVPNname].Update(); } // 创建一个新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); } } [Obsolete] public bool CheckVpnStatus(string vpnName) { RasConnection connection = RasConnection.GetActiveConnectionByName(vpnName, dialer.PhoneBookPath); return connection != null ? true : false; } /// /// 删除指定名称的VPN /// 如果VPN正在运行,一样会在电话本里删除,但是不会断开连接,所以,最好是先断开连接,再进行删除操作 /// /// [Obsolete] public void TryDeleteVPN(string delVpnName) { RasDialer dialer = new RasDialer(); RasPhoneBook allUsersPhoneBook = new RasPhoneBook(); allUsersPhoneBook.Open(); if (allUsersPhoneBook.Entries.Contains(delVpnName)) { allUsersPhoneBook.Entries.Remove(delVpnName); } } /// /// 获取VPN IP,如果无172地址,则未连接VPN /// public string GetLocalIp() { // 获取本地的IP地址 string AddressIP = string.Empty; foreach (IPAddress _IPAddress in Dns.GetHostEntry(Dns.GetHostName()).AddressList) { if (_IPAddress.AddressFamily.ToString() == "InterNetwork") { AddressIP = _IPAddress.ToString(); if (AddressIP.Contains("172.16")) { return AddressIP; } } } return AddressIP; } } }