जो स्क्रिप्ट 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 अनुमोदन चाहिए, तो वह अंतःक्रिया डिज़ाइन का हिस्सा है और कीस्ट्रोक की नकल से उसे स्वचालित नहीं किया जा सकता। उस स्थिति के लिए समर्थित क्लाइंट इस्तेमाल करें और मानवीय चरण होने दें।

अंतिम स्क्रिप्ट का आकार छोटा रहता है: प्रोफ़ाइल जाँचें, डायल करें, कोड पढ़ें, संसाधन जाँचें, फिर काम शुरू करें। हर चरण उस सवाल का जवाब देता है जो पिछला नहीं दे सका, और इनमें से कोई भी नींद पर निर्भर नहीं है।

संबंधित लेख