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, това взаимодействие е част от дизайна и не може да се автоматизира чрез симулиране на натискания. Използвайте поддържания клиент за този случай и оставете човешката стъпка да се случи.
Формата на крайния скрипт остава кратка: проверете профила, наберете, прочетете кода, проверете ресурса и след това започнете работа. Всяка стъпка отговаря на въпрос, на който предишната не е могла, и никоя от тях не разчита на сън.