Windows non offre alcuna politica di richiamata per il suo client VPN, quindi una connessione che cade a mezzanotte è ancora giù a colazione. Un’attività pianificata che sorveglia la disconnessione ed esegue rasdial chiude quel vuoto senza un client di terze parti. Se l’attività si comporti come un operatore o come un ciclo dipende da tre dettagli: quali eventi confronta, quale credenziale può vedere e che cosa fa del risultato. Nessuno dei tre è difficile, e saltarne uno solo è ciò che produce un’attività che compone all’infinito.

Perché un timer è il trigger sbagliato

Un timer compone secondo il proprio orario, che il tunnel sia giù o no. Questo produce tentativi di cui nessuno aveva bisogno, e un tentativo durante una sessione di lavoro può interromperla. Un trigger di evento scatta solo quando la connessione cambia stato, il che costa meno ed è più facile da ragionare. L’evento porta anche il motivo, e il motivo è ciò che separa un guasto di rete da una persona che si disconnette di proposito.

Questa distinzione è la differenza tra un’attività utile e una che litiga con l’utente ogni sera. È anche la parte che di solito manca nelle ricette che descrivono solo l’azione.

La coppia di eventi, e quello da sopprimere

Il client del servizio di accesso remoto scrive record del ciclo di vita nel registro Application sotto il provider RasClient. 20226 segna una connessione terminata, e 20227 segna un tentativo fallito, quindi ciascuno dei due può giustificare una nuova composizione. Tutto il resto nell’attività dipende dall’abbinamento esatto di quei due identificatori. Sono stabili da anni, per questo le ricette costruite su di essi circolano ancora, ma una build che rinomina il provider o gli identificatori fa sì che la query non restituisca nulla. Rieseguite il passo di prova dopo ogni aggiornamento di funzionalità invece di aspettare che l’attività smetta di scattare.

Una terminazione va esclusa. L’errore 631 significa che l’utente ha disconnesso la porta, e una richiamata in quel momento litiga con la persona che ha appena cambiato rete di proposito. Mettete l’esclusione nel filtro del trigger invece che nello script, così l’attività non parte affatto. Deve valere per un solo ID evento, perché un predicato EventData corrisponde solo quando l’elemento denominato esiste, e una clausola condivisa scarterebbe silenziosamente ogni evento dell’altro ID. Leggete il nome dell’elemento da un record reale prima di scrivere il filtro:

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

L’XML mostra i nomi esatti di Data in quel record. ErrorCode è la grafia consueta, e un record che ne usa un’altra richiede che quel nome venga sostituito nel filtro qui sotto.

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

Incollate questo nel filtro personalizzato del trigger e provatelo come query prima che diventi un trigger. Lo stesso XPath viene eseguito da PowerShell sul registro in tempo reale, che è il modo economico per vedere a cosa corrisponde mentre la cronologia delle attività non è ancora coinvolta.

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 trigger che silenziosamente non corrisponde a nulla sembra esattamente un’attività che viene eseguita e fallisce. Entrambi si presentano come «l’automazione non funziona», e nessuno dice quale metà manchi. Controllate prima l’output della query, perché separa i due casi in un solo passo.

La composizione fallisce perché nessuno è lì a digitare la password

L’azione esegue rasdial con il nome della connessione. Quando il profilo non ha alcuna credenziale nella cache, la composizione fallisce subito perché nessuno può rispondere al prompt. È il motivo più comune per cui un’attività attivata correttamente non fa nulla di visibile, quindi controllatelo prima di toccare il trigger. Comporre a mano da un prompt dei comandi separa un problema di credenziali da un problema di pianificazione.

Salvate la credenziale una volta sotto l’account con cui verrà eseguita l’attività, e fate di quell’account parte del progetto. Un’attività eseguita come SYSTEM non può leggere una credenziale memorizzata dal vostro account interattivo, e nemmeno un’attività eseguita come qualcun altro. Il nome deve anche corrispondere esattamente al profilo, incluso qualsiasi prefisso di dominio nel campo utente.

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

Il primo comando elenca i nomi che Windows conosce. Il secondo compone per nome usando la credenziale memorizzata, e il terzo è la forma che un’azione PowerShell dovrebbe usare, perché attende e restituisce un valore che l’attività può registrare.

Leggete il codice di uscita invece della finestra

Un’attività che avvia un processo senza attendere segnala successo appena il processo esiste. Per una composizione che può fallire un secondo dopo, quel verdetto non vale nulla. Attendere il codice di uscita trasforma l’azione in un risultato reale. La cronologia delle attività da sola mostra solo che un processo è partito, mai che un tunnel è salito.

Registrate il valore con un timestamp a ogni esecuzione. Un singolo fallimento dopo un’interruzione è normale, mentre tre fallimenti di fila con lo stesso codice indicano la credenziale o il profilo, non la rete. È quel motivo che rende la cronologia degna di essere letta.

Aggiungete un breve intervallo di ripetizione come assicurazione, e siate espliciti su come interagisce con un trigger di evento. Una ripetizione ogni minuto per cinque minuti fornisce il secondo tentativo quando internet è tornato insieme al tunnel, e in Impostazioni, «Se l’attività è già in esecuzione, si applica la regola seguente», l’attività vuole «Non avviare una nuova istanza» così che una ripetizione non si sovrapponga a una composizione ancora in corso. Senza quell’impostazione, due processi rasdial possono contendersi la stessa porta e il secondo fallisce senza alcuna ragione utile.

Dimostrate il percorso di recupero

Provate entrambe le direzioni di proposito. Disconnettere a mano e confermate che non avviene alcuna richiamata, poi disabilitate la scheda di rete e confermate che l’attività scatta quando il collegamento torna. Quei due test coprono la regola di soppressione e il caso reale di guasto, e nient’altro lo fa.

Poi leggete la cronologia delle attività invece dell’icona di connessione. La cronologia registra quando l’attività è stata eseguita, quale account ha usato e cosa ha restituito l’azione, e quella è la prova necessaria quando la stessa macchina cadrà di nuovo il mese prossimo.

Articoli correlati