Windows nenabízí pro svého VPN klienta žádnou politiku opětovného vytáčení, takže spojení, které spadne o půlnoci, je i u snídaně stále přerušené. Naplánovaná úloha, která hlídá odpojení a spouští rasdial, tuto mezeru zavírá bez klienta třetí strany. Zda se úloha chová jako operátor, nebo jako smyčka, závisí na třech detailech: kterým událostem odpovídá, jaký přihlašovací údaj vidí a co dělá s výsledkem. Žádný z těch tří není těžký a právě vynechání kteréhokoli z nich vytváří úlohu, která vytáčí navěky.

Proč je časovač špatný spouštěč

Časovač vytáčí podle svého rozvrhu bez ohledu na to, zda je tunel přerušený. To vytváří pokusy, které nikdo nepotřeboval, a pokus během pracovní relace ji může přerušit. Spouštěč události se aktivuje jen tehdy, když spojení změní stav, což je levnější a snáze se o tom uvažuje. Událost také nese důvod a důvod je to, co odděluje selhání sítě od člověka, který se odpojil úmyslně.

Tento rozdíl je rozdíl mezi užitečnou úlohou a úlohou, která se každý večer pře s uživatelem. Je to také část, která obvykle chybí v receptech, jež popisují jen akci.

Dvojice událostí a ta, kterou je třeba potlačit

Klient služby Remote Access Service zapisuje záznamy životního cyklu do protokolu Application pod poskytovatelem RasClient. 20226 označuje spojení, které skončilo, a 20227 pokus, který selhal, takže obojí může ospravedlnit nové vytáčení. Vše ostatní v úloze závisí na přesné shodě těchto dvou identifikátorů. Jsou stabilní už roky, proto recepty postavené na nich stále kolují, ale sestavení, které přejmenuje poskytovatele nebo identifikátory, způsobí, že dotaz nic nevrací. Krok ověření zopakujte po každé aktualizaci funkce, místo abyste čekali, až úloha přestane spouštět.

Jedno ukončení je třeba vyloučit. Chyba 631 znamená, že port odpojil uživatel, a nové vytáčení v tu chvíli se pře s člověkem, který právě úmyslně změnil síť. Vyloučení dejte do filtru spouštěče, ne do skriptu, aby se úloha vůbec nespustila. Musí se vztahovat jen na jedno ID události, protože predikát EventData odpovídá pouze tehdy, když pojmenovaný prvek existuje, a společná klauzule by tiše zahodila každou událost druhého ID. Přečtěte si název prvku ze skutečného záznamu, než filtr napíšete:

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

XML ukazuje přesné názvy Data v tomto záznamu. ErrorCode je obvyklé hláskování a záznam, který používá něco jiného, vyžaduje nahrazení tohoto názvu ve filtru níže.

<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>

Vložte to do vlastního filtru spouštěče a prokažte to jako dotaz, než se z toho stane spouštěč. Stejný XPath běží z PowerShellu proti živému protokolu, což je levný způsob, jak vidět, čemu odpovídá, dokud historie úloh ještě není zapojená.

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

Spouštěč, který tiše neodpovídá ničemu, vypadá přesně jako úloha, která se spustí a selže. Obě se projevují jako „automatizace nefunguje“ a ani jedno neříká, která polovina chybí. Zkontrolujte nejprve výstup dotazu, protože oba případy oddělí jedním krokem.

Vytáčení selže, protože není nikdo, kdo by napsal heslo

Akce spouští rasdial s názvem připojení. Pokud profil nemá uložený přihlašovací údaj, vytáčení okamžitě selže, protože není nikdo, kdo by odpověděl na výzvu. To je nejčastější důvod, proč správně spuštěná úloha nedělá nic viditelného, proto to zkontrolujte, než se dotknete spouštěče. Ruční vytáčení z příkazového řádku odděluje problém s přihlašovacím údajem od problému s plánováním.

Uložte přihlašovací údaj jednou pod účtem, pod kterým bude úloha běžet, a udělejte z toho účtu součást návrhu. Úloha běžící jako SYSTEM nemůže přečíst údaj uložený vaším interaktivním účtem a úloha běžící jako někdo jiný také ne. Název se také musí přesně shodovat s profilem, včetně případného prefixu domény v poli uživatele.

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

První příkaz vypíše názvy, které Windows zná. Druhý vytáčí podle názvu s uloženým přihlašovacím údajem a třetí je forma, kterou by akce PowerShellu měla použít, protože čeká a vrací hodnotu, kterou může úloha zaznamenat.

Čtěte návratový kód, ne okno

Úloha, která spustí proces bez čekání, hlásí úspěch, jakmile proces existuje. Pro vytáčení, které může o sekundu později selhat, je takový verdikt bezcenný. Čekání na návratový kód promění akci ve skutečný výsledek. Historie úloh sama o sobě ukazuje jen to, že se proces spustil, nikdy to, že se tunel zvedl.

Zaznamenávejte hodnotu s časovým razítkem při každém spuštění. Jediné selhání po výpadku je normální, kdežto tři selhání za sebou se stejným kódem ukazují na přihlašovací údaj nebo profil, nikoli na síť. Právě tento vzorec dělá historii hodnou čtení.

Přidejte krátký interval opakování jako pojistku a jasně řekněte, jak se chová ve spojení se spouštěčem události. Opakování každou minutu po dobu pěti minut poskytne druhý pokus, když se internet vrátil spolu s tunelem, a v části Nastavení, „Pokud je úloha již spuštěna, platí následující pravidlo“, úloha chce „Nespouštět novou instanci“, aby se opakování nepřekrylo s vytáčením, které stále běží. Bez tohoto nastavení mohou dva procesy rasdial soupeřit o stejný port a druhý selže bez užitečného důvodu.

Prokažte cestu obnovy

Otestujte oba směry úmyslně. Odpojte se ručně a potvrďte, že k novému vytáčení nedochází, potom zakažte síťový adaptér a potvrďte, že se úloha spustí, když se odkaz vrátí. Tyto dva testy pokrývají pravidlo potlačení i skutečný případ selhání a nic jiného to nedělá.

Potom čtěte historii úloh, ne ikonu připojení. Historie zaznamenává, kdy úloha běžela, který účet použila a co akce vrátila, a to je důkaz potřebný, když stejný stroj příští měsíc znovu spadne.

Související články