Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » .NET - Реконнект VPN и перезапуск служб в C# и CMD

Ответить
Настройки темы
.NET - Реконнект VPN и перезапуск служб в C# и CMD

Новый участник


Сообщения: 8
Благодарности: 0

Профиль | Отправить PM | Цитировать


Приветствую всех!

Столкнулся с, необъяснимой для меня, проблемой, может кто-нибудь сможет растолковать причину?

Предыстория:
Дома 2 компа, в первый (основной) приходит интернет от провайдера и он раздает его на wi-fi точку доступа и второй комп. На основном стоит Win 8 и на нем наблюдается проблема отсутствия реконнекта VPN при обрыве связи и он не хочет сразу раздавать интернет, пока не перезагрузишь службу "SharedAccess".
Для решения проблемы в начале создал bat-файл в котором выполняются 3 простых действия: подключение VPN и остановка / запуск службы "SharedAccess".

Текст файла:
Код: Выделить весь код
rasdial VpnName UserName Password
echo net stop SharedAccess && net start SharedAccess
Работает все отлично, VPN подключается и интернет сразу начинает раздаваться. Проблема в том, что его можно засунуть максимум в автозагрузку, что бы при загрузке интернет подключался, либо использовать при обрыве связи (вручную запустить).
Следующим шагом решил создать приложение которое постоянно, с неким промежутком, пингует 8.8.8.8 и, при длительном отсутствии ответа, реконнектит VPN и перезапускает службы, в общем делает то же самое что и bat-файл.

Часть текста, который за это у меня отвечает:
Код: Выделить весь код
System.Diagnostics.Process.Start("rasdial.exe", "VpnName /d"); // Отключаем VPN, на случай если он просто подвис.
System.Diagnostics.Process.Start("rasdial.exe", "VpnName UserName Password"); // Подключаем VPN
 
// Создаем отдельный поток в котором будет перезапускаться служба расшаривания интерната
Thread serviceRestart = new Thread(new ThreadStart(delegate
{
                    ServiceController service = new ServiceController("SharedAccess"); // Инициализируем экземпляр ServiceController и связываем его со службой расшаривания интернет (SharedAccess)
                    // Пробуем остановить службу
                    try
                    {
                        service.Stop(); // Останавливаем службу
                        service.WaitForStatus(ServiceControllerStatus.Stopped, new TimeSpan(0, 1, 0)); // Ждем в течении 1 минуты переход службы в остановленное состояние
                    }
                    // Если не получилось пишем ошибка в лог файл
                    catch (Exception ex)
                    {
                        System.IO.File.AppendAllText(@"BTReconnect_log.txt", "Остановка службы неудалась, ошибка: " + ex.Message + ". Время: " + DateTime.Now + "\n"); // Пишем текст ошибки в файл
                    }
                    finally
                    {
                        // Пробуем запустить службу
                        try
                        {
                            service.Start(); // Запускаем службу
                            service.WaitForStatus(ServiceControllerStatus.Running, new TimeSpan(0, 1, 0)); // Ждем в течении 1 минуты переход службы в запущенное состояние
                        }
                        // Если что-то не получилось пишем ошибка в лог файл
                        catch (Exception ex)
                        {
                            System.IO.File.AppendAllText(@"BTReconnect_log.txt", "Запуск службы неудался, ошибка: " + ex.Message + ". Время: " + DateTime.Now + "\n"); // Пишем текст ошибки в файл
                        }
                        finally
                        {
                            // Если служба работает, пишем в лог состояние после перезапуска VPN соединения и попытки перезапуска службы
                            if (service.Status == ServiceControllerStatus.Running)
                                System.IO.File.AppendAllText(@"BTReconnect_log.txt", "Служба запущена. Время: " + DateTime.Now + "\n");
 
                            System.IO.File.AppendAllText(@"BTReconnect_log.txt", "===> *************** <===\n\n"); // Дописываем в файл разделить
                        }
                    }
                }));
 
                serviceRestart.Start(); // Запускаем поток
Суть проблемы в следующем:
Созданное приложение, вроде как, функционирует, т.е. пингует адрес 8.8.8.8 , при разрыве соединения реконнектит интернет и перезапускает службы, но есть большое НО:
Интернет на основном компьютере начинает работать с большими задержками, тот же адрес (8.8.8.8) пингуется через раз и нет раздачи инета на второй комп и точку доступа.

Помогите понять, где косяк в приложении?

P.S. Работающий батник тоже пытался запускать через приложение, результат тот же, сеть работает с перебоями и нет раздачи интернета.

При необходимости могу выложить весь проект.

Отправлено: 10:21, 28-03-2013

 

Аватара для Delirium

Ветеран


Сообщения: 5624
Благодарности: 936

Профиль | Отправить PM | Цитировать


Цитата VVolf:
приложение которое постоянно, с неким промежутком, пингует 8.8.8.8 »
Хорошо, а проверка того, что предыдущие проверки закончились, производится? Ведь может получиться так, что проверки и перезапуски "подвисли", а тут подошла след. проверка, она наложилась на предыдущую и покатился ком... Возможно, из-за этого идут перебои. Служба постоянно ребутится, связь прерывается.
Для теста могу предложить только убрать проверку по интервалу и запускать вручную, предварительно проверив состояние служб.

-------

Пройденные курсы:
[Microsoft №10174 Sharepoint], [SharePoint]
Мои проекты:[CheckAdmins], [NetSend7], [System Uptime], [Remote RAdmin LogViewer],[Netdom GDI], [Holidays - напоминалка о днях рождения]

А я офис-гуру :)


Отправлено: 15:23, 28-03-2013 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 8
Благодарности: 0

Профиль | Отправить PM | Цитировать


Проверка есть.
На переподключение ВПН и перезапуск службы дается минута, проверено что за это время все успевает перезапуститься.
Как только появляется первый ответ от пинга после перезапуска, все счетчики сбрасываются в ноль и перезапуск соединения и служб не происходит, до того момента пока снова не наберется "счетчик отсутствия ответов".

Отправлено: 15:42, 28-03-2013 | #3


Аватара для Delirium

Ветеран


Сообщения: 5624
Благодарности: 936

Профиль | Отправить PM | Цитировать


Немного по логике.
Цитата VVolf:
try
{
service.Stop(); // Останавливаем службу
service.WaitForStatus(ServiceControllerStatus.Stopped, new TimeSpan(0, 1, 0)); // Ждем в течении 1 минуты переход службы в остановленное состояние
} »
Цитата VVolf:
finally
{
// Пробуем запустить службу
try
{
service.Start(); // Запускаем службу
service.WaitForStatus(ServiceControllerStatus.Running, new TimeSpan(0, 1, 0)); // Ждем в течении 1 минуты переход службы в запущенное состояние
} »
В первом try идет попытка остановить службу. Допустим, WaitForStatus вывалилась с ошибкой. Мы пишем ошибку в лог (catch) и затем в finally пытаемся стартануть службу, которая не ответила своевременно. Мне кажется, надо в finally убивать в жесткую службу, предварительно сделав проверку на ее статус.

Цитата VVolf:
Проблема в том, что его можно засунуть максимум в автозагрузку, что бы при загрузке интернет подключался, либо использовать при обрыве связи »
А почему бы не затолкать в планировщик?

-------

Пройденные курсы:
[Microsoft №10174 Sharepoint], [SharePoint]
Мои проекты:[CheckAdmins], [NetSend7], [System Uptime], [Remote RAdmin LogViewer],[Netdom GDI], [Holidays - напоминалка о днях рождения]

А я офис-гуру :)


Отправлено: 02:03, 29-03-2013 | #4


Новый участник


Сообщения: 8
Благодарности: 0

Профиль | Отправить PM | Цитировать


В планировщик не затолкать, потому что в программе реализована еще и индикация состояния сети, батник этого не сделает.

Вот что еще вывел тестовым путем:
если создать батник с таким текстом:

Код: Выделить весь код
@echo off
:loop
ping ya.ru -n 6 || (rasdial VpnName UserName Password && (net stop SharedAccess && net start SharedAccess))
goto loop
и запустить его как bat-файл, то все отрабатывает нормально, т.е. соединение перезапускается вместе со службами и идет раздача на второй компьютер.
А если этот файл сконвертировать в exe (использовал Advanced BAT to EXE Converter) и запустить, то происходит то же, что и с приложением созданным в C# - соединение переподключается, но сеть работает с задержками и нет раздачи интернет на второй компьютер.

Поэтому появился следующий вопрос:
Есть ли какие-нибудь ограничения в Windows вообще или только в Win 8 на запуск VPN соединений или перезагрузки служб приложением .exe? Или быть может нужны дополнительные аргументы для запуска?

Последний раз редактировалось VVolf, 29-03-2013 в 11:34. Причина: Тэги


Отправлено: 11:33, 29-03-2013 | #5


Новый участник


Сообщения: 8
Благодарности: 0

Профиль | Отправить PM | Цитировать


Еще апдейт информации! )
Тупит служба "SharedAccess", т.е. если ее отключить после реконнекта и не включать, то сеть работает стабильно, пинг ровный (но нет раздачи интернет на второй комп), а если включить, даже с помощью консоли, пинг начинает прерываться.
Есть у кого-нибудь идеи почему так может быть и как с этим бороться?

Отправлено: 16:02, 29-03-2013 | #6


Аватара для Delirium

Ветеран


Сообщения: 5624
Благодарности: 936

Профиль | Отправить PM | Цитировать


Цитата VVolf:
Есть ли какие-нибудь ограничения »
Да нет, на это нет никаких ограничений.
Вообще ситуация странная. Можно проверить еще вот что: SharedAccess зависит от нескольких служб, возможно какая то из них(например, диспетчер подключений удаленного доступа) при его рестарте не работает?

Ну и совсем не в тему вопрос: А нельзя приобрести маршрутизатор простенький рублей за 900, дабы все проблемы исчезли?

-------

Пройденные курсы:
[Microsoft №10174 Sharepoint], [SharePoint]
Мои проекты:[CheckAdmins], [NetSend7], [System Uptime], [Remote RAdmin LogViewer],[Netdom GDI], [Holidays - напоминалка о днях рождения]

А я офис-гуру :)


Отправлено: 00:11, 30-03-2013 | #7


Новый участник


Сообщения: 8
Благодарности: 0

Профиль | Отправить PM | Цитировать


Доброе утро!

Согласен, ситуация совсем странная. Все необходимые для работы "SharedAccess" службы включены, да и не в них по идее дело, т.к. если через bat-файл все нормально работает.
Простенький маршрутизатор не подходит, т.к. пока ни один маршрутизатор не давал такую же скорость передачи данных как по схеме от компьютера компьютеру через сетевую карту. А на дорогой пока денег жалко.
+ дело еще в том, что я только начал учить C# и хочется разобраться в проблеме, что бы в будущем не натыкаться на эти же грабли.

Отправлено: 09:44, 01-04-2013 | #8


Аватара для Delirium

Ветеран


Сообщения: 5624
Благодарности: 936

Профиль | Отправить PM | Цитировать


VVolf, да проблема то в том, что твой код вполне корректен, если не считать того нюанса, что я указывал выше. Попробуй сделать так: практически после каждой строки пиши в текстовик лог действия. Прямо после каждой строки с пояснением. А когда будут косяки, проанализируй лог. Может быть какая либо операция по порядку не отрабатывает или еще что.
Можешь, если хочешь, весь проект сюда или еще куда выложить, я посмотрю.

-------

Пройденные курсы:
[Microsoft №10174 Sharepoint], [SharePoint]
Мои проекты:[CheckAdmins], [NetSend7], [System Uptime], [Remote RAdmin LogViewer],[Netdom GDI], [Holidays - напоминалка о днях рождения]

А я офис-гуру :)


Отправлено: 14:03, 01-04-2013 | #9


Новый участник


Сообщения: 8
Благодарности: 0

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: 7z BTReconnect.7z
(203.6 Kb, 5 просмотров)

Лог есть, пишет все что происходит в файл. По файлу видно что все отрабатывает :-/
Проект во вложении, буду очень признателен если посмотришь.

Отправлено: 17:34, 01-04-2013 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » .NET - Реконнект VPN и перезапуск служб в C# и CMD

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] написать скрипт cmd используя cmd оператор for Den Скриптовые языки администрирования Windows 6 29-03-2012 09:48
CMD/BAT - [решено] Перезапуск служб с помощью батника goodguy Скриптовые языки администрирования Windows 16 13-01-2012 07:44
CMD/BAT - [решено] как запустить cmd на удаленной машине чтобы cmd отобразилось у меня Mickle Скриптовые языки администрирования Windows 13 21-09-2010 14:43
CMD/BAT - [решено] Помогите запустить CMD-файл из CMD-файла с параметрами Oleg48 Скриптовые языки администрирования Windows 2 18-11-2009 11:08
FreeBSD - Интернет через PPPoE - реконнект. bazilla-x Общий по FreeBSD 7 08-12-2008 12:04




 
Переход