이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 22553|회답: 0

[출처] VPN 보내는 방법

[링크 복사]
게시됨 2015. 8. 31. 오후 9:23:25 | | |
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Text.RegularExpressions;
  6. using System.Diagnostics;
  7. using DotRas;

  8. namespace RASCONN
  9. {
  10.    public  class VPNHelper
  11.     {
  12.         // 系统路径 C:\windows\system32\
  13.         private static string WinDir = Environment.GetFolderPath(Environment.SpecialFolder.System) + @"";

  14.         // rasdial.exe
  15.         private static string RasDialFileName = "rasdial.exe";

  16.         // VPN路径 C:\windows\system32\rasdial.exe
  17.         private static string VPNPROCESS = WinDir + RasDialFileName;

  18.         // VPN地址
  19.         public string IPToPing { get; set; }

  20.         // VPN名称
  21.         public string VPNName { get; set; }

  22.         // VPN用户名
  23.         public string UserName { get; set; }

  24.         // VPN密码
  25.         public string PassWord { get; set; }


  26.         public VPNHelper()
  27.         {

  28.         }

  29.         /// <summary>
  30.         /// 带参构造函数
  31.         /// </summary>
  32.         /// <param name="_vpnIP"></param>
  33.         /// <param name="_vpnName"></param>
  34.         /// <param name="_userName"></param>
  35.         /// <param name="_passWord"></param>
  36.         public VPNHelper(string _vpnIP, string _vpnName, string _userName, string _passWord)
  37.         {
  38.             this.IPToPing = _vpnIP;
  39.             this.VPNName = _vpnName;
  40.             this.UserName = _userName;
  41.             this.PassWord = _passWord;
  42.         }

  43.         /// <summary>
  44.         /// 尝试连接VPN(默认VPN)
  45.         /// </summary>
  46.         /// <returns></returns>
  47.         public void TryConnectVPN()
  48.         {
  49.             this.TryConnectVPN(this.VPNName, this.UserName, this.PassWord);
  50.         }

  51.         /// <summary>
  52.         /// 尝试断开连接(默认VPN)
  53.         /// </summary>
  54.         /// <returns></returns>
  55.         public void TryDisConnectVPN()
  56.         {
  57.             this.TryDisConnectVPN(this.VPNName);
  58.         }

  59.         /// <summary>
  60.         /// 创建或更新一个默认的VPN连接
  61.         /// </summary>
  62.         public void CreateOrUpdateVPN()
  63.         {
  64.             this.CreateOrUpdateVPN(this.VPNName, this.IPToPing);
  65.         }

  66.         /// <summary>
  67.         /// 尝试删除连接(默认VPN)
  68.         /// </summary>
  69.         /// <returns></returns>
  70.         public void TryDeleteVPN()
  71.         {
  72.             this.TryDeleteVPN(this.VPNName);
  73.         }
  74.         /// <summary>
  75.         /// 尝试连接VPN(指定VPN名称,用户名,密码)
  76.         /// </summary>
  77.         /// <returns></returns>
  78.         public void TryConnectVPN(string connVpnName, string connUserName, string connPassWord)
  79.         {
  80.             try
  81.             {
  82.                 string args = string.Format("{0} {1} {2}", connVpnName, connUserName, connPassWord);

  83.                 ProcessStartInfo myProcess = new ProcessStartInfo(VPNPROCESS, args);

  84.                 myProcess.CreateNoWindow = true;

  85.                 myProcess.UseShellExecute = false;

  86.                 Process.Start(myProcess);

  87.             }
  88.             catch (Exception Ex)
  89.             {
  90.                 Debug.Assert(false, Ex.ToString());
  91.             }
  92.         }

  93.         /// <summary>
  94.         /// 尝试断开VPN(指定VPN名称)
  95.         /// </summary>
  96.         /// <returns></returns>
  97.         public void TryDisConnectVPN(string disConnVpnName)
  98.         {
  99.             try
  100.             {
  101.                 string args = string.Format(@"{0} /d", disConnVpnName);

  102.                 ProcessStartInfo myProcess = new ProcessStartInfo(VPNPROCESS, args);

  103.                 myProcess.CreateNoWindow = true;

  104.                 myProcess.UseShellExecute = false;

  105.                 Process.Start(myProcess);

  106.             }
  107.             catch (Exception Ex)
  108.             {
  109.                 Debug.Assert(false, Ex.ToString());
  110.             }
  111.         }

  112.         /// <summary>
  113.         /// 创建或更新一个VPN连接(指定VPN名称,及IP)
  114.         /// </summary>
  115.         public void CreateOrUpdateVPN(string updateVPNname, string updateVPNip)
  116.         {
  117.             RasDialer dialer = new RasDialer();
  118.             RasPhoneBook allUsersPhoneBook = new RasPhoneBook();

  119.             allUsersPhoneBook.Open();

  120.             // 如果已经该名称的VPN已经存在,则更新这个VPN服务器地址
  121.             if (allUsersPhoneBook.Entries.Contains(updateVPNname))
  122.             {
  123.                 allUsersPhoneBook.Entries[updateVPNname].PhoneNumber = updateVPNip;
  124.                 // 不管当前VPN是否连接,服务器地址的更新总能成功,如果正在连接,则需要VPN重启后才能起作用
  125.                 allUsersPhoneBook.Entries[updateVPNname].Update();
  126.             }
  127.             // 创建一个新VPN
  128.             else
  129.             {
  130.                 RasEntry entry = RasEntry.CreateVpnEntry(updateVPNname, updateVPNip, RasVpnStrategy.PptpFirst, RasDevice.GetDeviceByName("(PPTP)", RasDeviceType.Vpn));

  131.                 allUsersPhoneBook.Entries.Add(entry);

  132.                 dialer.EntryName = updateVPNname;

  133.                 dialer.PhoneBookPath = RasPhoneBook.GetPhoneBookPath(RasPhoneBookType.AllUsers);
  134.                
  135.             }
  136.         }

  137.         /// <summary>
  138.         /// 删除指定名称的VPN
  139.         /// 如果VPN正在运行,一样会在电话本里删除,但是不会断开连接,所以,最好是先断开连接,再进行删除操作
  140.         /// </summary>
  141.         /// <param name="delVpnName"></param>
  142.         public void TryDeleteVPN(string delVpnName)
  143.         {
  144.             RasDialer dialer = new RasDialer();
  145.             RasPhoneBook allUsersPhoneBook = new RasPhoneBook();
  146.             allUsersPhoneBook.Open();
  147.             if (allUsersPhoneBook.Entries.Contains(delVpnName))
  148.             {
  149.                 allUsersPhoneBook.Entries.Remove(delVpnName);
  150.             }
  151.         }

  152.         /// <summary>
  153.         /// 获取当前正在连接中的VPN名称
  154.         /// </summary>
  155.         public List<string> GetCurrentConnectingVPNNames()
  156.         {
  157.             List<string> ConnectingVPNList = new List<string>();

  158.             Process proIP = new Process();

  159.             proIP.StartInfo.FileName = "cmd.exe ";
  160.             proIP.StartInfo.UseShellExecute = false;
  161.             proIP.StartInfo.RedirectStandardInput = true;
  162.             proIP.StartInfo.RedirectStandardOutput = true;
  163.             proIP.StartInfo.RedirectStandardError = true;
  164.             proIP.StartInfo.CreateNoWindow = true;//不显示cmd窗口
  165.             proIP.Start();

  166.             proIP.StandardInput.WriteLine(RasDialFileName);
  167.             proIP.StandardInput.WriteLine("exit");

  168.             // 命令行运行结果
  169.             string strResult = proIP.StandardOutput.ReadToEnd();
  170.             proIP.Close();

  171.             Regex regger = new Regex("(?<=已连接\r\n n)*(?=命令已完成)", RegexOptions.Multiline);

  172.             // 如果匹配,则说有正在连接的VPN
  173.             if (regger.IsMatch(strResult))
  174.             {
  175.                 string[] list = regger.Match(strResult).Value.ToString().Split('\n');
  176.                 for (int index = 0; index < list.Length; index++)
  177.                 {
  178.                     if (list[index] != string.Empty)
  179.                         ConnectingVPNList.Add(list[index].Replace("\r", ""));
  180.                 }
  181.             }
  182.             // 没有正在连接的VPN,则直接返回一个空List<string>
  183.             return ConnectingVPNList;
  184.         }

  185.     }
  186. }
코드 복사






이전의:asp.net mvc 프로젝트의 코드 사용자는 TypeInitializationException을 처리하지 않았습니다
다음:1:1 비율은 WeChat APP 프로젝트의 소스 코드 이전에서 완전히 모방되었습니다
면책 조항:
Code Farmer Network에서 발행하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 학습 및 연구 목적으로만 사용됩니다; 위 내용은 상업적 또는 불법적인 목적으로 사용되지 않으며, 그렇지 않으면 모든 책임이 사용자에게 부담됩니다. 이 사이트의 정보는 인터넷에서 가져온 것이며, 저작권 분쟁은 이 사이트와는 관련이 없습니다. 위 내용은 다운로드 후 24시간 이내에 컴퓨터에서 완전히 삭제해야 합니다. 프로그램이 마음에 드신다면, 진짜 소프트웨어를 지원하고, 등록을 구매하며, 더 나은 진짜 서비스를 받아주세요. 침해가 있을 경우 이메일로 연락해 주시기 바랍니다.

Mail To:help@itsvse.com