Kekalkan VPN Windows hidup: cetuskan rasdial pada peristiwa pemutusan
RasClient 20226 dan 20227 menandakan pemutusan; 631 bermakna seseorang telah melakukannya. Cetuskan rasdial pada dua yang pertama, simpan satu bukti kelayakan, dan baca kod keluar.
Windows tidak menyediakan sebarang dasar dail semula untuk klien VPNnya, jadi sambungan yang terputus pada tengah malam masih terputus semasa sarapan. Tugasan berjadual yang memantau pemutusan dan menjalankan rasdial menutup jurang itu tanpa klien pihak ketiga. Sama ada tugasan itu bertindak seperti pengendali atau seperti gelung bergantung pada tiga butiran: peristiwa mana yang dipadankannya, bukti kelayakan mana yang dapat dilihatnya, dan apa yang dilakukannya dengan hasilnya. Tiada satu pun daripada ketiga-tiganya sukar, dan terlepas mana-mana satu daripadanya itulah yang menghasilkan tugasan yang mendail selamanya.
Mengapa pemasa ialah pencetus yang salah
Pemasa mendail mengikut jadualnya sendiri sama ada terowong terputus atau tidak. Itu menghasilkan percubaan yang tiada siapa perlukan, dan percubaan semasa sesi kerja boleh mengganggunya. Pencetus peristiwa hanya menyala apabila sambungan bertukar keadaan, yang lebih murah dan lebih mudah difikirkan. Peristiwa itu juga membawa sebab, dan sebab itulah yang memisahkan kegagalan rangkaian daripada orang yang memutuskan sambungan dengan sengaja.
Perbezaan itulah perbezaan antara tugasan yang berguna dan tugasan yang bergelut dengan pengguna setiap petang. Ia juga bahagian yang biasanya tiada dalam resipi yang hanya menerangkan tindakan.
Pasangan peristiwa, dan yang perlu ditindas
Klien Remote Access Service menulis rekod kitaran hayat ke log Application di bawah pembekal RasClient. 20226 menandakan sambungan yang tamat, dan 20227 menandakan percubaan yang gagal, jadi kedua-duanya boleh mewajarkan dail baharu. Segala-galanya dalam tugasan bergantung pada memadankan kedua-dua pengecam itu dengan tepat. Kedua-duanya stabil bertahun-tahun, sebab itulah resipi yang dibina di atasnya masih beredar, tetapi binaan yang menukar nama pembekal atau pengecam menjadikan pertanyaan tidak memulangkan apa-apa. Jalankan semula langkah bukti selepas setiap kemas kini ciri dan bukannya menunggu tugasan berhenti menyala.
Satu penamatan perlu dikecualikan. Ralat 631 bermakna port telah diputuskan oleh pengguna, dan dail semula pada saat itu bergelut dengan orang yang baru sahaja menukar rangkaian dengan sengaja. Letakkan pengecualian dalam penapis pencetus dan bukan dalam skrip, supaya tugasan tidak bermula sama sekali. Ia mesti terpakai kepada satu id peristiwa sahaja, kerana predikat EventData hanya sepadan apabila elemen yang dinamakan wujud, dan klausa dikongsi akan menggugurkan setiap peristiwa id yang satu lagi secara senyap. Baca nama elemen daripada rekod sebenar sebelum menulis penapis:
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 rekod itu. ErrorCode ialah ejaan biasa, dan rekod yang menggunakan sesuatu yang lain memerlukan nama itu diganti dalam penapis 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>
Tampal itu ke dalam penapis tersuai pencetus, dan buktikannya sebagai pertanyaan sebelum ia menjadi pencetus. XPath yang sama berjalan dari PowerShell terhadap log hidup, iaitu cara murah untuk melihat apa yang dipadankannya sementara sejarah tugasan 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
Pencetus yang senyap tidak sepadan dengan apa-apa kelihatan sama seperti tugasan yang berjalan dan gagal. Kedua-duanya muncul sebagai "automasi tidak berfungsi", dan tiada satu pun memberitahu separuh mana yang hilang. Semak keluaran pertanyaan dahulu, kerana ia memisahkan kedua-dua kes dalam satu langkah.
Dail gagal kerana tiada sesiapa untuk menaip kata laluan
Tindakan menjalankan rasdial dengan nama sambungan. Apabila profil tiada bukti kelayakan yang dicache, dail gagal serta-merta kerana tiada sesiapa untuk menjawab gesaan. Inilah sebab paling biasa tugasan yang dicetuskan dengan betul tidak melakukan apa-apa yang kelihatan, jadi semak ini sebelum menyentuh pencetus. Mendail dengan tangan dari gesaan arahan memisahkan masalah bukti kelayakan daripada masalah penjadualan.
Simpan bukti kelayakan sekali di bawah akaun yang akan menjalankan tugasan, dan jadikan akaun itu sebahagian daripada reka bentuk. Tugasan yang berjalan sebagai SYSTEM tidak boleh membaca bukti kelayakan yang dicache oleh akaun interaktif anda, dan tugasan yang berjalan sebagai orang lain juga tidak. Nama itu juga mesti sepadan dengan profil dengan tepat, termasuk sebarang awalan domain dalam medan pengguna.
rasdial
rasdial "Office VPN"
(Start-Process rasdial -ArgumentList '"Office VPN"' -Wait -PassThru -NoNewWindow).ExitCode
Arahan pertama menyenaraikan nama yang diketahui Windows. Yang kedua mendail mengikut nama menggunakan bukti kelayakan yang dicache, dan yang ketiga ialah bentuk yang patut digunakan oleh tindakan PowerShell, kerana ia menunggu dan memulangkan nilai yang boleh direkodkan oleh tugasan.
Baca kod keluar dan bukannya tetingkap
Tugasan yang memulakan proses tanpa menunggu melaporkan kejayaan sebaik sahaja proses itu wujud. Bagi dail yang boleh gagal sesaat kemudian, keputusan itu tidak bernilai. Menunggu kod keluar menjadikan tindakan itu hasil yang sebenar. Sejarah tugasan sahaja hanya menunjukkan bahawa proses bermula, tidak pernah bahawa terowong naik.
Rekod nilai itu dengan cap masa pada setiap larian. Satu kegagalan selepas gangguan adalah normal, manakala tiga kegagalan berturut-turut dengan kod yang sama menunjuk kepada bukti kelayakan atau profil dan bukan rangkaian. Corak itulah yang menjadikan sejarah itu berbaloi dibaca.
Tambah selang pengulangan yang singkat sebagai insurans, dan nyatakan dengan jelas bagaimana ia berinteraksi dengan pencetus peristiwa. Pengulangan setiap minit selama lima minit memberikan percubaan kedua apabila internet kembali bersama terowong, dan di bawah Tetapan, "Jika tugasan sudah berjalan, peraturan berikut terpakai", tugasan mahu "Jangan mulakan contoh baharu" supaya pengulangan tidak bertindih dengan dail yang masih berjalan. Tanpa tetapan itu, dua proses rasdial boleh bersaing untuk port yang sama dan yang kedua gagal tanpa sebab yang berguna.
Buktikan laluan pemulihan
Uji kedua-dua arah dengan sengaja. Putuskan sambungan dengan tangan dan sahkan tiada dail semula berlaku, kemudian lumpuhkan penyesuai rangkaian dan sahkan tugasan menyala apabila pautan kembali. Kedua-dua ujian itu meliputi peraturan penindasan dan kes kegagalan sebenar, dan tiada apa-apa lagi yang melakukannya.
Selepas itu baca sejarah tugasan dan bukannya ikon sambungan. Sejarah merekodkan bila tugasan berjalan, akaun mana yang digunakan dan apa yang dipulangkan oleh tindakan, dan itulah bukti yang diperlukan apabila mesin yang sama terputus lagi bulan depan.