الاتصال بالـ VPN لا يعيد تشغيل سكربت تسجيل الدخول
تعمل سكربتات تسجيل الدخول عند تسجيل الدخول، لا عند ظهور النفق. افصل بدء التشغيل وتسجيل الدخول والتحديث في الخلفية، ثم أطلق العمل عند الاتصال.
يسجّل مستخدمك الدخول من المنزل، ويتصل بالـ VPN، وينتظر تعيين محرك الأقراص الذي كان يظهر من تلقاء نفسه في المكتب. يرتفع النفق، ويجيب النطاق، ولا يُعيَّن شيء. لا شيء معطّل: سكربت تسجيل الدخول يعمل عند تسجيل الدخول، والنفق الذي يُفتح بعد عشرين دقيقة من بدء الجلسة ليس تسجيل دخول. قراءة الاثنين كحدث واحد تدفع الناس إلى البحث عن عطل في الـ VPN غير موجود.
أربعة قرارات تحوّل المفاجأة إلى سير عمل سليم، وأولها ببساطة معرفة الأحداث التي يعتمد عليها السكربت.
السكربتات تعتمد على أحداث دورة حياة لا يمكن إعادتها
تُطبَّق سياسة جانب الحاسوب عند إقلاع الجهاز، وسياسة جانب المستخدم عند تسجيل شخص الدخول، بينما تعيد دورة تحديث في الخلفية تدوير الإعدادات ذاتها دون إعادة تشغيل أي شيء. تعالج تلك التحديثات ملحق السكربتات، لكنها لا تعيد تشغيل السكربتات الفردية التي تنطلق فقط عند بدء التشغيل أو الإيقاف أو تسجيل الدخول أو الخروج. لذلك قد يبلّغ gpupdate /force بالنجاح بينما التعيين ما زال غائبًا، والتحديث النظيف ليس دليلًا على أن السكربت فعل شيئًا.
إن مرجع مايكروسوفت لمعالجة نهج المجموعة يرسم هذا الخط بالضبط بين معالجة الملحق وتشغيل ما يحتويه، وهو الصفحة التي يُستشهد بها عندما يصرّ أحدهم على أن التحديث كان يجب أن يعيد تشغيل السكربت.
ولا يفشل كل سكربت أيضًا في وضع عدم الاتصال. فالسكربت الذي يقرأ مواد محلية أو مخزّنة مؤقتًا فقط ربما نجح جزئيًا، بينما السكربت الذي يلمس مشاركة يفشل بهدوء ولا يترك أثرًا واضحًا. تحقّق من مسار السكربت الفعلي وما يصل إليه قبل لوم الشبكة. ويستحق أي ادعاء بأن سكربتًا لا يعمل عند تسجيل الدخول التدقيق نفسه، لأن مهمة مجدولة أو إجراء عميل قد يقوم بالعمل حيث لا ينظر أحد.
اربط العمل بالاتصال، لا بتسجيل الدخول
تختبئ ثلاث مهام مختلفة خلف عبارة سكربت تسجيل الدخول: تعيين محرك أقراص بعد اتصال المستخدم، وتطبيق إعدادات الجهاز قبل أن يسجّل أحد الدخول، وسحب نهج محدّث. لها مواعيد نهائية مختلفة، والثانية وحدها تحتاج فعليًا إلى اتصال قبل تسجيل الدخول. اكتب المتطلب جملة تتضمن موعدًا نهائيًا، مثل: يجب أن يوجد هذا التعيين خلال دقيقة من ارتفاع النفق.
للعمل الذي يجب أن يحدث بعد الاتصال، استخدم مهمة تُطلق عند الاتصال أو إجراء الاتصال الذي يدعمه العميل. تحقّق من الحدث الذي يصدره العميل فعلًا، لأن الحدث الذي يطلقه عميل Windows VPN الأصلي لا يطلقه عميل من طرف ثالث. أما إعدادات الجهاز التي يجب أن تسبق تسجيل الدخول، فالجواب المدعوم هو نفق جهاز أو تصميم آخر قبل تسجيل الدخول، لا مهمة تنطلق عند ظهور سطح المكتب. نفّذ العمل بالهوية والجلسة اللتين تحتاجانه، لأن التعيين الذي يُنشأ بصلاحية SYSTEM يهبط في جلسة لا يراها المستخدم أبدًا.
اختبر الجاهزية قبل التصرف، وافشل بصوت عالٍ
قد يصل حدث الاتصال قبل أن يصبح DNS أو خادم الملفات قابلًا للاستخدام، لذا يجب أن تختبر المهمة ما تحتاجه بدلًا من الافتراض. حلّل الاسم المحدد، وجرّب الاتصال المحدد، وأعد المحاولة بحدّ وزمن تأخير: Resolve-DnsName files.corp.example داخل حلقة قصيرة يفصل «ليس بعد» عن «أبدًا». أبلِغ عن فشل ملموس بعد آخر محاولة، مع الاسم والخطأ فيه.
الحلقة اللانهائية بلا سجل لا يمكن تمييزها عن مهمة لم تبدأ قط، وهي تخفي الفرق بين بيانات اعتماد قديمة وقاعدة جدار حماية.
تحقّق من أربعة أمور، ثم اجعلها قابلة للتكرار
أثناء التجربة، سجّل أربع ملاحظات بدلًا من واحدة: حدث الاتصال وقع، والمهمة بدأت، والمورد أجاب، والتغيير المطلوب وصل فعلًا. إذا توقف السجل عند «بدأت المهمة»، يبقى الفشل الحقيقي غير مرئي مهما انتظرت. ثم نفّذ gpresult /scope user /v لترى ما تعتقده الجلسة سياستها، وقارن ذلك بالإعداد الذي توقعته. التقرير الذي يسرد نهج المجموعة كمطبّق لا يقول شيئًا عن تعيين.
اجعل العمل آمنًا للتكرار قبل توسيعه، لأن العميل يعيد الاتصال والمهمة تنطلق مجددًا. تحقّق من وجود التعيين أو الإعدادات قبل إنشائه، وسجّل ما وجدته. العمل المكرر بعد كل إعادة اتصال عابرة هو كيف تتحول مهمة مفيدة إلى حادثة.
حيث يكون المشغّل التلقائي غير مناسب، فإن إجراء مستخدم معتمدًا يشغّل السكربت الموقّع نفسه تصميم مشروع. فهو يجعل التوقيت صريحًا بدلًا من التظاهر بأن حدث تسجيل دخول قد وقع.