Windows no ofereix cap política de remarcatge per al seu client VPN, així que una connexió que cau a mitjanit continua caiguda a l’esmorzar. Una tasca programada que vigila la desconnexió i executa rasdial tanca aquesta escletxa sense un client de tercers. Que la tasca es comporti com un operador o com un bucle es redueix a tres detalls: quins esdeveniments coincideix, quina credencial pot veure i què fa amb el resultat. Cap dels tres no és difícil, i ometre’n qualsevol és el que produeix una tasca que marca per sempre.

Per què un temporitzador és el disparador equivocat

Un temporitzador marca segons el seu propi programa, tant si el túnel està caigut com si no. Això produeix intents que ningú no necessitava, i un intent durant una sessió de treball la pot interrompre. Un disparador d’esdeveniment només s’activa quan la connexió canvia d’estat, cosa que és més barata i més fàcil de raonar. L’esdeveniment també porta el motiu, i el motiu és el que separa una fallada de xarxa d’una persona que es desconnecta expressament.

Aquesta distinció és la diferència entre una tasca útil i una que es baralla amb l’usuari cada vespre. També és la part que sol faltar en les receptes que només descriuen l’acció.

La parella d’esdeveniments i el que cal suprimir

El client del servei d’accés remot escriu registres de cicle de vida al registre Application sota el proveïdor RasClient. 20226 marca una connexió que ha acabat, i 20227 marca un intent que ha fallat, així que qualsevol dels dos pot justificar una nova marcació. Tota la resta de la tasca depèn de fer coincidir aquests dos identificadors exactament. Han estat estables durant anys, i per això les receptes construïdes sobre ells encara circulen, però una compilació que canvia el nom del proveïdor o dels identificadors fa que la consulta no retorni res. Torneu a executar el pas de prova després de cada actualització de funcionalitat en lloc d’esperar que la tasca deixi de disparar-se.

Hi ha una terminació que cal excloure. L’error 631 significa que l’usuari ha desconnectat el port, i una remarcació en aquell moment es baralla amb la persona que acaba de canviar de xarxa expressament. Poseu l’exclusió al filtre del disparador i no al script, perquè la tasca no s’iniciï mai. Ha d’aplicar-se a un sol identificador d’esdeveniment, perquè un predicat EventData només coincideix quan l’element anomenat existeix, i una clàusula compartida deixaria caure silenciosament tots els esdeveniments de l’altre identificador. Llegiu el nom de l’element d’un registre real abans d’escriure el filtre:

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

L’XML mostra els noms exactes de Data en aquest registre. ErrorCode és l’ortografia habitual, i un registre que en faci servir una altra necessita que aquest nom se substitueixi al filtre de sota.

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

Enganxeu-ho al filtre personalitzat del disparador i proveu-ho com a consulta abans que es converteixi en un disparador. El mateix XPath s’executa des de PowerShell contra el registre en viu, que és la manera barata de veure amb què coincideix mentre l’historial de tasques encara no hi és.

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

Un disparador que silenciosament no coincideix amb res sembla exactament una tasca que s’executa i falla. Tots dos es presenten com «l’automatització no funciona», i cap no diu quina meitat falta. Comproveu primer la sortida de la consulta, perquè separa els dos casos en un sol pas.

La marcació falla perquè no hi ha ningú per escriure la contrasenya

L’acció executa rasdial amb el nom de la connexió. Quan el perfil no té cap credencial en memòria cau, la marcació falla immediatament perquè no hi ha ningú per respondre el missatge. Aquest és el motiu més habitual que una tasca ben disparada no faci res visible, així que comproveu-ho abans de tocar el disparador. Marcar a mà des d’un símbol del sistema separa un problema de credencials d’un problema de programació.

Deseu la credencial una vegada sota el compte amb què s’executarà la tasca, i feu que aquest compte formi part del disseny. Una tasca que s’executa com a SYSTEM no pot llegir una credencial desada pel vostre compte interactiu, i una tasca que s’executa com a algú altre tampoc. El nom també ha de coincidir exactament amb el perfil, incloent-hi qualsevol prefix de domini al camp d’usuari.

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

La primera ordre llista els noms que Windows coneix. La segona marca pel nom amb la credencial en memòria cau, i la tercera és la forma que hauria de fer servir una acció de PowerShell, perquè espera i retorna un valor que la tasca pot enregistrar.

Llegiu el codi de sortida en lloc de la finestra

Una tasca que inicia un procés sense esperar informa d’èxit tan bon punt el procés existeix. Per a una marcació que pot fallar un segon després, aquest veredicte no val res. Esperar el codi de sortida converteix l’acció en un resultat real. L’historial de tasques per si sol només mostra que un procés s’ha iniciat, mai que un túnel s’hagi aixecat.

Registreu el valor amb una marca de temps a cada execució. Una fallada única després d’una caiguda és normal, mentre que tres fallades seguides amb el mateix codi apunten a la credencial o al perfil i no a la xarxa. Aquest patró és el que fa que l’historial valgui la pena de llegir.

Afegiu un interval de repetició curt com a assegurança, i sigueu explícits sobre com interactua amb un disparador d’esdeveniment. Una repetició cada minut durant cinc minuts proporciona el segon intent quan Internet ha tornat amb el túnel, i a Configuració, «Si la tasca ja s’està executant, s’aplica la regla següent», la tasca vol «No iniciar cap instància nova» perquè una repetició no se superposi a una marcació encara en curs. Sense aquest paràmetre, dos processos rasdial poden competir pel mateix port i el segon falla sense cap motiu útil.

Proveu el camí de recuperació

Proveu les dues direccions expressament. Desconnecteu a mà i confirmeu que no es fa cap remarcació, després desactiveu l’adaptador de xarxa i confirmeu que la tasca es dispara quan torna l’enllaç. Aquestes dues proves cobreixen la regla de supressió i el cas real de fallada, i cap altra no ho fa.

Després llegiu l’historial de tasques en lloc de la icona de connexió. L’historial enregistra quan es va executar la tasca, quin compte va fer servir i què va retornar l’acció, i aquesta és l’evidència necessària quan la mateixa màquina torni a caure el mes que ve.

Articles relacionats