Ein Skript, das das VPN-Fenster öffnet und dann zehn Sekunden schläft, rät, und der Rateversuch ist in beide Richtungen falsch: Es beginnt mit dem Kopieren, bevor der Tunnel nutzbar ist, oder es wartet, nachdem die Arbeit schon hätte beginnen können. Keines der beiden Ergebnisse sagt, ob die Authentifizierung abgeschlossen ist. Verwenden Sie das eigene Ergebnis des Befehls und stellen Sie dem Dienst dann eine Frage, die er tatsächlich beantworten kann. Die Reihenfolge dieser beiden Schritte ist das ganze Design.

Was der Befehl tatsächlich meldet

Für ein natives Windows-Profil, das das installierte Kommandozeilenwerkzeug versteht, wählt rasdial.exe einen benannten Eintrag und gibt einen Prozess-Exitcode zurück. Dieser Code beschreibt den Einwahlversuch: Null bedeutet, dass die Verbindung für dieses Profil aufgebaut wurde, und ungleich Null bedeutet, dass er in einer Phase fehlgeschlagen ist, die der Code benennt. Lesen Sie ihn als Ergebnis einer Schicht, nicht des Jobs.

Das Ergebnis sagt nichts über Adresszuweisung, privates DNS, hinzugefügte Routen oder die Berechtigung aus, einen bestimmten Server zu erreichen. All das geschieht nach einer erfolgreichen Einwahl, und jedes davon kann immer noch falsch sein. Diese Lücke ist der Grund, warum ein Verbunden-Symbol und ein fehlgeschlagenes Kopieren so oft gemeinsam auftreten.

Ergebnis festhalten, bevor etwas anderes läuft

Bestätigen Sie zuerst, dass das Profil für das Konto existiert, das den Job ausführt, nicht nur für das Konto, mit dem Sie testen:

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

Wählen Sie dann ein und lesen Sie den Code sofort. PowerShell hält das native Ergebnis nur in $LASTEXITCODE, bis der nächste externe Befehl läuft, sodass ein versehentliches ping zwischen Einwahl und Prüfung den Wert zerstört, den Sie lesen wollten. Weisen Sie ihn zuerst Ihrer eigenen Variable zu und entscheiden Sie dann, was zu tun ist.

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

Protokollieren Sie den Code zusammen mit dem nicht geheimen Fehlertext, weil ein fehlender Eintrag, abgelehnte Anmeldeinformationen und eine Zeitüberschreitung unterschiedliche Reaktionen erfordern. Die Tabelle ordnet die üblichen Ergebnisse dem nächsten Schritt zu.

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

Bereitschaft ist die Ressource, nicht der Tunnel

Sobald die Einwahl gelingt, prüfen Sie das, was der Job braucht. Eine Freigabe, ein API-Endpunkt oder ein Datenbankport ist eine bessere Bereitschaftsprüfung als eine öffentliche Website, weil eine öffentliche Website über jeden funktionierenden Pfad antwortet und nichts über den privaten beweist. Wählen Sie die Prüfung, von der die Anwendung selbst abhängt. Eine erfolgreiche TCP-Verbindung sagt Ihnen, dass Routing und Filterung offen sind, und das ist das meiste, was der erste Schreibvorgang braucht:

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

Begrenzen Sie die Versuche und protokollieren Sie, welche Phase fehlgeschlagen ist. Abgelehnte Anmeldeinformationen sollten das Skript stoppen, statt eine Wiederholungsschleife zu speisen; ein DNS-Name, der noch nicht aufgetaucht ist, verdient ein paar kurze Wiederholungen; ein Port, der sich nie öffnet, ist ein Routing- oder Richtlinienproblem oberhalb des Clients.

Wo die Verbindung bereits vor dem Start des Jobs bestand, lassen Sie sie in Ruhe. Das Trennen einer Sitzung, die Sie nicht geöffnet haben, unterbricht die andere Arbeit des Benutzers, also halten Sie fest, wem die Sitzung gehört und welcher Abbau angemessen ist.

Profil auf das Konto beschränken, das den Job ausführt

Eine geplante Aufgabe läuft unter ihrer eigenen Identität und Sitzung, und ein Profil, das auf Ihrem Desktop funktioniert, kann dort unsichtbar sein. Wiederholen Sie die Sichtbarkeitsprüfung und die Einwahl unter dem Konto der Aufgabe, bevor Sie dem Zeitplan vertrauen. Halten Sie auch das Kennwort von der Kommandozeile fern: Argumente sind für andere Prozesse sichtbar und landen oft in Protokollen.

Wenn die Bereitstellung eine Browserabfrage, ein Smartcard-Tippen oder eine MFA-Genehmigung erfordert, ist diese Interaktion Teil des Designs und lässt sich nicht durch simuliertes Tippen automatisieren. Verwenden Sie für diesen Fall den unterstützten Client und lassen Sie den menschlichen Schritt geschehen.

Die Form des endgültigen Skripts bleibt kurz: Profil prüfen, einwählen, Code lesen, Ressource prüfen, dann mit der Arbeit beginnen. Jeder Schritt beantwortet eine Frage, die der vorige nicht konnte, und keiner davon verlässt sich auf einen Schlaf.

Ähnliche Artikel