Windows non ofrece ningunha política de remarcado para o seu cliente VPN, así que unha conexión que cae á medianoite segue caída no almorzo. Unha tarefa programada que vixía a desconexión e executa rasdial pecha ese oco sen un cliente de terceiros. Que a tarefa se comporte como un operador ou como un bucle redúcese a tres detalles: que eventos emparella, que credencial pode ver e que fai co resultado. Ningún dos tres é difícil, e omitir calquera deles é o que produce unha tarefa que marca para sempre.

Por que un temporizador é o desencadeante equivocado

Un temporizador marca segundo o seu propio horario, tanto se o túnel está caído como se non. Iso produce intentos que ninguén necesitaba, e un intento durante unha sesión de traballo pode interrompela. Un desencadeante de evento só se activa cando a conexión cambia de estado, o que é máis barato e máis fácil de razoar. O evento tamén leva o motivo, e o motivo é o que separa un fallo de rede dunha persoa que se desconecta a propósito.

Esa distinción é a diferenza entre unha tarefa útil e unha que loita co usuario cada noite. Tamén é a parte que adoita faltar nas receitas que só describen a acción.

O par de eventos e o que cómpre suprimir

O cliente do Servizo de acceso remoto escribe rexistros de ciclo de vida no rexistro Application baixo o provedor RasClient. 20226 marca unha conexión que rematou, e 20227 marca un intento que fallou, así que calquera dos dous pode xustificar unha nova marcación. Todo o demais na tarefa depende de emparellar eses dous identificadores exactamente. Foron estables durante anos, por iso as receitas construídas sobre eles aínda circulan, pero unha compilación que renomea o provedor ou os identificadores fai que a consulta non devolva nada. Volva executar o paso de proba despois de cada actualización de función en lugar de agardar a que a tarefa deixe de dispararse.

Cómpre excluír unha terminación. O erro 631 significa que o usuario desconectou o porto, e unha remarcación nese momento loita coa persoa que acaba de cambiar de rede a propósito. Poña a exclusión no filtro do desencadeante e non no script, para que a tarefa non arranque en absoluto. Ten que aplicarse a un só identificador de evento, porque un predicado EventData só coincide cando existe o elemento nomeado, e unha cláusula compartida descartaría en silencio todos os eventos do outro identificador. Lea o nome do elemento dun rexistro real antes de escribir o filtro:

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

O XML mostra os nomes exactos de Data nese rexistro. ErrorCode é a ortografía habitual, e un rexistro que use outra cousa necesita que ese nome se substitúa no filtro de abaixo.

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

Pegue iso no filtro personalizado do desencadeante e probéxeo como consulta antes de que se converta nun desencadeante. O mesmo XPath execútase desde PowerShell contra o rexistro en vivo, que é a forma barata de ver con que coincide mentres o historial de tarefas aínda non está implicado.

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 desencadeante que en silencio non coincide con nada parece exactamente unha tarefa que se executa e falla. Ambos se presentan como «a automatización non funciona», e ningún di que metade falta. Comprobe primeiro a saída da consulta, porque separa os dous casos nun só paso.

A marcación falla porque non hai ninguén para escribir o contrasinal

A acción executa rasdial co nome da conexión. Cando o perfil non ten ningunha credencial na caché, a marcación falla de inmediato porque non hai ninguén para responder ao aviso. É o motivo máis habitual de que unha tarefa ben desencadeada non faga nada visible, así que compróbeo antes de tocar o desencadeante. Marcar a man desde un símbolo do sistema separa un problema de credenciais dun problema de programación.

Garde a credencial unha vez baixo a conta coa que se executará a tarefa, e faga que esa conta forme parte do deseño. Unha tarefa que se executa como SYSTEM non pode ler unha credencial gardada pola súa conta interactiva, e unha tarefa que se executa como outra persoa tampouco. O nome tamén debe coincidir exactamente co perfil, incluído calquera prefixo de dominio no campo de usuario.

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

O primeiro comando enumera os nomes que Windows coñece. O segundo marca por nome coa credencial na caché, e o terceiro é a forma que debería usar unha acción de PowerShell, porque espera e devolve un valor que a tarefa pode rexistrar.

Lea o código de saída en lugar da xanela

Unha tarefa que inicia un proceso sen esperar informa de éxito en canto o proceso existe. Para unha marcación que pode fallar un segundo despois, ese veredicto non vale nada. Agardar o código de saída converte a acción nun resultado real. O historial de tarefas por si só só mostra que un proceso se iniciou, nunca que un túnel se levantou.

Rexistre o valor cunha marca de tempo en cada execución. Un fallo único despois dunha caída é normal, mentres que tres fallos seguidos co mesmo código apuntan á credencial ou ao perfil e non á rede. Ese patrón é o que fai que o historial mereza lerse.

Engada un intervalo de repetición curto como seguro, e sexa explícito sobre como interactúa cun desencadeante de evento. Unha repetición cada minuto durante cinco minutos achega o segundo intento cando internet volveu co túnel, e en Configuración, «Se a tarefa xa se está executando, aplícase a seguinte regra», a tarefa quere «Non iniciar unha instancia nova» para que unha repetición non se solape cunha marcación aínda en curso. Sen esa configuración, dous procesos rasdial poden competir polo mesmo porto e o segundo falla sen ningún motivo útil.

Demostre a ruta de recuperación

Probe as dúas direccións a propósito. Desconecte a man e confirme que non se produce ningunha remarcación, despois desactive o adaptador de rede e confirme que a tarefa se dispara cando volve a ligazón. Esas dúas probas cobren a regra de supresión e o caso real de fallo, e nada máis o fai.

Despois lea o historial de tarefas en lugar da icona de conexión. O historial rexistra cando se executou a tarefa, que conta usou e que devolveu a acción, e esa é a evidencia que fai falta cando a mesma máquina volva caer o mes que vén.

Artigos relacionados