日前,因需要使用ADSL斷線重連以獲取新IP,來實現某些功能,特寫了一Windows service來實現該功能,在網上找了一些ADSL操作類,如調用DllImport("Rasapi32.dll")的RAS類,只能在XP下操作,在WIN7下無效,后改采用DotRas for Win7來實現,網上的DEMO多是采用DotRas連接VPN的,連接PPPOE的很少,所以折騰了很長一段時間,特此記錄.
Step 1:
首先Nuget最新的DotRas for Win7
Step 2:
用code創建一個新的PPPOE鏈接
/// <summary> /// 創建或更新一個PPPOE連接(指定PPPOE名稱) /// </summary> public void CreateOrUpdatePPPOE(string updatePPPOEname) { RasDialer dialer = new RasDialer(); RasPhoneBook allUsersPhoneBook = new RasPhoneBook(); string path = RasPhoneBook.GetPhoneBookPath(RasPhoneBookType.AllUsers); allUsersPhoneBook.Open(path); // 如果已經該名稱的PPPOE已經存在,則更新這個PPPOE服務器地址 if (allUsersPhoneBook.Entries.Contains(updatePPPOEname)) { allUsersPhoneBook.Entries[updatePPPOEname].PhoneNumber = " "; // 不管當前PPPOE是否連接,服務器地址的更新總能成功,如果正在連接,則需要PPPOE重啟后才能起作用 allUsersPhoneBook.Entries[updatePPPOEname].Update(); } // 創建一個新PPPOE else { string adds = string.Empty; ReadOnlyCollection<RasDevice> readOnlyCollection = RasDevice.GetDevices(); // foreach (var col in readOnlyCollection) // { // adds += col.Name + ":" + col.DeviceType.ToString() + "|||"; // } // _log.Info("Devices are : " + adds); // Find the device that will be used to dial the connection. RasDevice device = RasDevice.GetDevices().Where(o => o.DeviceType == RasDeviceType.PPPoE).First(); RasEntry entry = RasEntry.CreateBroadbandEntry(updatePPPOEname, device); //建立寬帶連接Entry entry.PhoneNumber = " "; allUsersPhoneBook.Entries.Add(entry); } }
Step 3:
Connect:
public void Connect(string Connection) { try { CreateOrUpdatePPPOE(Connection); RasDialer dialer = new RasDialer(); dialer.EntryName = Connection; dialer.PhoneNumber = " "; dialer.AllowUseStoredCredentials = true; dialer.PhoneBookPath = RasPhoneBook.GetPhoneBookPath(RasPhoneBookType.AllUsers); dialer.Credentials = new NetworkCredential("username", "password"); dialer.Timeout = 1000; RasHandle myras = dialer.Dial(); while (myras.IsInvalid) { Thread.Sleep(1000); myras = dialer.Dial(); } if (!myras.IsInvalid) { _log.Info("RasDialer Success! " + Convert.ToString(DateTime.Now)); } } catch (Exception ex) { _log.Info("RasDialer error! " + Convert.ToString(DateTime.Now) + Connection + " error is :: " + ex.ToString()); } }