Ett skript som öppnar VPN-fönstret och sedan sover i tio sekunder gissar, och gissningen är fel i båda riktningarna: det börjar kopiera innan tunneln är användbar, eller väntar efter att arbetet redan kunde ha börjat. Ingen av utfallen säger om autentiseringen är klar. Använd kommandots eget resultat och ställ sedan en fråga till tjänsten som den faktiskt kan svara på. Ordningen på de två stegen är hela designen.

Vad kommandot faktiskt rapporterar

För en inbyggd Windows-profil som det installerade kommandoradsverktyget förstår, ringer rasdial.exe upp en namngiven post och returnerar en utgångskod för processen. Den koden beskriver uppringningsförsöket: noll betyder att anslutningen upprättades för den profilen, och ett värde som inte är noll betyder att det misslyckades i ett steg som koden anger. Läs det som resultatet av ett lager, inte av hela jobbet.

Resultatet säger ingenting om adressutdelning, privat DNS, tillagda rutter eller tillståndet att nå en viss server. Allt detta sker efter en lyckad uppringning, och var och en av dem kan fortfarande vara fel. Det gapet är anledningen till att en ansluten ikon och en misslyckad kopiering så ofta samexisterar.

Fånga resultatet innan något annat körs

Börja med att bekräfta att profilen finns för kontot som ska köra jobbet, inte bara för kontot du testar med:

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

Ring sedan upp och läs koden direkt. PowerShell behåller det inbyggda resultatet i $LASTEXITCODE bara tills nästa externa kommando körs, så en vilsegången ping mellan uppringningen och kontrollen förstör det värde du tänkte läsa. Tilldela det först till din egen variabel och bestäm sedan vad du ska göra.

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

Logga koden tillsammans med den icke-hemliga feltexten, eftersom en saknad post, avvisade autentiseringsuppgifter och en tidsgräns kräver olika svar. Tabellen kopplar de vanliga resultaten till nästa åtgärd.

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

Beredskap är resursen, inte tunneln

När uppringningen lyckas, testa det jobbet behöver. En delad mapp, en API-slutpunkt eller en databasport är ett bättre beredskapsprov än en offentlig webbplats, eftersom en offentlig webbplats svarar via vilken fungerande väg som helst och inte bevisar något om den privata. Välj det prov som applikationen själv är beroende av. En lyckad TCP-anslutning säger att routning och filtrering är öppna, och det är det mesta av vad den första skrivningen behöver:

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

Begränsa försöken och registrera vilket steg som misslyckades. Avvisade autentiseringsuppgifter bör stoppa skriptet i stället för att mata en ny försöksloop; ett DNS-namn som ännu inte dykt upp förtjänar några korta nya försök; en port som aldrig öppnas är ett routnings- eller policyproblem ovanför klienten.

Där anslutningen redan fanns innan jobbet startade, lämna den ifred. Att koppla från en session du inte öppnade avbryter användarens andra arbete, så registrera vem som äger sessionen och vilken nedkoppling som är lämplig.

Begränsa profilen till kontot som kör jobbet

En schemalagd aktivitet körs under sin egen identitet och session, och en profil som fungerar på ditt skrivbord kan vara osynlig där. Kör synlighetskontrollen och uppringningen igen under aktivitetens konto innan du litar på schemat. Håll lösenordet borta från kommandoraden också: argument är synliga för andra processer och hamnar ofta i loggar.

Om utrullningen kräver en webbläsarprompt, en smartkortsduttning eller ett MFA-godkännande är den interaktionen en del av designen och kan inte automatiseras bort genom att simulera tangenttryckningar. Använd den stödda klienten för det fallet och låt det mänskliga steget ske.

Formen på det slutliga skriptet förblir kort: kontrollera profilen, ring upp, läs koden, testa resursen och börja sedan arbetet. Varje steg svarar på en fråga som det föregående inte kunde, och inget av dem bygger på en paus.

Relaterade artiklar