로그온할 때 드라이브 문자는 나타나지만 이후 빈 폴더로 열리거나, 빨간 엑스와 네트워크 리소스를 사용할 수 없다는 메시지와 함께 열린다. 권한은 대개 문제가 없다. 실제로 일어난 일은 VPN 클라이언트는 있었지만 파일 서버로 가는 경로가 없던 시간대에 매핑 명령이 실행되었고, Windows가 그 실패를 드라이브의 상태로 기록한 것이다. 해결책은 매핑을 로그온 시 일어나는 일로 취급하지 않고 연결 순서의 마지막 단계로 취급하는 것이다.

매핑이 너무 일찍 실행되는 이유

로그인 스크립트는 세션이 시작될 때 시작된다. 로그온 중에 연결하는 VPN 클라이언트는 그 위에 자신의 시간선을 더한다. 프로세스는 실행 중일 수 있고, 가상 어댑터는 존재할 수 있으며, 사무실 서브넷으로 가는 경로는 아직 없을 수 있다. 스크립트 입장에서 이 세 상태는 똑같아 보이고 그중 하나만 동작한다.

일부 환경은 로그온할 때마다 같은 실패 줄을 반복하는 방식으로 대응하는데, 그 결과 드라이브를 두 번 클릭하는 법을 배운 사용자와 스스로는 한 번도 성공한 적 없는 스크립트가 남는다.

드라이브 자체가 상황을 악화시킨다. 매핑된 드라이브는 세션 객체이고, Windows가 사용할 수 없음으로 표시한 뒤에는 터널이 정상이 된 한참 뒤에도 아이콘이 깨진 채로 남을 수 있다. 수동으로 다시 매핑하면 되는데 스크립트는 아무것도 하지 않는 것처럼 보이는 이유가 여기에 있다. 세션은 실패를 기억하지, 그 뒤에 있던 의도를 기억하지 않는다.

연결됨 상태는 경로가 아니다

트레이의 VPN 아이콘은 터널이 올라와 있는지만 알려 준다. 특정 서버로 가는 경로가 있는지, DNS가 그 이름을 터널 주소로 확인해 주는지, 서버 자체의 방화벽이 나를 받아 주는지에 대해서는 아무 말도 하지 않는다.

이것은 겉으로 보이는 결과가 같은 세 가지 별개의 실패이며, 트레이 아이콘을 기준으로 삼으면 이들이 하나의 믿을 수 없는 신호로 뭉개진다.

정말로 필요한 서버를 지목하는 준비 상태 확인이라면 이들을 구분할 수 있다. 특정 경로가 동작할 때까지 실패하고, 어느 인터페이스가 스스로 연결되었다고 보고할 때 성공하는 것이 아니기 때문이다.

클라이언트가 아니라 서버를 기준으로 삼으세요

터널을 통해서만 닿을 수 있는 호스트를 하나 고르고, 무엇이든 매핑하기 전에 그것을 기다린다. 아래 조각은 저장된 Windows VPN 항목에 연결하고, 파일 서버를 폴링한 다음 드라이브를 매핑한다.

@echo off
set server=fileserver.corp.example
rasdial "Office VPN" /disconnect
rasdial "Office VPN"
:wait
ping -n 1 -w 1000 %server% >nul || (
  timeout /t 5 /nobreak >nul
  goto wait
)
net use Z: \\%server%\share /persistent:no

ping은 준비 상태 확인이지 권한 테스트가 아니다. 네트워크에서 ICMP가 필터링된다면 대신 실제로 사용하는 서비스를 확인하라. 빠른 확인이면 net view \\%server%, PowerShell에서 포트 445로 짧은 TCP 테스트를 해도 된다. 둘 중 어느 쪽이든 중요한 것을 기준으로 삼는다.

시도 횟수에 상한을 두세요. 상한 없는 대기 루프는 망가진 터널을 로그온이 끝나지 않는 세션으로 바꾸고, 그것은 드라이브 문자가 없는 것보다 더 나쁜 지원 요청이다.

다시 실행할 수 있고 세션을 인식하도록 만드세요

사용자 자신의 세션 안에서 실행하라. SYSTEM으로 실행되는 작업은 드라이브를 전혀 다른 세션에 두고, 로그온한 사용자는 결과를 절대 보지 못한다. 그러면 성공을 보고하는 스크립트와 드라이브가 없는 데스크톱이 남는다.

매핑하기 전에 확인하고 오래된 항목만 제거하세요. 문자를 쓰지 않을 때 net use Z: /delete는 오류를 돌려주는데, 그 오류는 무시해도 안전하며 스크립트의 나머지를 포기할 이유가 되지 않는다. /persistent:no를 유지해 실패한 시도가 나중에 영구적인 재연결 시도로 바뀌지 않게 하라.

그리고 파일에 암호를 넣지 마세요. rasdial는 VPN 항목에 저장된 자격 증명을 재사용할 수 있고, 공유는 로그온한 사용자로 인증되어야 한다. 공유에 정말 다른 자격 증명이 필요하다면 로그온 공유에 있는 배치 파일에 심는 대신 cmdkey로 사용자마다 한 번 등록하라. 그 공유를 읽을 수 있는 사람은 암호도 읽을 수 있고, 그것은 편의를 사고로 바꾼다.

스크립트 전체를 다시 실행해도 무해해야 한다. 실제로 그렇게 될 것이기 때문이다. 사용자는 다시 연결하고, 노트북은 잠에서 깨고, 같은 코드 경로가 다른 초기 상태로 다시 실행된다.

어느 쪽이 늦었는지 증명할 만큼 기록하세요

타임스탬프, 준비 상태 확인 결과, 매핑의 종료 코드를 사용자 프로필 아래 파일에 기록하라. 다음에 드라이브가 없다는 보고가 오면 그 로그가 유일하게 중요한 질문에 답한다. 터널이 늦게 도착했는가, 아니면 공유가 거부했는가.

그것이 없으면 재발할 때마다 처음부터 조사하게 되고, 흔한 결론은 아무것도 고치지 못하는 권한 변경이다.

콜드 부팅에서 한 번, 잠자기에서 한 번 이 순서를 시험하세요. 순서가 가장 자주 깨지는 경우는 깨어날 때다. 네트워크보다 세션이 먼저 재개되어 스크립트가 몇 시간 전에 로그온한 머신을 보게 되기 때문이다.

관련 글