Manteña unha VPN de Windows activa: dispare rasdial no evento de desconexión
RasClient 20226 e 20227 marcan unha caída; 631 significa que a provocou unha persoa. Dispare rasdial nos dous primeiros, garde unha credencial e lea o código de saída.
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.