Трымайце VPN на Windows уключаным: запускайце rasdial пры падзеі адключэння
RasClient 20226 і 20227 пазначаюць абрыў; 631 азначае, што гэта зрабіў чалавек. Запускайце rasdial на першых двух, захавайце адны ўліковыя даныя і чытайце код выхаду.
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 могуць спаборнічаць за адзін порт, і другі падае без карыснай прычыны.
Дакажыце шлях аднаўлення
Праверце абодва напрамкі наўмысна. Адключыцеся ўручную і пераканайцеся, што новага набору не адбываецца, затым адключыце сеткавы адаптар і пераканайцеся, што задача спрацоўвае, калі сувязь вяртаецца. Гэтыя два тэсты пакрываюць правіла заглушэння і рэальны выпадак збою, і больш нішто гэтага не робіць.
Пасля гэтага чытайце гісторыю задач, а не значок злучэння. Гісторыя запісвае, калі задача запускалася, які запіс выкарыстоўвала і што вярнула дзеянне, і менавіта гэта з’яўляецца доказам, патрэбным, калі тая ж машына зноў абрываецца ў наступным месяцы.