2011年2月1日星期二

使用DotRas进行VPN拨号

 

/// <summary>
       /// 初始化VPN連接
       ///
       /// </summary>
       private void InitVpnEntry(){
           try
           {
               this.AllUsersPhoneBook.Open();
               entry = RasEntry.CreateVpnEntry(EntryName, "61.155.18.16", RasVpnStrategy.Default,
                   RasDevice.GetDeviceByName("(PPTP)", RasDeviceType.Vpn));
               entry.Options.RemoteDefaultGateway = bDefaultGw;
               entry.Options.NetworkLogOn = false;
               entry.Options.PreviewDomain = false;
               this.AllUsersPhoneBook.Entries.Remove(entry.Name);
               this.AllUsersPhoneBook.Entries.Add(entry);
               this.statusbar.Text = "VPN连接创建成功,程序初始化完成!";
               this.DisconnectButton.Enabled = false;
           }catch(Exception ex){
               //MessageBox.Show(ex.GetType()+":打开或创建电话簿时发生错误。请检查VPN连接是否已经存在!");
           }
       }

       /// <summary>
       /// 建立VPN連接
       /// </summary>
       /// <param name="sender"></param>
       /// <param name="e"></param>
       private void button2_Click(object sender, EventArgs e)
       {
           InitVpnEntry();
           this.Dialer.EntryName = EntryName;
           this.Dialer.PhoneBookPath = RasPhoneBook.GetPhoneBookPath(RasPhoneBookType.AllUsers);

           this.username = txtUsername.Text.Trim();
           this.password = txtPassword.Text.Trim();
           if (this.username.Length == 0 || this.password.Length == 0)
           {
               MessageBox.Show("请填写用户名和密码!");
               return;
           }

           try
           {
               this.Dialer.Credentials = new NetworkCredential(username,password);
               this.handle = this.Dialer.DialAsync();
               this.DisconnectButton.Enabled = true;
               this.BtnExit.Enabled = false;
               this.btnConnect.Enabled = false;
           }
           catch (Exception ex)
           {
               MessageBox.Show(ex.ToString());
           }
       }

/// <summary>
        /// 斷開VPN連接
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void DisconnectButton_Click(object sender, EventArgs e)
        {
            if (entry == null)
                return;
            if (this.Dialer.IsBusy)
            {
                this.Dialer.DialAsyncCancel();
            }
            else
            {
                RasConnection connection = RasConnection.GetActiveConnectionByHandle(this.handle);
                if (connection != null)
                {
                    connection.HangUp();
                }
            }
            this.BtnExit.Enabled = true;
            this.btnConnect.Enabled = true;
            this.DisconnectButton.Enabled = false;
            this.statusbar.Text = "VPN连接已断开!";
        }

/// <summary>
       /// 異步VPN連接過程回調函數
       /// </summary>
       /// <param name="sender"></param>
       /// <param name="e"></param>
       private void Dialer_StateChanged(object sender, StateChangedEventArgs e)
       {
           this.statusbar.Text = e.State.ToString();
       }

       /// <summary>
       /// 異步VPN連接過程回調函數
       /// </summary>
       /// <param name="sender"></param>
       /// <param name="e"></param>
       private void Dialer_DialCompleted(object sender, DialCompletedEventArgs e)
       {
           if (e.Cancelled)
           {
               this.DisconnectButton.Enabled = false;
               this.BtnExit.Enabled = true;
               this.btnConnect.Enabled = true;
               this.statusbar.Text = "拨号已被取消!";
           }
           else if (e.TimedOut)
           {
               this.DisconnectButton.Enabled = false;
               this.BtnExit.Enabled = true;
               this.btnConnect.Enabled = true;
               this.statusbar.Text = "连接超时!";
           }
           else if (e.Error != null)
           {
               this.DisconnectButton.Enabled = false;
               this.BtnExit.Enabled = true;
               this.btnConnect.Enabled = true;
               this.statusbar.Text = e.Error.ToString();
           }
           else if (e.Connected)
           {
               this.DisconnectButton.Enabled = true;
               this.BtnExit.Enabled = false;
               this.btnConnect.Enabled = false;
               this.statusbar.Text = "VPN拨号成功!";
               WriteSettings();
               GetVpnClientIp();
           }

           if (!e.Connected)
           {
               this.DisconnectButton.Enabled = false;
               this.BtnExit.Enabled = true;
               this.btnConnect.Enabled = true;
               this.statusbar.Text = "未能成功连接VPN服务器!";
               MessageBox.Show("VPN拨号失败!请检查服务器是否正常,用户名和密码是否正确。");
           }
       }

没有评论:

发表评论