Išlaikykite Windows VPN veikiantį: paleiskite rasdial nutrūkimo įvykyje
RasClient 20226 ir 20227 žymi nutrūkimą; 631 reiškia, kad tai padarė žmogus. Paleiskite rasdial pirmuosiuose dviejuose, išsaugokite vienus prisijungimo duomenis ir skaitykite išėjimo kodą.
Windows nesiūlo jokios perrinkimo politikos savo VPN klientui, todėl vidurnaktį nutrūkęs ryšys ryte prie pusryčių stalo vis dar nutrūkęs. Suplanuota užduotis, kuri stebi nutrūkimą ir paleidžia rasdial, užpildo šią spragą be trečiosios šalies kliento. Ar užduotis elgiasi kaip operatorius, ar kaip ciklas, priklauso nuo trijų detalių: kuriuos įvykius ji atitinka, kokius prisijungimo duomenis ji mato ir ką ji daro su rezultatu. Nė viena iš trijų nėra sunki, ir bet kurios iš jų trūkumas sukuria užduotį, kuri renka amžinai.
Kodėl laikmatis yra netinkamas trigeris
Laikmatis renka pagal savo grafiką, nesvarbu, ar tunelis nutrūkęs, ar ne. Tai sukuria bandymus, kurių niekam nereikėjo, o bandymas darbo sesijos metu gali ją pertraukti. Įvykio trigeris suveikia tik tada, kai ryšys pakeičia būseną, o tai pigiau ir lengviau apmąstyti. Įvykis taip pat neša priežastį, ir priežastis yra tai, kas atskiria tinklo gedimą nuo žmogaus, kuris sąmoningai atsijungia.
Šis skirtumas yra skirtumas tarp naudingos užduoties ir tokios, kuri kiekvieną vakarą kovoja su naudotoju. Tai taip pat dalis, kurios paprastai trūksta receptuose, aprašančiuose tik veiksmą.
Įvykių pora ir tas, kurį reikia nuslopinti
Remote Access Service klientas rašo gyvavimo ciklo įrašus į Application žurnalą pagal teikėją RasClient. 20226 žymi pasibaigusį ryšį, o 20227 – nepavykusį bandymą, todėl abu gali pateisinti naują rinkimą. Visa kita užduotyje priklauso nuo tikslaus šių dviejų identifikatorių sutapdinimo. Jie stabilūs jau metus, todėl jais pagrįsti receptai vis dar cirkuliuoja, bet kūrimas, pervadinantis teikėją ar identifikatorius, lemia tai, kad užklausa nieko negrąžina. Pakartokite įrodymo žingsnį po kiekvieno funkcijos atnaujinimo, o ne laukite, kol užduotis nustos suveikinėti.
Vieną pabaigą reikia išskirti. Klaida 631 reiškia, kad prievadą atjungė naudotojas, o pakartotinis rinkimas tuo metu kovoja su žmogumi, kuris ką tik sąmoningai pakeitė tinklą. Išimtį įdėkite į trigerio filtrą, o ne į scenarijų, kad užduotis apskritai neprasidėtų. Ji turi būti taikoma tik vienam įvykio ID, nes EventData predikatas sutampa tik tada, kai nurodytas elementas egzistuoja, o bendra sąlyga tyliai atmestų kiekvieną kito ID įvykį. Prieš rašydami filtrą perskaitykite elemento pavadinimą iš tikro įrašo:
Get-WinEvent -LogName Application -MaxEvents 5 -FilterXPath "*[System[Provider[@Name='RasClient'] and EventID=20226]]" | Select-Object -First 1 -ExpandProperty ToXml
XML rodo tikslius Data pavadinimus tame įraše. ErrorCode yra įprasta rašyba, o įrašas, naudojantis ką nors kita, reikalauja tą pavadinimą pakeisti žemiau esančiame filtre.
<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>
Įklijuokite tai į tinkintą trigerio filtrą ir įrodykite kaip užklausą, prieš jam tampant trigeriu. Tas pats XPath vykdomas iš PowerShell prieš gyvą žurnalą, o tai pigus būdas pamatyti, ką jis atitinka, kol užduočių istorija dar nėra įtraukta.
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
Trigeris, kuris tyliai nieko neatitinka, atrodo lygiai kaip užduotis, kuri vykdoma ir nepavyksta. Abi atrodo kaip „automatizavimas neveikia“, ir nė viena nepasako, kurios pusės trūksta. Pirmiausia patikrinkite užklausos išvestį, nes ji vienu žingsniu atskiria abu atvejus.
Rinkimas nepavyksta, nes nėra kam įvesti slaptažodžio
Veiksmas paleidžia rasdial su ryšio pavadinimu. Kai profilis neturi podėlyje saugomų prisijungimo duomenų, rinkimas iš karto nepavyksta, nes nėra kam atsakyti į raginimą. Tai dažniausia priežastis, kodėl tinkamai suveikusi užduotis nieko matomo nedaro, todėl patikrinkite tai prieš liesdami trigerį. Rinkimas ranka iš komandinės eilutės atskiria prisijungimo duomenų problemą nuo planavimo problemos.
Išsaugokite prisijungimo duomenis vieną kartą po ta sąskaita, kuria veiks užduotis, ir padarykite tą sąskaitą dizaino dalimi. Užduotis, veikianti kaip SYSTEM, negali perskaityti jūsų interaktyvios sąskaitos podėlyje išsaugotų duomenų, o užduotis, veikianti kaip kas nors kitas, taip pat negali. Pavadinimas taip pat turi tiksliai atitikti profilį, įskaitant bet kokį domeno priešdėlį naudotojo lauke.
rasdial
rasdial "Office VPN"
(Start-Process rasdial -ArgumentList '"Office VPN"' -Wait -PassThru -NoNewWindow).ExitCode
Pirmoji komanda išvardija pavadinimus, kuriuos žino Windows. Antroji renka pagal pavadinimą naudodama podėlyje saugomus duomenis, o trečioji yra forma, kurią turėtų naudoti PowerShell veiksmas, nes ji laukia ir grąžina reikšmę, kurią užduotis gali įrašyti.
Skaitykite išėjimo kodą, o ne langą
Užduotis, kuri paleidžia procesą nelaukdama, praneša apie sėkmę, kai tik procesas egzistuoja. Rinkimui, kuris gali nepavykti po sekundės, toks verdiktas bevertis. Išėjimo kodo laukimas paverčia veiksmą tikru rezultatu. Užduočių istorija pati savaime rodo tik tai, kad procesas prasidėjo, niekada – kad tunelis pakilo.
Registruokite reikšmę su laiko žyma kiekvieną kartą. Vienas nepavykimas po sutrikimo yra normalu, o trys nepavykimai iš eilės su tuo pačiu kodu rodo prisijungimo duomenis arba profilį, o ne tinklą. Būtent šis modelis daro istoriją vertą skaityti.
Pridėkite trumpą kartojimo intervalą kaip draudimą ir aiškiai pasakykite, kaip jis sąveikauja su įvykio trigeriu. Kartojimas kas minutę penkias minutes suteikia antrą bandymą, kai internetas grįžo kartu su tuneliu, o skiltyje Nustatymai, „Jei užduotis jau vykdoma, taikoma ši taisyklė“, užduotis nori „Nepaleisti naujos kopijos“, kad kartojimas nepersidengtų su dar vykstančiu rinkimu. Be to nustatymo du rasdial procesai gali varžytis dėl to paties prievado, o antrasis nepavyksta be jokios naudingos priežasties.
Įrodykite atkūrimo kelią
Sąmoningai išbandykite abi kryptis. Atjunkite ranka ir patvirtinkite, kad pakartotinis rinkimas nevyksta, tada išjunkite tinklo adapterį ir patvirtinkite, kad užduotis suveikia, kai ryšys grįžta. Šie du testai apima slopinimo taisyklę ir tikrą gedimo atvejį, ir niekas kitas to nedaro.
Po to skaitykite užduočių istoriją, o ne ryšio piktogramą. Istorija įrašo, kada užduotis vyko, kurią sąskaitą naudojo ir ką grąžino veiksmas, ir tai yra įrodymas, kurio reikia, kai ta pati mašina vėl nutrūks kitą mėnesį.