Windows VPN'i açık tutun: kopma olayında rasdial'i tetikleyin
RasClient 20226 ve 20227 bir kopmayı işaretler; 631 bunu bir insanın yaptığı anlamına gelir. İlk ikisinde rasdial'i tetikleyin, bir kimlik bilgisi saklayın ve çıkış kodunu okuyun.
Windows, VPN istemcisi için herhangi bir yeniden arama ilkesi sunmaz, bu yüzden gece yarısı düşen bir bağlantı kahvaltıda hâlâ kopmuş durumdadır. Kopmayı izleyen ve rasdial çalıştıran zamanlanmış bir görev, bu boşluğu üçüncü taraf bir istemci olmadan kapatır. Görevin bir operatör gibi mi yoksa bir döngü gibi mi davrandığı üç ayrıntıya bağlıdır: hangi olaylarla eşleştiği, hangi kimlik bilgilerini görebildiği ve sonuçla ne yaptığı. Üçünden hiçbiri zor değildir ve bunlardan herhangi birinin eksik olması, sonsuza kadar arayan bir görev üretir.
Zamanlayıcı neden yanlış tetikleyicidir
Zamanlayıcı, tünel kopuk olsun olmasın kendi programına göre arar. Bu, kimsenin ihtiyaç duymadığı denemeler üretir ve bir çalışma oturumu sırasındaki deneme onu kesebilir. Olay tetikleyicisi yalnızca bağlantı durum değiştirdiğinde ateşlenir, bu daha ucuzdur ve üzerinde düşünmesi daha kolaydır. Olay ayrıca nedeni taşır ve nedeni, bir ağ arızasını bilerek bağlantıyı kesen kişiden ayıran şeydir.
Bu ayrım, yararlı bir görev ile her akşam kullanıcıyla kavga eden bir görev arasındaki farktır. Aynı zamanda yalnızca eylemi anlatan tariflerde genellikle eksik olan parçadır.
Olay çifti ve bastırılması gereken
Remote Access Service istemcisi yaşam döngüsü kayıtlarını RasClient sağlayıcısı altında Application günlüğüne yazar. 20226 biten bir bağlantıyı, 20227 ise başarısız bir denemeyi işaretler, bu yüzden her ikisi de yeni bir aramayı haklı çıkarabilir. Görevdeki her şey bu iki tanımlayıcının tam olarak eşleşmesine bağlıdır. Yıllardır sabittirler, bu yüzden üzerlerine kurulu tarifler hâlâ dolaşımdadır, ancak sağlayıcının veya tanımlayıcıların adını değiştiren bir derleme sorgunun hiçbir şey döndürmemesine yol açar. Her özellik güncellemesinden sonra kanıt adımını yeniden çalıştırın, görevin tetiklenmeyi bırakmasını beklemek yerine.
Bir sonlandırmanın dışlanması gerekir. 631 hatası, bağlantı noktasını kullanıcının kestiği anlamına gelir ve o anda yeniden arama, ağı bilerek yeni değiştiren kişiyle kavga etmek olur. Dışlamayı betiğe değil tetikleyicinin filtresine koyun, böylece görev hiç başlamaz. Yalnızca tek bir olay kimliği için geçerli olmalıdır, çünkü EventData koşulu yalnızca adı verilen öğe varsa eşleşir ve ortak bir tümce diğer kimliğin her olayını sessizce düşürürdü. Filtreyi yazmadan önce öğe adını gerçek bir kayıttan okuyun:
Get-WinEvent -LogName Application -MaxEvents 5 -FilterXPath "*[System[Provider[@Name='RasClient'] and EventID=20226]]" | Select-Object -First 1 -ExpandProperty ToXml
XML, o kayıttaki Data adlarını tam olarak gösterir. ErrorCode olağan yazımdır ve başka bir şey kullanan bir kayıt, bu adın aşağıdaki filtrede değiştirilmesini gerektirir.
<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>
Bunu tetikleyicinin özel filtresine yapıştırın ve tetikleyici olmadan önce sorgu olarak kanıtlayın. Aynı XPath, PowerShell'den canlı günlüğe karşı çalışır; görev geçmişi henüz devrede değilken neyle eşleştiğini görmenin ucuz yolu budur.
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
Sessizce hiçbir şeyle eşleşmeyen bir tetikleyici, çalışıp başarısız olan bir görevle tamamen aynı görünür. İkisi de "otomasyon çalışmıyor" olarak görünür ve hiçbiri hangi yarının eksik olduğunu söylemez. Önce sorgunun çıktısını denetleyin, çünkü iki durumu tek adımda ayırır.
Arama başarısız olur çünkü parolayı yazacak kimse yoktur
Eylem, bağlantı adıyla rasdial çalıştırır. Profilde önbelleğe alınmış kimlik bilgisi yoksa arama hemen başarısız olur çünkü istemi yanıtlayacak kimse yoktur. Doğru tetiklenen bir görevin görünür hiçbir şey yapmamasının en yaygın nedeni budur, bu yüzden tetikleyiciye dokunmadan önce bunu denetleyin. Komut isteminden elle arama, kimlik bilgisi sorununu zamanlama sorunundan ayırır.
Kimlik bilgisini bir kez görevin çalışacağı hesap altında kaydedin ve o hesabı tasarımın parçası yapın. SYSTEM olarak çalışan bir görev, etkileşimli hesabınızın önbelleğe aldığı kimlik bilgisini okuyamaz ve başka biri olarak çalışan bir görev de okuyamaz. Ad ayrıca kullanıcı alanındaki etki alanı öneki dahil profille tam olarak eşleşmelidir.
rasdial
rasdial "Office VPN"
(Start-Process rasdial -ArgumentList '"Office VPN"' -Wait -PassThru -NoNewWindow).ExitCode
İlk komut Windows'un bildiği adları listeler. İkincisi önbelleğe alınmış kimlik bilgisiyle ada göre arar ve üçüncüsü bir PowerShell eyleminin kullanması gereken biçimdir, çünkü bekler ve görevin kaydedebileceği bir değer döndürür.
Pencere yerine çıkış kodunu okuyun
Bir süreci beklemeden başlatan görev, süreç var olur olmaz başarı bildirir. Bir saniye sonra başarısız olabilecek bir arama için bu hük değersizdir. Çıkış kodunu beklemek eylemi gerçek bir sonuca dönüştürür. Görev geçmişi tek başına yalnızca bir sürecin başladığını gösterir, asla bir tünelin kalktığını göstermez.
Her çalıştırmada değeri zaman damgasıyla günlüğe yazın. Bir kesintiden sonraki tek başarısızlık normaldir, oysa aynı kodla art arda üç başarısızlık ağa değil kimlik bilgisine veya profile işaret eder. Geçmişi okumaya değer kılan tam olarak bu desendir.
Sigorta olarak kısa bir yineleme aralığı ekleyin ve bir olay tetikleyicisiyle nasıl etkileştiğini açıkça söyleyin. Beş dakika boyunca her dakika yineleme, internet tünelle birlikte geri geldiğinde ikinci denemeyi sağlar ve Ayarlar altında, "Görev zaten çalışıyorsa şu kural geçerlidir", görev "Yeni bir örnek başlatma" ister, böylece bir yineleme hâlâ süren bir aramayla çakışmaz. Bu ayar olmadan iki rasdial süreci aynı bağlantı noktası için yarışabilir ve ikincisi yararlı bir neden olmadan başarısız olur.
Kurtarma yolunu kanıtlayın
Her iki yönü bilerek test edin. Elle bağlantıyı kesin ve yeniden arama olmadığını doğrulayın, ardından ağ bağdaştırıcısını devre dışı bırakın ve bağlantı geri geldiğinde görevin tetiklendiğini doğrulayın. Bu iki test bastırma kuralını ve gerçek arıza durumunu kapsar ve başka hiçbir şey bunu yapmaz.
Sonra bağlantı simgesi yerine görev geçmişini okuyun. Geçmiş, görevin ne zaman çalıştığını, hangi hesabı kullandığını ve eylemin ne döndürdüğünü kaydeder ve aynı makine gelecek ay yeniden düştüğünde gereken kanıt budur.