我在codeproject中看到一段代码关于使用RAS拨VPN的,但需要先将VPN设置好,并保存密码才能拨号,有哪位大虾能帮我改一下这段代码,能实现没有配置VPN的情况下也能拨号,或配置了VPN在没有保存密码的情况下,可以让用户输入密码!
代码如下:

解决方案 »

  1.   

    using System;
    using System.Runtime.InteropServices;
    using System.Text;namespace Dailup.RAS
    {
    internal enum RasFieldSizeConstants
    {
    RAS_MaxDeviceType     =16,
    RAS_MaxPhoneNumber    =128,
    RAS_MaxIpAddress      =15,
    RAS_MaxIpxAddress     =21,
    #if WINVER4
    RAS_MaxEntryName      =256,
    RAS_MaxDeviceName     =128,
    RAS_MaxCallbackNumber =RAS_MaxPhoneNumber,
    #else
    RAS_MaxEntryName      =20,
    RAS_MaxDeviceName     =32,
    RAS_MaxCallbackNumber =48,
    #endif RAS_MaxAreaCode       =10,
    RAS_MaxPadType        =32,
    RAS_MaxX25Address     =200,
    RAS_MaxFacilities     =200,
    RAS_MaxUserData       =200,
    RAS_MaxReplyMessage   =1024,
    RAS_MaxDnsSuffix      =256,
    UNLEN   =256,
    PWLEN   =256,
    DNLEN   =15
    }
    [StructLayout(LayoutKind.Sequential,CharSet=CharSet.Auto)]
    public struct GUID
    {
    public uint   Data1;
    public ushort   Data2;
    public ushort   Data3;
    [MarshalAs(UnmanagedType.ByValArray,SizeConst=8)]
    public byte[] Data4;
    } [StructLayout(LayoutKind.Sequential,CharSet=CharSet.Auto)]
    internal struct RASCONN 

    public int     dwSize; 
    public IntPtr  hrasconn; 
    [MarshalAs(UnmanagedType.ByValTStr,SizeConst=(int)RasFieldSizeConstants.RAS_MaxEntryName+1)]
    public string    szEntryName; 
    [MarshalAs(UnmanagedType.ByValTStr,SizeConst=(int)RasFieldSizeConstants.RAS_MaxDeviceType+1)]
    public string    szDeviceType; 
    [MarshalAs(UnmanagedType.ByValTStr,SizeConst=(int)RasFieldSizeConstants.RAS_MaxDeviceName+1)]
    public string    szDeviceName; 
    [MarshalAs(UnmanagedType.ByValTStr,SizeConst=260)]//MAX_PAPTH=260
    public string    szPhonebook;
    public int   dwSubEntry;
    public GUID   guidEntry;
    #if (WINVER501)
     int     dwFlags;
     public LUID      luid;
    #endif
    }

    [StructLayout(LayoutKind.Sequential,CharSet=CharSet.Auto)]
    internal struct LUID 
    {
    int LowPart;
    int HighPart;
    } [StructLayout(LayoutKind.Sequential,CharSet=CharSet.Auto)]
    public struct RasEntryName 

    public int dwSize; 
    [MarshalAs(UnmanagedType.ByValTStr,SizeConst=(int)RasFieldSizeConstants.RAS_MaxEntryName + 1)]
    public string szEntryName; 
    #if WINVER5
    public int dwFlags;
    [MarshalAs(UnmanagedType.ByValTStr,SizeConst=260+1)]
    public string szPhonebookPath;
    #endif
    } [StructLayout(LayoutKind.Sequential,CharSet=CharSet.Auto)]
    public class RasStats 
    {
    public int dwSize=Marshal.SizeOf(typeof(RasStats));
    public int dwBytesXmited;
    public int dwBytesRcved;
    public int dwFramesXmited;
    public int dwFramesRcved;
    public int dwCrcErr;
    public int dwTimeoutErr;
    public int dwAlignmentErr;
    public int dwHardwareOverrunErr;
    public int dwFramingErr;
    public int dwBufferOverrunErr;
    public int dwCompressionRatioIn;
    public int dwCompressionRatioOut;
    public int dwBps;
    public int dwConnectDuration;

    public class RAS { [DllImport("Rasapi32.dll", EntryPoint="RasEnumConnectionsA",
     SetLastError=true)] internal static extern int RasEnumConnections
    (
    ref RASCONN lprasconn, // buffer to receive connections data
    ref int lpcb, // size in bytes of buffer
    ref int lpcConnections // number of connections written to buffer
    );
    [DllImport("rasapi32.dll",CharSet=CharSet.Auto)]
    internal static extern uint RasGetConnectionStatistics(
    IntPtr hRasConn,       // handle to the connection
    [In,Out]RasStats lpStatistics  // buffer to receive statistics
    );
    [DllImport("rasapi32.dll",CharSet=CharSet.Auto)]
    public extern static uint RasHangUp(
    IntPtr hrasconn  // handle to the RAS connection to hang up
    ); [DllImport("rasapi32.dll",CharSet=CharSet.Auto)]
    public extern static uint RasEnumEntries (
    string reserved,              // reserved, must be NULL
    string lpszPhonebook,         // pointer to full path and
    //  file name of phone-book file
    [In,Out]RasEntryName[] lprasentryname, // buffer to receive
    //  phone-book entries
    ref int lpcb,                  // size in bytes of buffer
    out int lpcEntries             // number of entries written
    //  to buffer
    ); [DllImport("wininet.dll",CharSet=CharSet.Auto)]
    public extern static int InternetDial(
    IntPtr hwnd,
    [In]string lpszConnectoid, 
    uint dwFlags,
    ref int lpdwConnection,
    uint dwReserved
    ); public RAS()
    { }        
    } public class RASDisplay
    {
    private string m_duration;
    private string m_ConnectionName;
    private string[] m_ConnectionNames;
    private double m_TX;
    private double m_RX;
    private bool m_connected;
    private IntPtr m_ConnectedRasHandle;
    public RASDisplay()
    {
    m_connected = true; RAS lpras = new RAS();
    RASCONN lprasConn = new RASCONN(); lprasConn.dwSize = Marshal.SizeOf(typeof(RASCONN));
    lprasConn.hrasconn = IntPtr.Zero;

    int lpcb = 0;
    int lpcConnections = 0;
    int nRet = 0;
    lpcb = Marshal.SizeOf(typeof(RASCONN));


    nRet = RAS.RasEnumConnections(ref lprasConn, ref lpcb, ref
    lpcConnections);


    if(nRet != 0) {
    m_connected = false;
    return;

    }

    if(lpcConnections > 0)
    {
    //for (int i = 0; i < lpcConnections; i++) //{
    RasStats stats = new RasStats();

    m_ConnectedRasHandle = lprasConn.hrasconn;
    RAS.RasGetConnectionStatistics(lprasConn.hrasconn, stats);


    m_ConnectionName = lprasConn.szEntryName;

    int Hours = 0;
    int Minutes = 0;
    int Seconds = 0; Hours = ((stats.dwConnectDuration /1000) /3600);
    Minutes = ((stats.dwConnectDuration /1000) /60) - (Hours * 60);
    Seconds = ((stats.dwConnectDuration /1000)) - (Minutes * 60) - (Hours * 3600);


    m_duration = Hours  +  " hours "  + Minutes + " minutes " + Seconds + " secs";
    m_TX = stats.dwBytesXmited;
    m_RX = stats.dwBytesRcved;
    //}
    }
    else
    {
    m_connected = false;
    }


    int lpNames = 1;
    int entryNameSize = 0;
    int lpSize = 0;
    RasEntryName[] names = null; entryNameSize=Marshal.SizeOf(typeof(RasEntryName));
    lpSize=lpNames*entryNameSize;

    names=new RasEntryName[lpNames];
    names[0].dwSize=entryNameSize; uint retval = RAS.RasEnumEntries(null,null,names,ref lpSize,out lpNames); //if we have more than one connection, we need to do it again
    if(lpNames > 1)
    {
    names=new RasEntryName[lpNames];
    for(int i=0;i<names.Length;i++)
    {
    names[i].dwSize=entryNameSize;
    } retval = RAS.RasEnumEntries(null,null,names,ref lpSize,out lpNames); }
    m_ConnectionNames = new string[names.Length];


    if(lpNames>0)
    {
    for(int i=0;i<names.Length;i++)
    {

    m_ConnectionNames[i] = names[i].szEntryName;

    }
    }
    } public string Duration
    {
    get
    {
    return m_connected ? m_duration : "";
    }
    }

    public string[] Connections
    {
    get
    {
    return m_ConnectionNames;
    }
    }

    public double BytesTransmitted
    {
    get
    {
    return m_connected ? m_TX : 0;
    }
    }
    public double BytesReceived
    {
    get
    {
    return m_connected ? m_RX :  0;

    }
    }
    public string ConnectionName
    {
    get
    {
    return m_connected ? m_ConnectionName : "";
    }
    }
    public bool IsConnected
    {
    get
    {
    return m_connected;
    }
    } public int Connect(string Connection)
    {
    int temp = 0;
    uint INTERNET_AUTO_DIAL_UNATTENDED = 2;
    int retVal = RAS.InternetDial(IntPtr.Zero,Connection,INTERNET_AUTO_DIAL_UNATTENDED,ref temp,0);
    return retVal;
    }
    public void Disconnect()
    {
    RAS.RasHangUp(m_ConnectedRasHandle);
    }
    }
    }
      

  2.   

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;using Dailup.RAS;namespace DiualVpn
    {
        public partial class frmMain : Form
        {
            private bool connected=false;
            public frmMain()
            {
                InitializeComponent();
            }        private void frmMain_Load(object sender, EventArgs e)
            {
                BindData();
                timer1.Start();
            }
            private void BindData()
            {
                try
                {
                    RASDisplay display = new RASDisplay();
                    connected = display.IsConnected;
                    cbAllConnections.Visible = !connected;
                    //lblName.Visible = connected;
                    lblDuration.Visible = connected;
                    lblRecieved.Visible = connected;
                    lblTransmitted.Visible = connected;
                    if (connected)
                    {
                        //lblName.Text = display.ConnectionName;
                        lblDuration.Text =string.Format("Duration:{0}", display.Duration);
                        lblRecieved.Text = string.Format("Recieved:{0}", display.BytesReceived.ToString());
                        lblTransmitted.Text =string.Format("Sent:{0}", display.BytesTransmitted.ToString());
                    }
                    cbAllConnections.DataSource = display.Connections;
                    // dgAllConnections.DataBind();
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.Message);
                }
            }        private void btnConnect_Click(object sender, EventArgs e)
            {
                RASDisplay rasDisplay = new RASDisplay();
                int ErrorVal = rasDisplay.Connect(cbAllConnections.Text);            if (ErrorVal != 0)
                {
                    MessageBox.Show(ErrorVal.ToString(), "VPN", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                else
                {
                    BindData();
                }
            }        private void btnDisConnect_Click(object sender, EventArgs e)
            {
                RASDisplay rasDisplay = new RASDisplay();
                rasDisplay.Disconnect();
                BindData();
            }        private void timer1_Tick(object sender, EventArgs e)
            {
                if (connected)
                {
                    BindData();
                }
            }    }
    }
      

  3.   

    namespace DiualVpn
    {
        partial class frmMain
        {
            /// <summary>
            /// Required designer variable.
            /// </summary>
            private System.ComponentModel.IContainer components = null;        /// <summary>
            /// Clean up any resources being used.
            /// </summary>
            /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
            protected override void Dispose(bool disposing)
            {
                if (disposing && (components != null))
                {
                    components.Dispose();
                }
                base.Dispose(disposing);
            }        #region Windows Form Designer generated code        /// <summary>
            /// Required method for Designer support - do not modify
            /// the contents of this method with the code editor.
            /// </summary>
            private void InitializeComponent()
            {
                this.components = new System.ComponentModel.Container();
                this.cbAllConnections = new System.Windows.Forms.ComboBox();
                this.btnConnect = new System.Windows.Forms.Button();
                this.btnDisConnect = new System.Windows.Forms.Button();
                this.lblDuration = new System.Windows.Forms.Label();
                this.lblRecieved = new System.Windows.Forms.Label();
                this.lblTransmitted = new System.Windows.Forms.Label();
                this.timer1 = new System.Windows.Forms.Timer(this.components);
                this.SuspendLayout();
                // 
                // cbAllConnections
                // 
                this.cbAllConnections.FormattingEnabled = true;
                this.cbAllConnections.Location = new System.Drawing.Point(22, 33);
                this.cbAllConnections.Name = "cbAllConnections";
                this.cbAllConnections.Size = new System.Drawing.Size(121, 21);
                this.cbAllConnections.TabIndex = 0;
                // 
                // btnConnect
                // 
                this.btnConnect.Location = new System.Drawing.Point(206, 32);
                this.btnConnect.Name = "btnConnect";
                this.btnConnect.Size = new System.Drawing.Size(75, 23);
                this.btnConnect.TabIndex = 1;
                this.btnConnect.Text = "Connect";
                this.btnConnect.UseVisualStyleBackColor = true;
                this.btnConnect.Click += new System.EventHandler(this.btnConnect_Click);
                // 
                // btnDisConnect
                // 
                this.btnDisConnect.Location = new System.Drawing.Point(206, 61);
                this.btnDisConnect.Name = "btnDisConnect";
                this.btnDisConnect.Size = new System.Drawing.Size(75, 23);
                this.btnDisConnect.TabIndex = 2;
                this.btnDisConnect.Text = "DisConnect";
                this.btnDisConnect.UseVisualStyleBackColor = true;
                this.btnDisConnect.Click += new System.EventHandler(this.btnDisConnect_Click);
                // 
                // lblDuration
                // 
                this.lblDuration.AutoSize = true;
                this.lblDuration.Location = new System.Drawing.Point(31, 35);
                this.lblDuration.Name = "lblDuration";
                this.lblDuration.Size = new System.Drawing.Size(35, 13);
                this.lblDuration.TabIndex = 4;
                this.lblDuration.Text = "label2";
                // 
                // lblRecieved
                // 
                this.lblRecieved.AutoSize = true;
                this.lblRecieved.Location = new System.Drawing.Point(32, 58);
                this.lblRecieved.Name = "lblRecieved";
                this.lblRecieved.Size = new System.Drawing.Size(35, 13);
                this.lblRecieved.TabIndex = 5;
                this.lblRecieved.Text = "label3";
                // 
                // lblTransmitted
                // 
                this.lblTransmitted.AutoSize = true;
                this.lblTransmitted.Location = new System.Drawing.Point(33, 82);
                this.lblTransmitted.Name = "lblTransmitted";
                this.lblTransmitted.Size = new System.Drawing.Size(35, 13);
                this.lblTransmitted.TabIndex = 6;
                this.lblTransmitted.Text = "label4";
                // 
                // timer1
                // 
                this.timer1.Interval = 1000;
                this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
                // 
                // frmMain
                // 
                this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                this.ClientSize = new System.Drawing.Size(326, 134);
                this.Controls.Add(this.lblTransmitted);
                this.Controls.Add(this.lblRecieved);
                this.Controls.Add(this.lblDuration);
                this.Controls.Add(this.btnDisConnect);
                this.Controls.Add(this.btnConnect);
                this.Controls.Add(this.cbAllConnections);
                this.Name = "frmMain";
                this.Text = "VPN";
                this.Load += new System.EventHandler(this.frmMain_Load);
                this.ResumeLayout(false);
                this.PerformLayout();        }        #endregion        private System.Windows.Forms.ComboBox cbAllConnections;
            private System.Windows.Forms.Button btnConnect;
            private System.Windows.Forms.Button btnDisConnect;
            private System.Windows.Forms.Label lblDuration;
            private System.Windows.Forms.Label lblRecieved;
            private System.Windows.Forms.Label lblTransmitted;
            private System.Windows.Forms.Timer timer1;
        }
    }
      

  4.   

    source code 已放在
    http://download.csdn.net/source/837048