Pertahankan VPN Windows tetap hidup: picu rasdial pada peristiwa pemutusan
RasClient 20226 dan 20227 menandai pemutusan; 631 berarti ada orang yang melakukannya. Picu rasdial pada dua yang pertama, simpan satu kredensial, dan baca kode keluar.
Windows tidak menyediakan kebijakan panggil ulang untuk klien VPN-nya, jadi koneksi yang putus tengah malam masih mati saat sarapan. Tugas terjadwal yang memantau pemutusan dan menjalankan rasdial menutup celah itu tanpa klien pihak ketiga. Apakah tugas berperilaku seperti operator atau seperti perulangan bergantung pada tiga detail: peristiwa mana yang dicocokkannya, kredensial mana yang bisa dilihatnya, dan apa yang dilakukannya dengan hasilnya. Tak satu pun dari ketiganya sulit, dan melewatkan salah satunya adalah yang menghasilkan tugas yang menelepon selamanya.
Mengapa pengatur waktu adalah pemicu yang salah
Pengatur waktu menelepon menurut jadwalnya sendiri, terlepas dari apakah terowongan mati atau tidak. Itu menghasilkan percobaan yang tidak dibutuhkan siapa pun, dan percobaan selama sesi kerja dapat mengganggunya. Pemicu peristiwa hanya menyala ketika koneksi berubah status, yang lebih murah dan lebih mudah dipikirkan. Peristiwa juga membawa alasannya, dan alasan itulah yang memisahkan kegagalan jaringan dari orang yang memutuskan koneksi dengan sengaja.
Perbedaan itulah selisih antara tugas yang berguna dan tugas yang bergulat dengan pengguna setiap malam. Itu juga bagian yang biasanya hilang dari resep yang hanya menjelaskan tindakannya.
Pasangan peristiwa, dan yang harus ditekan
Klien Remote Access Service menulis catatan siklus hidup ke log Application di bawah penyedia RasClient. 20226 menandai koneksi yang berakhir, dan 20227 menandai percobaan yang gagal, jadi keduanya dapat membenarkan panggilan baru. Segala hal lain dalam tugas bergantung pada pencocokan kedua pengenal itu dengan tepat. Keduanya stabil selama bertahun-tahun, karena itu resep yang dibangun di atasnya masih beredar, tetapi build yang mengganti nama penyedia atau pengenalnya membuat kueri tidak mengembalikan apa pun. Jalankan ulang langkah pembuktian setelah setiap pembaruan fitur alih-alih menunggu tugas berhenti menyala.
Satu penghentian perlu dikecualikan. Kesalahan 631 berarti port diputuskan oleh pengguna, dan panggilan ulang pada saat itu bergulat dengan orang yang baru saja mengganti jaringan dengan sengaja. Letakkan pengecualian di filter pemicu, bukan di skrip, agar tugas tidak pernah mulai sama sekali. Pengecualian itu harus berlaku untuk satu id peristiwa saja, karena predikat EventData hanya cocok bila elemen yang disebutkan ada, dan klausa bersama akan diam-diam membuang setiap peristiwa dari id lainnya. Baca nama elemen dari rekaman nyata sebelum menulis filter:
Get-WinEvent -LogName Application -MaxEvents 5 -FilterXPath "*[System[Provider[@Name='RasClient'] and EventID=20226]]" | Select-Object -First 1 -ExpandProperty ToXml
XML menunjukkan nama Data yang tepat dalam rekaman itu. ErrorCode adalah ejaan yang biasa, dan rekaman yang memakai hal lain memerlukan nama itu diganti di filter di bawah.
<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>
Tempelkan itu ke filter kustom pemicu, dan buktikan sebagai kueri sebelum menjadi pemicu. XPath yang sama berjalan dari PowerShell terhadap log langsung, yang merupakan cara murah untuk melihat apa yang dicocokkannya selama riwayat tugas belum terlibat.
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
Pemicu yang diam-diam tidak mencocokkan apa pun terlihat persis seperti tugas yang berjalan dan gagal. Keduanya tampil sebagai "otomatisasi tidak berfungsi", dan tak satu pun mengatakan separuh mana yang hilang. Periksa keluaran kueri lebih dulu, karena itu memisahkan kedua kasus dalam satu langkah.
Panggilan gagal karena tidak ada yang mengetik kata sandi
Tindakan menjalankan rasdial dengan nama koneksi. Ketika profil tidak memiliki kredensial yang di-cache, panggilan langsung gagal karena tidak ada yang menjawab permintaan. Inilah alasan paling umum tugas yang dipicu dengan benar tidak melakukan apa pun yang terlihat, jadi periksa ini sebelum menyentuh pemicu. Menelepon dengan tangan dari prompt perintah memisahkan masalah kredensial dari masalah penjadwalan.
Simpan kredensial sekali di bawah akun tempat tugas akan berjalan, dan jadikan akun itu bagian dari desain. Tugas yang berjalan sebagai SYSTEM tidak dapat membaca kredensial yang di-cache oleh akun interaktif Anda, dan tugas yang berjalan sebagai orang lain juga tidak. Nama juga harus cocok persis dengan profil, termasuk prefiks domain apa pun di kolom pengguna.
rasdial
rasdial "Office VPN"
(Start-Process rasdial -ArgumentList '"Office VPN"' -Wait -PassThru -NoNewWindow).ExitCode
Perintah pertama mendaftar nama yang dikenal Windows. Yang kedua menelepon berdasarkan nama memakai kredensial yang di-cache, dan yang ketiga adalah bentuk yang seharusnya dipakai tindakan PowerShell, karena menunggu dan mengembalikan nilai yang dapat dicatat tugas.
Baca kode keluar, bukan jendelanya
Tugas yang memulai proses tanpa menunggu melaporkan sukses begitu proses itu ada. Untuk panggilan yang bisa gagal sedetik kemudian, putusan itu tidak bernilai. Menunggu kode keluar mengubah tindakan menjadi hasil nyata. Riwayat tugas sendiri hanya menunjukkan bahwa proses dimulai, tidak pernah bahwa terowongan naik.
Catat nilainya dengan stempel waktu pada setiap eksekusi. Satu kegagalan setelah pemadaman itu normal, sedangkan tiga kegagalan berturut-turut dengan kode yang sama menunjuk ke kredensial atau profil, bukan ke jaringan. Pola itulah yang membuat riwayat layak dibaca.
Tambahkan interval pengulangan singkat sebagai asuransi, dan jelaskan bagaimana ia berinteraksi dengan pemicu peristiwa. Pengulangan setiap menit selama lima menit memberi percobaan kedua ketika internet kembali bersama terowongan, dan di bagian Pengaturan, "Jika tugas sudah berjalan, aturan berikut berlaku", tugas menginginkan "Jangan mulai instans baru" agar pengulangan tidak tumpang tindih dengan panggilan yang masih berlangsung. Tanpa pengaturan itu, dua proses rasdial dapat berlomba untuk port yang sama dan yang kedua gagal tanpa alasan yang berguna.
Buktikan jalur pemulihan
Uji kedua arah dengan sengaja. Putuskan koneksi dengan tangan dan pastikan tidak ada panggilan ulang, lalu nonaktifkan adaptor jaringan dan pastikan tugas menyala ketika tautan kembali. Kedua uji itu mencakup aturan penekanan dan kasus kegagalan nyata, dan tidak ada yang lain melakukannya.
Setelah itu baca riwayat tugas, bukan ikon koneksi. Riwayat mencatat kapan tugas berjalan, akun mana yang dipakai, dan apa yang dikembalikan tindakan, dan itulah bukti yang dibutuhkan ketika mesin yang sama putus lagi bulan depan.