Windows не предлага политика за повторно набиране за своя VPN клиент, така че връзка, която падне в полунощ, все още е прекъсната и на закуска. Планирана задача, която следи за прекъсването и стартира rasdial, затваря тази празнина без клиент от трета страна. Дали задачата се държи като оператор или като цикъл, се свежда до три подробности: кои събития съпоставя, кои идентификационни данни вижда и какво прави с резултата. Нито една от трите не е трудна и пропускането на която и да е от тях е това, което създава задача, набираща вечно.

Защо таймерът е грешен тригер

Таймерът набира по свой график, независимо дали тунелът е прекъснат. Това създава опити, които никой не е поискал, а опит по време на работна сесия може да я прекъсне. Тригерът за събитие се задейства само когато връзката промени състояние, което е по-евтино и по-лесно за обмисляне. Събитието носи и причината, а причината е това, което отделя мрежов отказ от човек, който се изключва нарочно.

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

Двойката събития и това, което трябва да се потисне

Клиентът на Remote Access Service записва записи за жизнения цикъл в журнала Application под доставчика RasClient. 20226 отбелязва връзка, която е приключила, а 20227 — опит, който се е провалил, така че всяко от двете може да оправдае ново набиране. Всичко останало в задачата зависи от точното съвпадение на тези два идентификатора. Те са стабилни от години, затова рецептите, изградени върху тях, все още се разпространяват, но изграждане, което преименува доставчика или идентификаторите, прави така, че заявката да не връща нищо. Повторете стъпката за доказване след всяка актуализация на функция, вместо да чакате задачата да спре да се задейства.

Едно прекратяване трябва да се изключи. Грешка 631 означава, че портът е бил прекъснат от потребителя, а ново набиране в този момент се бори с човека, който току-що съзнателно е сменил мрежата. Поставете изключването във филтъра на тригера, а не в скрипта, така че задачата изобщо да не стартира. То трябва да се отнася само до един идентификатор на събитие, защото предикатът EventData съвпада само когато посоченият елемент съществува, а споделена клауза би отпаднала тихо всяко събитие на другия идентификатор. Прочетете името на елемента от реален запис, преди да напишете филтъра:

Get-WinEvent -LogName Application -MaxEvents 5 -FilterXPath "*[System[Provider[@Name='RasClient'] and EventID=20226]]" | Select-Object -First 1 -ExpandProperty ToXml

XML показва точните имена на Data в този запис. ErrorCode е обичайното изписване, а запис, който използва нещо друго, изисква това име да бъде заменено във филтъра по-долу.

<QueryList><Query Id="0" Path="Application"><Select Path="Application">*[System[Provider[@Name='RasClient'] and (EventID=20226 or EventID=20227)]] and (EventData[Data[@Name='ErrorCode'] != '631'] or System[EventID=20227])</Select></Query></QueryList>

Поставете това в персонализирания филтър на тригера и го докажете като заявка, преди да стане тригер. Същият XPath се изпълнява от PowerShell срещу живия журнал, което е евтиният начин да видите на какво съвпада, докато историята на задачите още не е замесена.

Get-WinEvent -LogName Application -MaxEvents 40 -FilterXPath "*[System[Provider[@Name='RasClient'] and (EventID=20226 or EventID=20227)]] and (EventData[Data[@Name='ErrorCode'] != '631'] or System[EventID=20227])" | Select-Object TimeCreated,Id,Message

Тригер, който тихо не съвпада с нищо, изглежда точно като задача, която се изпълнява и се проваля. И двете изглеждат като „автоматизацията не работи“ и нито едно не казва коя половина липсва. Проверете първо изхода на заявката, защото той разделя двата случая с една стъпка.

Набирането се проваля, защото няма кой да въведе паролата

Действието стартира rasdial с името на връзката. Когато профилът няма кеширани идентификационни данни, набирането се проваля веднага, защото няма кой да отговори на подканата. Това е най-честата причина правилно задействана задача да не прави нищо видимо, затова го проверете, преди да пипате тригера. Набирането на ръка от команден ред разделя проблем с идентификационните данни от проблем с планирането.

Запазете идентификационните данни веднъж под акаунта, под който ще работи задачата, и направете този акаунт част от дизайна. Задача, работеща като SYSTEM, не може да прочете идентификационни данни, кеширани от вашия интерактивен акаунт, нито задача, работеща като някой друг. Името също трябва да съвпада точно с профила, включително всеки домейн префикс в полето за потребител.

rasdial
rasdial "Office VPN"
(Start-Process rasdial -ArgumentList '"Office VPN"' -Wait -PassThru -NoNewWindow).ExitCode

Първата команда изброява имената, които Windows познава. Втората набира по име с кешираните идентификационни данни, а третата е формата, която едно действие на PowerShell трябва да използва, защото изчаква и връща стойност, която задачата може да запише.

Четете кода за изход, а не прозореца

Задача, която стартира процес без изчакване, съобщава успех веднага щом процесът съществува. За набиране, което може да се провали секунда по-късно, тази присъда е безполезна. Изчакването на кода за изход превръща действието в реален резултат. Историята на задачите сама по себе си показва само че процес е стартирал, никога че тунел се е вдигнал.

Записвайте стойността с времева марка при всяко изпълнение. Единичен провал след прекъсване е нормален, докато три провала подред с един и същ код сочат към идентификационните данни или профила, а не към мрежата. Именно този модел прави историята заслужаваща четене.

Добавете кратък интервал за повторение като застраховка и бъдете ясни как той взаимодейства с тригер за събитие. Повторение на всяка минута за пет минути осигурява втория опит, когато интернетът се е върнал заедно с тунела, а под Настройки, „Ако задачата вече се изпълнява, се прилага следното правило“, задачата иска „Не стартирай нов екземпляр“, така че повторението да не се застъпва с набиране, което все още тече. Без тази настройка два процеса rasdial могат да се състезават за един и същ порт и вторият се проваля без полезна причина.

Докажете пътя за възстановяване

Тествайте двете посоки нарочно. Прекъснете на ръка и потвърдете, че не се случва ново набиране, след което деактивирайте мрежовия адаптер и потвърдете, че задачата се задейства, когато връзката се върне. Тези два теста покриват правилото за потискане и реалния случай на отказ и нищо друго не го прави.

След това четете историята на задачите, а не иконата за връзка. Историята записва кога задачата е работила, кой акаунт е използвала и какво е върнало действието, и това е доказателството, необходимо, когато същата машина отново падне следващия месец.

Подобни статии