因为工作需要,需要用程序来控制×××代理,在google搜了搜,还有不少朋友有同样的需求,但是目前在网上搜索到的解决方案,都还遗留了一些问题。只好自己手动把方案补齐了一下,谈不上原创,大牛们飘过就行。

       先谈谈自己的需求吧,就是针对如图示中的×××连接,咱们至少需要以下四个基本功能。

      1.新建一个×××

      2.修改指定名字×××的主机IP地址

      3.监视当前连接状态

      4.删除指定名称的×××

   直接上代码吧,这里面引用了【DotRas.dll大家可以到官网 下载

using System;using System.Collections.Generic;using System.Text;using System.Diagnostics;using DotRas;using System.Text.RegularExpressions;namespace XXX{    public class ×××Helper    {        // 系统路径 C:\windows\system32\        private static string WinDir =Environment.GetFolderPath(Environment.SpecialFolder.System) + @"";        //rasdial.exe        private static stringRasDialFileName = "rasdial.exe";        //×××路径 C:\windows\system32\rasdial.exe        private static string×××PROCESS = WinDir + RasDialFileName;        //×××地址        public string IPToPing { get;set; }        //×××名称        public string ×××Name { get;set; }        //×××用户名        public string UserName { get;set; }        //×××密码        public string PassWord { get;set; }        public ×××Helper()        {        }        ///        /// 带参构造函数        ///         /// 
        /// 
        /// 
        /// 
        public ×××Helper(string _***IP,string _***Name, string _userName, string _passWord)        {            this.IPToPing= _***IP;            this.×××Name= _***Name;            this.UserName= _userName;            this.PassWord= _passWord;        }        ///
        /// 尝试连接×××(默认×××)        ///         ///
        public void TryConnect×××()        {            this.TryConnect×××(this.×××Name,this.UserName,this.PassWord);        }        ///
        /// 尝试断开连接(默认×××)        ///         ///
        public void TryDisConnect×××()        {            this.TryDisConnect×××(this.×××Name);        }        ///
        /// 创建或更新一个默认的×××连接        ///         public void CreateOrUpdate×××()        {            this.CreateOrUpdate×××(this.×××Name,this.IPToPing);        }        ///
        /// 尝试删除连接(默认×××)        ///         ///
        public void TryDelete×××()        {            this.TryDelete×××(this.×××Name);        }        /// 
        /// 尝试连接×××(指定×××名称,用户名,密码)        ///         ///
        public voidTryConnect×××(string conn***Name,string connUserName,string connPassWord)        {            try            {                stringargs = string.Format("{0} {1} {2}", conn***Name, connUserName,connUserName);                ProcessStartInfomyProcess = new ProcessStartInfo(×××PROCESS, args);                myProcess.CreateNoWindow= true;                myProcess.UseShellExecute= false;                Process.Start(myProcess);            }            catch(Exception Ex)            {                Debug.Assert(false,Ex.ToString());            }        }        ///
        /// 尝试断开×××(指定×××名称)        ///         ///
        public void TryDisConnect×××(stringdisConn***Name)        {            try            {                stringargs = string.Format(@"{0} /d", disConn***Name);                ProcessStartInfomyProcess = new ProcessStartInfo(×××PROCESS, args);                myProcess.CreateNoWindow= true;                myProcess.UseShellExecute= false;                Process.Start(myProcess);               }            catch(Exception Ex)            {                Debug.Assert(false,Ex.ToString());            }        }        ///
        /// 创建或更新一个×××连接(指定×××名称,及IP)        ///         public voidCreateOrUpdate×××(string update×××name,string update×××ip)        {            RasDialerdialer = new RasDialer();            RasPhoneBookallUsersPhoneBook = new RasPhoneBook();            allUsersPhoneBook.Open();            //如果已经该名称的×××已经存在,则更新这个×××服务器地址            if(allUsersPhoneBook.Entries.Contains(update×××name))            {                allUsersPhoneBook.Entries[update×××name].PhoneNumber= update×××ip;                //不管当前×××是否连接,服务器地址的更新总能成功,如果正在连接,则需要×××重启后才能起作用                allUsersPhoneBook.Entries[update×××name].Update();                           }            // 创建一个新×××            else            {                RasEntryentry = RasEntry.Create***Entry(update×××name, update×××ip,Ras***Strategy.PptpFirst, RasDevice.GetDeviceByName("(PPTP)",RasDeviceType.***));                allUsersPhoneBook.Entries.Add(entry);                dialer.EntryName= update×××name;                dialer.PhoneBookPath=RasPhoneBook.GetPhoneBookPath(RasPhoneBookType.AllUsers);                           }        }        ///
        /// 删除指定名称的×××        /// 如果×××正在运行,一样会在电话本里删除,但是不会断开连接,所以,最好是先断开连接,再进行删除操作        ///         /// 
        public void TryDelete×××(stringdel***Name)        {            RasDialerdialer = new RasDialer();            RasPhoneBookallUsersPhoneBook = new RasPhoneBook();            allUsersPhoneBook.Open();            if(allUsersPhoneBook.Entries.Contains(del***Name))            {                allUsersPhoneBook.Entries.Remove(del***Name);            }        }        ///
        /// 获取当前正在连接中的×××名称        ///         public List
GetCurrentConnecting×××Names()        {            List
Connecting×××List = new List
();            ProcessproIP = 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");            //命令行运行结果            stringstrResult = proIP.StandardOutput.ReadToEnd();            proIP.Close();            //用正则表达式匹配命令行结果,只限于简体中文系统哦^_^            Regexregger = new Regex("(?<=已连接\r\n)(.*\n)*(?=命令已完成)", RegexOptions.Multiline);            //如果匹配,则说有正在连接的×××            if(regger.IsMatch(strResult))            {                string[]list = regger.Match(strResult).Value.ToString().Split('\n');                for(intindex = 0 ; index < list.Length;index++)                {                    if(list[index]!=string.Empty)                    Connecting×××List.Add(list[index].Replace("\r",""));                }            }            // 没有正在连接的×××,则直接返回一个空List
            returnConnecting×××List;        }    }}

注:该类可以方便的对×××进行【增】,【删】,【改】,【连接】,【断开】操作,在操作前后可以用GetCurrentConnecting×××Names方法来得到正在使用中的×××名称列表,这样一来,可以轻松判断【连接】或【断开】是否成功执行。