Hoidke Windowsi VPN töös: käivitage rasdial katkestussündmusel
RasClient 20226 ja 20227 tähistavad katkestust; 631 tähendab, et inimene tegi seda. Käivitage rasdial kahel esimesel, hoidke üht volitust ja lugege väljumiskoodi.
Windows ei paku oma VPN-kliendile ühtegi uuesti valimise poliitikat, seega keskööl katkev ühendus on ka hommikusöögiks maas. Plaanitud ülesanne, mis jälgib katkestust ja käivitab rasdial, sulgeb selle lünga ilma kolmanda osapoole kliendita. Kas ülesanne käitub operaatorina või tsüklina, sõltub kolmest detailist: milliseid sündmusi see sobitab, millist volitust see näha saab ja mida see tulemusega teeb. Ükski neist kolmest ei ole raske, ja nendest ühegi puudumine tekitab ülesande, mis valib igavesti.
Miks taimer on vale päästik
Taimer valib oma ajakava järgi, olenemata sellest, kas tunnel on maas või mitte. See tekitab katseid, mida kellelegi ei vajatud, ja katse tööseansi ajal võib selle katkestada. Sündmuse päästik rakendub ainult siis, kui ühendus muudab olekut, mis on odavam ja kergem mõista. Sündmus kannab ka põhjust, ja põhjus on see, mis eraldab võrgu tõrke inimesest, kes katkestab meelega.
See erinevus on vahe kasuliku ülesande ja sellise vahel, mis kakleb kasutajaga igal õhtul. See on ka osa, mis tavaliselt puudub retseptidest, mis kirjeldavad ainult tegevust.
Sündmuste paar ja see, mida tuleb alla suruda
Remote Access Service'i klient kirjutab elutsükli kirjeid Application'i logisse pakkuja RasClient all. 20226 tähistab lõppenud ühendust ja 20227 tähistab ebaõnnestunud katset, seega võib kumbki uut valimist õigustada. Kõik muu ülesandes sõltub nende kahe identifikaatori täpsest sobitamisest. Need on aastaid stabiilsed olnud, mistõttu nendele ehitatud retseptid ringlevad endiselt, kuid ehitus, mis nimetab pakkuja või ID-d ümber, muudab päringu tühjaks. Korda tõestussammu pärast iga funktsiooni uuendust, selle asemel et oodata, kuni ülesanne lakkab käivitumast.
Üks lõpetamine tuleb välja jätta. Viga 631 tähendab, et kasutaja katkestas pordi, ja uuesti valimine sel hetkel kakleb inimesega, kes just meelega võrku vahetas. Pane välistus päästiku filtrisse, mitte skripti, et ülesanne üldse ei algaks. See peab kehtima ainult ühe sündmuse ID kohta, sest EventData predikaat sobib ainult siis, kui nimetatud element on olemas, ja jagatud klausel jätaks vaikselt välja iga teise ID sündmuse. Loe elemendi nimi tegelikust kirjest enne filtri kirjutamist:
Get-WinEvent -LogName Application -MaxEvents 5 -FilterXPath "*[System[Provider[@Name='RasClient'] and EventID=20226]]" | Select-Object -First 1 -ExpandProperty ToXml
XML näitab selle kirje täpseid Data nimesid. ErrorCode on tavaline kirjaviis ja kirje, mis kasutab midagi muud, vajab selle nime asendamist allolevas filtris.
<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>
Kleebi see päästiku kohandatud filtrisse ja tõesta seda päringuna enne, kui sellest saab päästik. Sama XPath jookseb PowerShellist reaalajas logi vastu, mis on odav viis näha, millega see sobib, kuni ülesande ajalugu pole veel kaasatud.
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
Päästik, mis vaikselt mitte millegagi ei sobitu, näeb välja täpselt nagu ülesanne, mis jookseb ja ebaõnnestub. Mõlemad esinevad kui „automatiseerimine ei tööta“, ja kumbki ei ütle, milline pool puudub. Kontrolli kõigepealt päringu väljundit, sest see eraldab kaks juhtumit ühe sammuga.
Valimine ebaõnnestub, sest parooli trükkimiseks pole kedagi
Toiming käivitab rasdial ühenduse nimega. Kui profiilil pole vahemällu salvestatud volitust, ebaõnnestub valimine kohe, sest viipale vastata pole kedagi. See on kõige tavalisem põhjus, miks korrektselt käivitatud ülesanne ei tee midagi nähtavat, seega kontrolli seda enne päästiku puudutamist. Käsitsi valimine käsurealt eraldab volituse probleemi ajastamise probleemist.
Salvesta volitus üks kord selle konto alla, millega ülesanne jookseb, ja tee sellest kontost disaini osa. SYSTEMina jooksev ülesanne ei saa lugeda sinu interaktiivse konto vahemällu salvestatud volitust, ja teise isikuna jooksev ülesanne samuti mitte. Nimi peab samuti profiiliga täpselt sobima, sealhulgas kasutajaväljas olev domeeni eesliide.
rasdial
rasdial "Office VPN"
(Start-Process rasdial -ArgumentList '"Office VPN"' -Wait -PassThru -NoNewWindow).ExitCode
Esimene käsk loetleb nimed, mida Windows teab. Teine valib nime järgi vahemällu salvestatud volitust kasutades ja kolmas on vorm, mida PowerShell toiming peaks kasutama, sest see ootab ja tagastab väärtuse, mille ülesanne saab kirja panna.
Loe väljumiskoodi, mitte akent
Ülesanne, mis käivitab protsessi ootamata, teatab õnnestumisest niipea, kui protsess on olemas. Valimise puhul, mis võib sekund hiljem ebaõnnestuda, on see otsus väärtusetu. Väljumiskoodi ootamine muudab toimingu tõeliseks tulemuseks. Ülesande ajalugu üksi näitab ainult, et protsess algas, mitte kunagi, et tunnel tõusis.
Logi väärtus ajatempliga igal käivitusel. Üksik tõrge pärast katkestust on normaalne, samas kui kolm järjestikust tõrget sama koodiga viitab volitusele või profiilile, mitte võrgule. Just see muster teeb ajaloo lugemist väärib.
Lisa lühike kordusintervall kindlustuseks ja ütle selgelt, kuidas see sündmuse päästikuga koostoimib. Kordus iga minut viie minuti jooksul annab teise katse, kui internet tuli koos tunneliga tagasi, ja jaotises Seaded, „Kui ülesanne juba töötab, kehtib järgmine reegel“, tahab ülesanne „Ära alusta uut eksemplari“, et kordus ei kattuks veel käimasoleva valimisega. Ilma selle seadeta võivad kaks rasdial protsessi sama pordi pärast võistelda ja teine ebaõnnestub ilma kasuliku põhjuseta.
Tõesta taastamistee
Testi mõlemat suunda meelega. Katkesta käsitsi ja kinnita, et uut valimist ei toimu, seejärel keela võrguadapter ja kinnita, et ülesanne käivitub, kui link naaseb. Need kaks testi katavad allasurumisreegli ja tegeliku tõrkejuhtumi, ja mitte miski muu ei tee seda.
Seejärel loe ülesande ajalugu, mitte ühenduse ikooni. Ajalugu registreerib, millal ülesanne jooksis, millist kontot see kasutas ja mida toiming tagastas, ja see on tõend, mida vajatakse, kui sama masin järgmisel kuul uuesti maha kukub.