rasdial บอกว่า «เชื่อมต่อแล้ว» เครือข่ายพร้อมจริงเมื่อไร?
รหัสออก 0 หมายถึงการหมุนสายเสร็จสิ้น ไม่ใช่แชร์ไฟล์ตอบ จงจับผลลัพธ์แบบเนทีฟ แล้วทดสอบทรัพยากรที่งานพึ่งพา
สคริปต์ที่เปิดหน้าต่าง 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" }
บันทึกรหัสพร้อมข้อความข้อผิดพลาดที่ไม่เป็นความลับ เพราะ รายการที่หายไป ข้อมูลรับรองที่ถูกปฏิเสธ และการหมดเวลาต้องการการตอบสนองต่างกัน ตารางเชื่อมผลลัพธ์ทั่วไปกับขั้นตอนถัดไป
| Result | What it indicates | Next step |
|---|---|---|
| 0 | The dial completed | Probe the resource, do not start writing yet |
| 691 | The credential or authentication method was rejected | Fix the account or method, do not retry in a loop |
| 623 | The named entry was not found | Fix the profile name or its scope |
| Other non-zero | Transport, timeout or adapter failure | Read the message, then check the path |
ความพร้อมคือทรัพยากร ไม่ใช่อุโมงค์
เมื่อการหมุนสายสำเร็จ จงทดสอบสิ่งที่งานต้องการ โฟลเดอร์ที่แชร์ จุดปลาย API หรือพอร์ตฐานข้อมูลเป็นตัวทดสอบความพร้อมที่ดีกว่าเว็บไซต์สาธารณะ เพราะเว็บสาธารณะตอบผ่านเส้นทางใดก็ได้ที่ใช้งานได้ และไม่ได้พิสูจน์อะไรเกี่ยวกับเส้นทางส่วนตัว จงเลือกตัวทดสอบที่แอปพลิเคชันเองพึ่งพา การเชื่อมต่อ TCP ที่สำเร็จบอกว่าการกำหนดเส้นทางและการกรองเปิดอยู่ และนั่นคือส่วนใหญ่ของสิ่งที่การเขียนครั้งแรกต้องการ:
Test-NetConnection -ComputerName files.contoso.example -Port 445
จำกัดจำนวนครั้งและบันทึกว่าขั้นตอนใดล้มเหลว ข้อมูลรับรองที่ถูกปฏิเสธควรหยุดสคริปต์แทนที่จะป้อนลูปการลองใหม่ ชื่อ DNS ที่ยังไม่ปรากฏควรได้ลองใหม่สั้น ๆ สองสามครั้ง พอร์ตที่ไม่เคยเปิดคือปัญหาการกำหนดเส้นทางหรือนโยบายเหนือไคลเอนต์
ที่ใดการเชื่อมต่อมีอยู่แล้วก่อนงานเริ่ม จงปล่อยไว้ การตัดการเชื่อมต่อเซสชันที่คุณไม่ได้เปิดจะรบกวนงานอื่นของผู้ใช้ ดังนั้นจงบันทึกว่าเซสชันเป็นของใครและการปิดแบบใดเหมาะสม
จำกัดโปรไฟล์ให้กับบัญชีที่รันงาน
งานที่ตั้งเวลาไว้ทำงานภายใต้ตัวตนและเซสชันของตัวเอง และโปรไฟล์ที่ทำงานบนเดสก์ท็อปของคุณอาจมองไม่เห็นที่นั่น จงรันการตรวจสอบการมองเห็นและการหมุนสายอีกครั้งภายใต้บัญชีของงานก่อนเชื่อถือตารางเวลา จงเก็บรหัสผ่านให้ห่างจากบรรทัดคำสั่งด้วย เพราะอาร์กิวเมนต์มองเห็นได้โดยโปรเซสอื่นและมักไปจบในบันทึก
หากการติดตั้งต้องการพรอมต์ในเบราว์เซอร์ การแตะบัตรสมาร์ตการ์ด หรือการอนุมัติ MFA ปฏิสัมพันธ์นั้นเป็นส่วนหนึ่งของการออกแบบและไม่สามารถทำให้เป็นอัตโนมัติด้วยการจำลองการกดแป้นพิมพ์ จงใช้ไคลเอนต์ที่รองรับสำหรับกรณีนั้นและปล่อยให้ขั้นตอนของมนุษย์เกิดขึ้น
รูปร่างของสคริปต์สุดท้ายยังสั้น: ตรวจสอบโปรไฟล์ หมุนสาย อ่านรหัส ทดสอบทรัพยากร แล้วจึงเริ่มงาน แต่ละขั้นตอบคำถามที่ขั้นก่อนหน้าตอบไม่ได้ และไม่มีขั้นใดพึ่งการนอนหลับ