السكربت الذي يفتح نافذة VPN ثم ينام عشر ثوانٍ يخمّن، والتخمين خاطئ في الاتجاهين: إما يبدأ النسخ قبل أن يصبح النفق صالحًا للاستخدام، وإما ينتظر بعد أن كان العمل قد يبدأ. ولا أي من النتيجتين يخبرك هل انتهت المصادقة. استخدم نتيجة الأمر نفسه، ثم اسأل الخدمة سؤالًا تستطيع الإجابة عنه فعلًا. ترتيب هاتين الخطوتين هو التصميم كله.

ما الذي يبلغ عنه الأمر فعلًا

مع ملف تعريف Windows أصلي يفهمه أداة سطر الأوامر المثبتة، يطلب rasdial.exe مدخلًا مسمّى ويعيد رمز خروج للعملية. يصف هذا الرمز محاولة الاتصال: الصفر يعني أن الاتصال أُنشئ لذلك الملف، وغير الصفر يعني أنه فشل في مرحلة يحددها الرمز. اقرأه كنتيجة طبقة واحدة، لا نتيجة المهمة.

لا تقول النتيجة شيئًا عن إسناد العنوان، أو DNS الخاص، أو المسارات المضافة، أو إذن الوصول إلى خادم معين. كل ذلك يحدث بعد اتصال ناجح، ويمكن أن يكون أي منه خطأً رغم ذلك. هذه الفجوة هي سبب تعايش أيقونة «متصل» مع فشل النسخ في كثير من الأحيان.

سجّل النتيجة قبل أن يعمل أي شيء آخر

ابدأ بتأكيد أن الملف موجود للحساب الذي سيشغّل المهمة، لا فقط للحساب الذي تختبر به:

Get-VpnConnection -Name "Contoso-Office"
Get-VpnConnection -Name "Contoso-Office" -AllUserConnection

ثم اطلب الاتصال واقرأ الرمز فورًا. يحتفظ PowerShell بالنتيجة الأصلية في $LASTEXITCODE حتى تشغيل الأمر الخارجي التالي فقط، لذا فإن ping شاردًا بين الاتصال والفحص يدمّر القيمة التي كنت تنوي قراءتها. أسندها أولًا إلى متغيرك الخاص، ثم قرر ما ستفعل.

& rasdial.exe "Contoso-Office"
$dial = $LASTEXITCODE
if ($dial -ne 0) { throw "rasdial failed with $dial" }

سجّل الرمز مع نص الخطأ غير السري، لأن مدخلًا مفقودًا وبيانات اعتماد مرفوضة ومهلة تحتاج إلى استجابات مختلفة. يربط الجدول النتائج الشائعة بالخطوة التالية.

ResultWhat it indicatesNext step
0The dial completedProbe the resource, do not start writing yet
691The credential or authentication method was rejectedFix the account or method, do not retry in a loop
623The named entry was not foundFix the profile name or its scope
Other non-zeroTransport, timeout or adapter failureRead the message, then check the path

الجهوزية هي المورد، لا النفق

بعد نجاح الاتصال، اختبر الشيء الذي تحتاجه المهمة. مشاركة ملف أو نقطة نهاية API أو منفذ قاعدة بيانات هو اختبار جهوزية أفضل من موقع عام، لأن الموقع العام يجيب عبر أي مسار عامل ولا يثبت شيئًا عن المسار الخاص. اختر الاختبار الذي يعتمد عليه التطبيق نفسه. اتصال TCP ناجح يخبرك بأن التوجيه والتصفية مفتوحان، وهذا معظم ما تحتاجه الكتابة الأولى:

Test-NetConnection -ComputerName files.contoso.example -Port 445

حدّد عدد المحاولات وسجّل المرحلة التي فشلت. بيانات الاعتماد المرفوضة يجب أن توقف السكربت بدلًا من تغذية حلقة إعادة محاولة؛ واسم DNS لم يظهر بعد يستحق بضع إعادات محاولة قصيرة؛ والمنفذ الذي لا ينفتح أبدًا مشكلة توجيه أو سياسة فوق العميل.

حيث كان الاتصال موجودًا قبل بدء المهمة، اتركه كما هو. فصل جلسة لم تفتحها يقاطع عمل المستخدم الآخر، لذا سجّل من يملك الجلسة وما إنهاؤها المناسب.

احصر الملف في الحساب الذي يشغّل المهمة

تعمل المهمة المجدولة بهويتها وجلستها، وقد يكون الملف الذي يعمل على سطح مكتبك غير مرئي هناك. أعد فحص الرؤية والاتصال تحت حساب المهمة قبل الوثوق بالجدولة. أبقِ كلمة المرور بعيدًا عن سطر الأوامر أيضًا: الوسائط مرئية لعمليات أخرى وغالبًا ما تنتهي في السجلات.

إذا كانت عملية النشر تتطلب مطالبة في المتصفح أو لمسة بطاقة ذكية أو موافقة MFA، فإن هذا التفاعل جزء من التصميم ولا يمكن أتمتته عبر محاكاة ضغطات المفاتيح. استخدم العميل المدعوم لتلك الحالة ودع الخطوة البشرية تحدث.

يبقى شكل السكربت النهائي قصيرًا: تحقق من الملف، اطلب الاتصال، اقرأ الرمز، اختبر المورد، ثم ابدأ العمل. كل خطوة تجيب عن سؤال لم تستطع السابقة الإجابة عنه، ولا تعتمد أي منها على نوم.

مقالات ذات صلة