สคริปต์ที่เปิดหน้าต่าง 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 ปฏิสัมพันธ์นั้นเป็นส่วนหนึ่งของการออกแบบและไม่สามารถทำให้เป็นอัตโนมัติด้วยการจำลองการกดแป้นพิมพ์ จงใช้ไคลเอนต์ที่รองรับสำหรับกรณีนั้นและปล่อยให้ขั้นตอนของมนุษย์เกิดขึ้น

รูปร่างของสคริปต์สุดท้ายยังสั้น: ตรวจสอบโปรไฟล์ หมุนสาย อ่านรหัส ทดสอบทรัพยากร แล้วจึงเริ่มงาน แต่ละขั้นตอบคำถามที่ขั้นก่อนหน้าตอบไม่ได้ และไม่มีขั้นใดพึ่งการนอนหลับ

บทความที่เกี่ยวข้อง