Τα Windows δεν παρέχουν πολιτική επανάκλησης για τον πελάτη VPN τους, οπότε μια σύνδεση που πέφτει τα μεσάνυχτα είναι ακόμη κάτω στο πρωινό. Μια προγραμματισμένη εργασία που παρακολουθεί την αποσύνδεση και εκτελεί rasdial κλείνει αυτό το κενό χωρίς πελάτη τρίτου μέρους. Το αν η εργασία συμπεριφέρεται σαν χειριστής ή σαν βρόχος εξαρτάται από τρεις λεπτομέρειες: ποια συμβάντα αντιστοιχίζει, ποια διαπιστευτήρια βλέπει και τι κάνει με το αποτέλεσμα. Κανένα από τα τρία δεν είναι δύσκολο, και η παράλειψη οποιουδήποτε από αυτά είναι αυτό που παράγει μια εργασία που καλεί για πάντα.

Γιατί ένα χρονόμετρο είναι το λάθος έναυσμα

Ένα χρονόμετρο καλεί με το δικό του πρόγραμμα, είτε η σήραγγα είναι κάτω είτε όχι. Αυτό παράγει προσπάθειες που κανείς δεν χρειαζόταν, και μια προσπάθεια κατά τη διάρκεια μιας συνεδρίας εργασίας μπορεί να τη διακόψει. Ένα έναυσμα συμβάντος ενεργοποιείται μόνο όταν η σύνδεση αλλάζει κατάσταση, που είναι φθηνότερο και ευκολότερο να το σκεφτεί κανείς. Το συμβάν φέρει επίσης την αιτία, και η αιτία είναι αυτό που χωρίζει μια αποτυχία δικτύου από ένα άτομο που αποσυνδέεται σκόπιμα.

Αυτή η διάκριση είναι η διαφορά ανάμεσα σε μια χρήσιμη εργασία και σε μια που παλεύει με τον χρήστη κάθε βράδυ. Είναι επίσης το μέρος που συνήθως λείπει από συνταγές που περιγράφουν μόνο τη δράση.

Το ζεύγος συμβάντων και αυτό που πρέπει να κατασταλεί

Ο πελάτης της Υπηρεσίας Απομακρυσμένης Πρόσβασης γράφει εγγραφές κύκλου ζωής στο αρχείο καταγραφής Application κάτω από τον πάροχο RasClient. Το 20226 σηματοδοτεί μια σύνδεση που έληξε, και το 20227 σηματοδοτεί μια προσπάθεια που απέτυχε, οπότε οποιοδήποτε από τα δύο μπορεί να δικαιολογήσει νέα κλήση. Όλα τα άλλα στην εργασία εξαρτώνται από την ακριβή αντιστοίχιση αυτών των δύο αναγνωριστικών. Είναι σταθερά εδώ και χρόνια, γι’ αυτό οι συνταγές που βασίζονται σε αυτά κυκλοφορούν ακόμη, αλλά μια κατασκευή που μετονομάζει τον πάροχο ή τα αναγνωριστικά κάνει το ερώτημα να μην επιστρέφει τίποτα. Επανεκτελέστε το βήμα απόδειξης μετά από κάθε ενημέρωση λειτουργίας αντί να περιμένετε να σταματήσει να ενεργοποιείται η εργασία.

Ένας τερματισμός πρέπει να εξαιρεθεί. Το σφάλμα 631 σημαίνει ότι ο χρήστης αποσύνδεσε τη θύρα, και μια νέα κλήση εκείνη τη στιγμή παλεύει με το άτομο που μόλις άλλαξε δίκτυο σκόπιμα. Βάλτε την εξαίρεση στο φίλτρο του εναύσματος και όχι στο σενάριο, ώστε η εργασία να μην ξεκινά καθόλου. Πρέπει να ισχύει για ένα μόνο αναγνωριστικό συμβάντος, επειδή ένα κατηγόρημα EventData αντιστοιχίζεται μόνο όταν υπάρχει το ονομαζόμενο στοιχείο, και μια κοινή ρήτρα θα έριχνε σιωπηλά κάθε συμβάν του άλλου αναγνωριστικού. Διαβάστε το όνομα του στοιχείου από μια πραγματική εγγραφή πριν γράψετε το φίλτρο:

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

Το XML δείχνει τα ακριβή ονόματα Data σε αυτή την εγγραφή. Το ErrorCode είναι η συνήθης γραφή, και μια εγγραφή που χρησιμοποιεί κάτι άλλο χρειάζεται αυτό το όνομα να αντικατασταθεί στο φίλτρο παρακάτω.

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

Επικολλήστε το στο προσαρμοσμένο φίλτρο του εναύσματος και αποδείξτε το ως ερώτημα πριν γίνει έναυσμα. Το ίδιο XPath εκτελείται από το PowerShell στο ζωντανό αρχείο καταγραφής, που είναι ο φθηνός τρόπος να δείτε πού αντιστοιχίζεται όσο το ιστορικό εργασιών δεν εμπλέκεται ακόμη.

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

Ένα έναυσμα που σιωπηλά δεν αντιστοιχίζεται με τίποτα μοιάζει ακριβώς με εργασία που εκτελείται και αποτυγχάνει. Και τα δύο εμφανίζονται ως «ο αυτοματισμός δεν λειτουργεί», και κανένα δεν λέει ποιο μισό λείπει. Ελέγξτε πρώτα την έξοδο του ερωτήματος, γιατί χωρίζει τις δύο περιπτώσεις σε ένα βήμα.

Η κλήση αποτυγχάνει επειδή δεν υπάρχει κανείς να πληκτρολογήσει τον κωδικό

Η ενέργεια εκτελεί rasdial με το όνομα της σύνδεσης. Όταν το προφίλ δεν έχει αποθηκευμένα διαπιστευτήρια, η κλήση αποτυγχάνει αμέσως επειδή δεν υπάρχει κανείς να απαντήσει στην προτροπή. Αυτός είναι ο πιο συνηθισμένος λόγος που μια σωστά ενεργοποιημένη εργασία δεν κάνει τίποτα ορατό, γι’ αυτό ελέγξτε το πριν αγγίξετε το έναυσμα. Η χειροκίνητη κλήση από γραμμή εντολών χωρίζει ένα πρόβλημα διαπιστευτηρίων από ένα πρόβλημα προγραμματισμού.

Αποθηκεύστε τα διαπιστευτήρια μία φορά κάτω από τον λογαριασμό με τον οποίο θα εκτελείται η εργασία, και κάντε αυτόν τον λογαριασμό μέρος του σχεδιασμού. Μια εργασία που εκτελείται ως SYSTEM δεν μπορεί να διαβάσει διαπιστευτήρια που αποθήκευσε ο διαδραστικός σας λογαριασμός, ούτε μια εργασία που εκτελείται ως κάποιος άλλος. Το όνομα πρέπει επίσης να ταιριάζει ακριβώς με το προφίλ, συμπεριλαμβανομένου οποιουδήποτε προθέματος τομέα στο πεδίο χρήστη.

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

Η πρώτη εντολή απαριθμεί τα ονόματα που γνωρίζουν τα Windows. Η δεύτερη καλεί με όνομα χρησιμοποιώντας τα αποθηκευμένα διαπιστευτήρια, και η τρίτη είναι η μορφή που πρέπει να χρησιμοποιεί μια ενέργεια PowerShell, επειδή περιμένει και επιστρέφει μια τιμή που η εργασία μπορεί να καταγράψει.

Διαβάστε τον κωδικό εξόδου αντί για το παράθυρο

Μια εργασία που ξεκινά μια διεργασία χωρίς αναμονή αναφέρει επιτυχία μόλις υπάρξει η διεργασία. Για μια κλήση που μπορεί να αποτύχει ένα δευτερόλεπτο αργότερα, αυτή η ετυμηγορία είναι άχρηστη. Η αναμονή για τον κωδικό εξόδου μετατρέπει την ενέργεια σε πραγματικό αποτέλεσμα. Το ιστορικό εργασιών από μόνο του δείχνει μόνο ότι ξεκίνησε μια διεργασία, ποτέ ότι ανέβηκε μια σήραγγα.

Καταγράψτε την τιμή με χρονική σήμανση σε κάθε εκτέλεση. Μια μεμονωμένη αποτυχία μετά από διακοπή είναι φυσιολογική, ενώ τρεις αποτυχίες στη σειρά με τον ίδιο κωδικό δείχνουν τα διαπιστευτήρια ή το προφίλ και όχι το δίκτυο. Αυτό το μοτίβο είναι που κάνει το ιστορικό άξιο ανάγνωσης.

Προσθέστε ένα σύντομο διάστημα επανάληψης ως ασφάλεια και δηλώστε ρητά πώς αλληλεπιδρά με ένα έναυσμα συμβάντος. Μια επανάληψη κάθε λεπτό για πέντε λεπτά παρέχει τη δεύτερη προσπάθεια όταν το διαδίκτυο επέστρεψε μαζί με τη σήραγγα, και στις Ρυθμίσεις, «Εάν η εργασία εκτελείται ήδη, ισχύει ο ακόλουθος κανόνας», η εργασία θέλει «Να μην ξεκινήσει νέα παρουσία», ώστε μια επανάληψη να μην επικαλύψει μια κλήση που βρίσκεται ακόμη σε εξέλιξη. Χωρίς αυτή τη ρύθμιση, δύο διεργασίες rasdial μπορούν να συναγωνιστούν για την ίδια θύρα και η δεύτερη αποτυγχάνει χωρίς χρήσιμο λόγο.

Αποδείξτε τη διαδρομή ανάκτησης

Δοκιμάστε και τις δύο κατευθύνσεις σκόπιμα. Αποσυνδεθείτε με το χέρι και επιβεβαιώστε ότι δεν γίνεται νέα κλήση, μετά απενεργοποιήστε τον προσαρμογέα δικτύου και επιβεβαιώστε ότι η εργασία ενεργοποιείται όταν επιστρέφει ο σύνδεσμος. Αυτές οι δύο δοκιμές καλύπτουν τον κανόνα καταστολής και την πραγματική περίπτωση αποτυχίας, και τίποτα άλλο δεν το κάνει.

Στη συνέχεια διαβάστε το ιστορικό εργασιών αντί για το εικονίδιο σύνδεσης. Το ιστορικό καταγράφει πότε εκτελέστηκε η εργασία, ποιον λογαριασμό χρησιμοποίησε και τι επέστρεψε η ενέργεια, και αυτή είναι η απόδειξη που χρειάζεται όταν το ίδιο μηχάνημα πέσει ξανά τον επόμενο μήνα.

Σχετικά άρθρα