VPN ویندوز را روشن نگه دارید: rasdial را در رویداد قطع اتصال فعال کنید
RasClient 20226 و 20227 قطع شدن را نشان میدهند؛ 631 یعنی یک شخص این کار را کرد. rasdial را روی دو مورد اول فعال کنید، یک اعتبارنامه نگه دارید و کد خروج را بخوانید.
ویندوز هیچ سیاستی برای تماس دوباره برای کلاینت VPN خود ارائه نمیدهد، بنابراین اتصالی که نیمهشب قطع میشود، هنگام صبحانه هنوز قطع است. یک وظیفه زمانبندیشده که قطع اتصال را میپاید و rasdial را اجرا میکند، این شکاف را بدون کلاینت شخص ثالث میبندد. اینکه وظیفه مانند یک اپراتور رفتار کند یا مانند یک حلقه، به سه جزئیات بستگی دارد: کدام رویدادها را تطبیق میدهد، کدام اعتبارنامه را میبیند و با نتیجه چه میکند. هیچیک از این سه سخت نیست، و از دست دادن هر کدام از آنها همان چیزی است که وظیفهای میسازد که تا ابد تماس میگیرد.
چرا تایمر شروعکننده اشتباهی است
تایمر طبق برنامه خودش تماس میگیرد، بیآنکه مهم باشد تونل قطع است یا نه. این تلاشهایی تولید میکند که کسی به آنها نیاز نداشت، و یک تلاش در میانه یک جلسه کاری میتواند آن را مختل کند. شروعکننده رویدادی فقط وقتی فعال میشود که اتصال وضعیتش تغییر کند، که ارزانتر و راحتتر برای استدلال است. رویداد همچنین دلیل را حمل میکند، و دلیل همان چیزی است که خرابی شبکه را از کسی که عمداً قطع میکند جدا میکند.
این تمایز، تفاوت میان یک وظیفه مفید و وظیفهای است که هر شب با کاربر میجنگد. همچنین همان بخشی است که معمولاً در دستورالعملهایی که فقط عمل را توصیف میکنند غایب است.
جفت رویداد، و آن یکی که باید سرکوب شود
کلاینت سرویس دسترسی از راه دور رکوردهای چرخه عمر را زیر ارائهدهنده RasClient در گزارش Application مینویسد. 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
دستور اول نامهایی را فهرست میکند که ویندوز میشناسد. دومی با اعتبارنامه ذخیرهشده بر اساس نام تماس میگیرد، و سومی همان شکلی است که یک عمل PowerShell باید به کار ببرد، چون منتظر میماند و مقداری برمیگرداند که وظیفه میتواند ثبت کند.
کد خروج را بخوانید نه پنجره را
وظیفهای که فرایندی را بدون انتظار شروع میکند، بهمحض وجود فرایند موفقیت را گزارش میدهد. برای تماسی که ممکن است یک ثانیه بعد شکست بخورد، این حکم بیارزش است. انتظار برای کد خروج، عمل را به نتیجهای واقعی تبدیل میکند. تاریخچه وظیفه بهتنهایی فقط نشان میدهد فرایندی شروع شده، هرگز نشان نمیدهد تونلی بالا آمده است.
در هر اجرا مقدار را با مهر زمان ثبت کنید. یک شکست پس از قطعی طبیعی است، در حالی که سه شکست پیاپی با همان کد به اعتبارنامه یا پروفایل اشاره میکند نه به شبکه. همین الگو است که تاریخچه را ارزش خواندن میدهد.
یک فاصله تکرار کوتاه بهعنوان بیمه اضافه کنید، و صریح بگویید که چگونه با شروعکننده رویدادی تعامل دارد. تکرار هر دقیقه به مدت پنج دقیقه تلاش دوم را فراهم میکند وقتی اینترنت همراه با تونل برگشت، و زیر تنظیمات، «اگر وظیفه از قبل در حال اجراست، قاعده زیر اعمال میشود»، وظیفه «نمونه جدید را شروع نکن» را میخواهد تا تکرار با تماسی که هنوز در جریان است همپوشانی نکند. بدون آن تنظیم، دو فرایند rasdial میتوانند برای همان پورت رقابت کنند و دومی بدون هیچ دلیل مفیدی شکست میخورد.
مسیر بازیابی را اثبات کنید
هر دو جهت را عمداً آزمایش کنید. دستی قطع کنید و تأیید کنید که تماس دوبارهای رخ نمیدهد، سپس آداپتور شبکه را غیرفعال کنید و تأیید کنید که وظیفه وقتی پیوند برمیگردد فعال میشود. این دو آزمون قاعده سرکوب و مورد واقعی خرابی را پوشش میدهند، و هیچ چیز دیگری این کار را نمیکند.
بعد از آن تاریخچه وظیفه را بخوانید نه نماد اتصال را. تاریخچه ثبت میکند که وظیفه چه زمانی اجرا شد، از کدام حساب استفاده کرد و عمل چه برگرداند، و این همان شواهدی است که وقتی همان دستگاه ماه آینده دوباره قطع شود لازم است.