למפות כונן לפני שה-VPN מוכן? תלו את זה בשרת
סקריפט התחברות ממפה את השיתוף לפני שיש למנהרה נתיב. בדקו שרת אחד שעונה רק דרכו, ואז מפו בהפעלה של המשתמש ותעדו את התוצאה.
אות הכונן מופיע בהתחברות ואז נפתח כתיקייה ריקה, או עם צלב אדום והודעה על משאב רשת שאינו זמין. ההרשאות בדרך כלל תקינות. מה שקרה הוא שפקודת המיפוי רצה בחלון הזמן שבו לקוח ה-VPN היה קיים אבל לא היה נתיב לשרת הקבצים, ו-Windows רשם את הכישלון הזה כמצבו של הכונן. הפתרון הוא להפסיק להתייחס למיפוי כאל משהו שקורה בהתחברות ולהתייחס אליו כאל השלב האחרון ברצף חיבור.
למה המיפוי רץ מוקדם מדי
סקריפט התחברות מתחיל כשההפעלה מתחילה. לקוח VPN שמתחבר בזמן ההתחברות מוסיף קו זמן משלו מעל זה: התהליך יכול לרוץ, המתאם הווירטואלי יכול להתקיים, והנתיב לתת־הרשת של המשרד יכול עדיין להיות חסר. שלושת המצבים האלה נראים זהים מנקודת המבט של סקריפט ורק אחד מהם עובד.
יש סביבות שמגיבות בחזרה על אותה שורה כושלת בכל התחברות, מה שיוצר משתמש שלמד ללחוץ פעמיים על הכונן וסקריפט שמעולם לא הצליח בעצמו.
הכונן עצמו מחמיר את המצב. כונן ממופה הוא אובייקט של הפעלה, וברגע ש-Windows סימן אותו כלא זמין, הסמל יכול להישאר שבור הרבה אחרי שהמנהרה בריאה. לכן מיפוי מחדש ביד עובד בעוד הסקריפט נראה כאילו אינו עושה דבר. ההפעלה זוכרת את הכישלון, לא את הכוונה שמאחוריו.
מצב מחובר אינו נתיב
סמל ה-VPN במגש המערכת מדווח אם המנהרה למעלה. הוא לא אומר דבר על כך אם קיים נתיב לשרת מסוים, אם DNS ממיר את השם הזה לכתובת המנהרה, או אם חומת האש של השרת עצמו מקבלת אתכם.
אלה שלושה כשלים נפרדים עם אותה תוצאה נראית לעין, והסתמכות על סמל המגש מאחדת אותם לאות אחד לא אמין.
בדיקת מוכנות שמציינת בשם את השרת שבאמת דרוש לכם מבדילה ביניהם, כי היא נכשלת עד שהנתיב הספציפי עובד, ולא עד שממשק כלשהו מדווח על עצמו כמחובר.
תלו את זה בשרת, לא בלקוח
בחרו מארח אחד שנגיש רק דרך המנהרה והמתינו לו לפני שתמפו משהו. הקטע שלמטה מחבר רשומת VPN שמורה של Windows, בודק את שרת הקבצים ואז ממפה את הכונן.
@echo off
set server=fileserver.corp.example
rasdial "Office VPN" /disconnect
rasdial "Office VPN"
:wait
ping -n 1 -w 1000 %server% >nul || (
timeout /t 5 /nobreak >nul
goto wait
)
net use Z: \\%server%\share /persistent:no
פינג הוא בדיקת מוכנות, לא בדיקת הרשאות. אם ICMP מסונן ברשת שלכם, בדקו במקום זאת את השירות שבו אתם באמת משתמשים: net view \\%server% לבדיקה מהירה, או בדיקת TCP קצרה מול פורט 445 ב-PowerShell. כל אחת מהן תולה את הדבר בחשוב.
הוסיפו מספר מוגבל של ניסיונות. לולאת המתנה בלי תקרה הופכת מנהרה שבורה להפעלה שלעולם לא מסיימת להתחבר, וזו קריאת תמיכה גרועה יותר מאות כונן חסר.
הפכו אותו להרצה חוזרת ומודע להפעלה
הריצו אותו בתוך ההפעלה של המשתמש עצמו. משימה שרצה כ-SYSTEM מציבה את הכונן בהפעלה אחרת לגמרי, והמשתמש המחובר לא רואה את התוצאה לעולם. כך אתם מקבלים סקריפט שמדווח על הצלחה ושולחן עבודה בלי כונן.
בדקו לפני המיפוי והסירו רק את הרשומה הישנה. net use Z: /delete מחזיר שגיאה כשהאות אינה בשימוש, ובטוח להתעלם מהשגיאה הזו ולא להפוך אותה לסיבה לנטוש את שאר הסקריפט. שמרו על /persistent:no כדי שניסיון כושל לא יהפוך מאוחר יותר לניסיון התחברות מחדש קבוע.
ואל תשימו סיסמה בקובץ. rasdial יכול לעשות שימוש חוזר בפרטי הזדהות שנשמרו עבור רשומת ה-VPN, והשיתוף אמור להזדהות כמשתמש המחובר. אם השיתוף באמת זקוק לפרטי הזדהות אחרים, רשמו אותם פעם אחת לכל משתמש בעזרת cmdkey במקום להטביע אותם בקובץ batch שיושב על שיתוף התחברות. כל מי שיכול לקרוא את השיתוף הזה יכול לקרוא את הסיסמה, וזה הופך נוחות לתקרית.
הרצה חוזרת של הסקריפט כולו אמורה להיות בלתי מזיקה, כי בדיוק זה יקרה. משתמשים מתחברים מחדש, מחשבים ניידים מתעוררים, ואותו מסלול קוד רץ שוב במצב התחלתי אחר.
תעדו מספיק כדי להוכיח איזה חצי איחר
כתבו את חותמת הזמן, את תוצאת בדיקת המוכנות ואת קוד היציאה של המיפוי לקובץ תחת פרופיל המשתמש. כשיגיע הדיווח הבא על כונן חסר, היומן הזה עונה על השאלה היחידה שחשובה: האם המנהרה הגיעה באיחור, או שהשיתוף סירב?
בלי זה, כל הישנות נחקרת מאפס, והמסקנה הרגילה היא שינוי הרשאות שלא מתקן דבר.
בדקו את הרצף פעם אחת מאתחול קר ופעם אחת מהמתנה. מקרה ההתעוררות הוא המקום שבו הסדר נשבר לרוב, כי ההפעלה מתחדשת לפני הרשת והסקריפט רואה מכונה שמחוברת כבר שעות.