Et skript som åpner VPN-vinduet og deretter sover i ti sekunder, gjetter, og gjetningen er feil i begge retninger: det starter kopien før tunnelen er brukbar, eller det venter etter at arbeidet kunne ha begynt. Ingen av utfallene forteller deg om autentiseringen er ferdig. Bruk resultatet fra selve kommandoen, og spør så tjenesten om noe den faktisk kan svare på. Rekkefølgen på de to trinnene er hele designet.

Hva kommandoen faktisk rapporterer

For en innebygd Windows-profil som det installerte kommandolinjeverktøyet forstår, ringer rasdial.exe opp en navngitt oppføring og returnerer en utgangskode for prosessen. Den koden beskriver oppringingsforsøket: null betyr at tilkoblingen ble opprettet for den profilen, og ikke-null betyr at den feilet på et trinn som koden identifiserer. Les det som resultatet av ett lag, ikke av jobben.

Resultatet sier ingenting om adressetildeling, privat DNS, lagt til ruter eller tillatelsen til å nå en bestemt server. Alt dette skjer etter en vellykket oppringing, og hvilket som helst av dem kan fortsatt være galt. Det gapet er grunnen til at et tilkoblet ikon og en mislykket kopi så ofte lever side om side.

Fang resultatet før noe annet kjører

Begynn med å bekrefte at profilen finnes for kontoen som skal kjøre jobben, ikke bare for kontoen du tester med:

Get-VpnConnection -Name "Contoso-Office"
Get-VpnConnection -Name "Contoso-Office" -AllUserConnection

Ring så opp og les koden umiddelbart. PowerShell beholder det opprinnelige resultatet i $LASTEXITCODE bare til den neste eksterne kommandoen kjører, så en tilfeldig ping mellom oppringingen og kontrollen ødelegger verdien du skulle lese. Tilordne den til din egen variabel først, og bestem deretter hva du skal gjøre.

& rasdial.exe "Contoso-Office"
$dial = $LASTEXITCODE
if ($dial -ne 0) { throw "rasdial failed with $dial" }

Logg koden sammen med den ikke-hemmelige feilteksten, fordi en manglende oppføring, en avvist påloggingsinformasjon og en tidsavbrudd krever ulike svar. Tabellen kobler de vanlige resultatene til neste handling.

ResultWhat it indicatesNext step
0The dial completedProbe the resource, do not start writing yet
691The credential or authentication method was rejectedFix the account or method, do not retry in a loop
623The named entry was not foundFix the profile name or its scope
Other non-zeroTransport, timeout or adapter failureRead the message, then check the path

Klarhet er ressursen, ikke tunnelen

Når oppringingen lykkes, test det jobben trenger. En delt mappe, et API-endepunkt eller en databaseport er en bedre klarhetstest enn et offentlig nettsted, fordi et offentlig nettsted svarer via hvilken som helst fungerende vei og ikke beviser noe om den private. Velg testen som applikasjonen selv er avhengig av. En vellykket TCP-tilkobling forteller at ruting og filtrering er åpne, og det er det meste av det den første skrivingen trenger:

Test-NetConnection -ComputerName files.contoso.example -Port 445

Begrens forsøkene og registrer hvilket trinn som feilet. Avvist påloggingsinformasjon bør stoppe skriptet i stedet for å mate en ny forsøksløkke; et DNS-navn som ennå ikke har dukket opp fortjener noen korte nye forsøk; en port som aldri åpnes er et ruting- eller policyproblem over klienten.

Der tilkoblingen allerede fantes før jobben startet, la den være. Å koble fra en økt du ikke åpnet, avbryter brukerens andre arbeid, så registrer hvem som eier økten og hvilken nedkobling som er riktig.

Begrens profilen til kontoen som kjører jobben

En planlagt oppgave kjører under sin egen identitet og økt, og en profil som fungerer på skrivebordet ditt kan være usynlig der. Kjør synlighetskontrollen og oppringingen på nytt under oppgavens konto før du stoler på planen. Hold passordet unna kommandolinjen også: argumenter er synlige for andre prosesser og havner ofte i logger.

Hvis utrullingen krever en nettleserforespørsel, et smartkort-trykk eller en MFA-godkjenning, er den interaksjonen en del av designet og kan ikke automatiseres bort ved å simulere tastetrykk. Bruk den støttede klienten for det tilfellet og la det menneskelige trinnet skje.

Formen på det endelige skriptet forblir kort: sjekk profilen, ring opp, les koden, test ressursen, og start så arbeidet. Hvert trinn svarer på et spørsmål det forrige ikke kunne, og ingen av dem er avhengige av en pause.

Relaterte artikler