Houd een Windows-VPN actief: activeer rasdial op de verbrekingsgebeurtenis
RasClient 20226 en 20227 markeren een onderbreking; 631 betekent dat een mens het deed. Activeer rasdial op de eerste twee, bewaar één inloggegeven en lees de exitcode.
Windows biedt geen heraanbelbeleid voor zijn VPN-client, dus een verbinding die om middernacht wegvalt, is bij het ontbijt nog steeds weg. Een geplande taak die de onderbreking volgt en rasdial uitvoert, dicht die kloof zonder client van derden. Of de taak zich als een operator of als een lus gedraagt, komt neer op drie details: welke gebeurtenissen ze koppelt, welke inloggegevens ze kan zien en wat ze met het resultaat doet. Geen van de drie is moeilijk, en het ontbreken van een van de drie levert een taak op die voor altijd belt.
Waarom een timer de verkeerde trigger is
Een timer belt volgens zijn eigen schema, of de tunnel nu weg is of niet. Dat levert pogingen op die niemand nodig had, en een poging tijdens een werksessie kan die onderbreken. Een gebeurtenistrigger vuurt alleen wanneer de verbinding van status verandert, wat goedkoper is en makkelijker te beredeneren. De gebeurtenis draagt ook de reden, en de reden is wat een netwerkstoring scheidt van iemand die bewust de verbinding verbreekt.
Dat onderscheid is het verschil tussen een nuttige taak en een die elke avond met de gebruiker vecht. Het is ook het deel dat meestal ontbreekt in recepten die alleen de actie beschrijven.
Het gebeurtenispaar, en degene die onderdrukt moet worden
De Remote Access Service-client schrijft levenscyclusrecords naar het Application-log onder de provider RasClient. 20226 markeert een verbinding die eindigde, en 20227 markeert een poging die mislukte, dus beide kunnen een nieuwe bel rechtvaardigen. Al het overige in de taak hangt af van het exact koppelen van die twee id's. Ze zijn al jaren stabiel, daarom circuleren recepten die erop zijn gebouwd nog steeds, maar een build die de provider of de id's hernoemt zorgt ervoor dat de query niets teruggeeft. Voer de bewijsstap opnieuw uit na elke functie-update in plaats van te wachten tot de taak stopt met vuren.
Eén beëindiging moet worden uitgesloten. Fout 631 betekent dat de gebruiker de poort heeft losgekoppeld, en een nieuwe bel op dat moment vecht met de persoon die net bewust van netwerk is gewisseld. Zet de uitsluiting in het filter van de trigger en niet in het script, zodat de taak helemaal niet start. Ze mag alleen voor één gebeurtenis-id gelden, omdat een EventData-predicaat alleen overeenkomt als het genoemde element bestaat, en een gedeelde clausule zou elk event van de andere id stilzwijgend laten vallen. Lees de elementnaam uit een echt record voordat u het filter schrijft:
Get-WinEvent -LogName Application -MaxEvents 5 -FilterXPath "*[System[Provider[@Name='RasClient'] and EventID=20226]]" | Select-Object -First 1 -ExpandProperty ToXml
De XML toont de exacte Data-namen in dat record. ErrorCode is de gebruikelijke spelling, en een record dat iets anders gebruikt, vereist dat die naam in het filter hieronder wordt vervangen.
<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>
Plak dat in het aangepaste filter van de trigger en bewijs het als query voordat het een trigger wordt. Dezelfde XPath draait vanuit PowerShell tegen het live log, wat de goedkope manier is om te zien waarop hij past terwijl de taakgeschiedenis nog niet betrokken is.
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
Een trigger die stilzwijgend nergens op past, ziet er precies uit als een taak die draait en faalt. Beide verschijnen als "de automatisering werkt niet", en geen van beide zegt welke helft ontbreekt. Controleer eerst de uitvoer van de query, want die scheidt de twee gevallen in één stap.
De bel mislukt omdat niemand er is om het wachtwoord te typen
De actie voert rasdial uit met de naam van de verbinding. Als het profiel geen in de cache opgeslagen inloggegevens heeft, mislukt de bel onmiddellijk omdat niemand de prompt kan beantwoorden. Dat is de meest voorkomende reden dat een correct getriggerde taak niets zichtbaars doet, dus controleer dat voordat u de trigger aanraakt. Handmatig bellen vanaf een opdrachtprompt scheidt een probleem met inloggegevens van een planningsprobleem.
Sla de inloggegevens één keer op onder het account waarmee de taak gaat draaien, en maak dat account onderdeel van het ontwerp. Een taak die als SYSTEM draait, kan geen inloggegevens lezen die door uw interactieve account in de cache zijn opgeslagen, en een taak die als iemand anders draait ook niet. De naam moet ook exact overeenkomen met het profiel, inclusief een eventueel domeinvoorvoegsel in het gebruikersveld.
rasdial
rasdial "Office VPN"
(Start-Process rasdial -ArgumentList '"Office VPN"' -Wait -PassThru -NoNewWindow).ExitCode
De eerste opdracht somt de namen op die Windows kent. De tweede belt op naam met de in de cache opgeslagen inloggegevens, en de derde is de vorm die een PowerShell-actie zou moeten gebruiken, omdat die wacht en een waarde retourneert die de taak kan vastleggen.
Lees de exitcode in plaats van het venster
Een taak die een proces start zonder te wachten, meldt succes zodra het proces bestaat. Voor een bel die een seconde later kan mislukken, is dat oordeel waardeloos. Wachten op de exitcode maakt de actie een echt resultaat. Taakgeschiedenis alleen toont alleen dat een proces is gestart, nooit dat een tunnel omhoogkwam.
Log de waarde met een tijdstempel bij elke uitvoering. Eén mislukking na een storing is normaal, terwijl drie mislukkingen op rij met dezelfde code op de inloggegevens of het profiel wijzen en niet op het netwerk. Dat patroon is wat de geschiedenis het lezen waard maakt.
Voeg een kort herhalingsinterval toe als verzekering, en wees expliciet over hoe het samenhangt met een gebeurtenistrigger. Een herhaling elke minuut gedurende vijf minuten levert de tweede poging wanneer het internet samen met de tunnel terugkwam, en onder Instellingen, "Als de taak al wordt uitgevoerd, geldt de volgende regel", wil de taak "Geen nieuw exemplaar starten", zodat een herhaling niet overlapt met een bel die nog bezig is. Zonder die instelling kunnen twee rasdial-processen om dezelfde poort strijden en mislukt de tweede zonder enige nuttige reden.
Bewijs het herstelpad
Test beide richtingen bewust. Verbreek handmatig en bevestig dat er geen nieuwe bel plaatsvindt, schakel daarna de netwerkadapter uit en bevestig dat de taak vuurt wanneer de link terugkomt. Die twee tests dekken de onderdrukkingsregel en het echte storingsgeval, en niets anders doet dat.
Lees daarna de taakgeschiedenis in plaats van het verbindingspictogram. De geschiedenis legt vast wanneer de taak liep, welk account ze gebruikte en wat de actie teruggaf, en dat is het bewijs dat nodig is wanneer dezelfde machine volgende maand weer wegvalt.