סקריפט שפותח את חלון ה-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, האינטראקציה הזו היא חלק מהתכנון ואי אפשר להפוך אותה לאוטומטית על ידי הדמיית הקשות. השתמשו בלקוח הנתמך למקרה הזה ותנו לשלב האנושי לקרות.

צורת הסקריפט הסופי נשארת קצרה: בדקו את הפרופיל, חייגו, קראו את הקוד, בדקו את המשאב, ואז התחילו לעבוד. כל שלב עונה על שאלה שהקודם לא יכול היה, ואף אחד מהם אינו נשען על שינה.

מאמרים קשורים