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 이름은 짧은 재시도를 몇 번 받을 만하고, 결코 열리지 않는 포트는 클라이언트 위쪽의 라우팅이나 정책 문제다.

작업이 시작되기 전부터 연결이 있었다면 그대로 두어라. 네가 열지 않은 세션을 끊으면 사용자의 다른 작업을 중단시키므로, 세션의 소유자와 적절한 정리를 기록하라.

프로필을 작업을 실행하는 계정으로 한정하라

예약된 작업은 자신의 ID와 세션으로 돌기 때문에 데스크톱에서 작동하는 프로필이 그곳에서는 보이지 않을 수 있다. 일정을 믿기 전에 가시성 확인과 다이얼을 작업 계정으로 다시 하라. 비밀번호도 명령줄에서 멀리 두어라: 인수는 다른 프로세스에 보이고 종종 로그에 남는다.

배포에 브라우저 프롬프트, 스마트 카드 접촉, MFA 승인이 필요하다면 그 상호작용은 설계의 일부이며 키 입력을 흉내 내 자동화할 수 없다. 그 경우에는 지원되는 클라이언트를 쓰고 사람의 절차를 그대로 두어라.

최종 스크립트의 모양은 짧게 남는다: 프로필을 확인하고, 다이얼하고, 코드를 읽고, 리소스를 시험한 뒤 작업을 시작하라. 각 단계는 앞 단계가 답하지 못한 질문에 답하며, 어느 것도 잠에 의존하지 않는다.

관련 글