Windows không cung cấp chính sách gọi lại nào cho ứng dụng VPN của mình, nên một kết nối rớt lúc nửa đêm vẫn còn rớt vào bữa sáng. Một tác vụ được lên lịch theo dõi việc ngắt kết nối và chạy rasdial sẽ lấp khoảng trống đó mà không cần ứng dụng bên thứ ba. Tác vụ hành xử như người vận hành hay như một vòng lặp phụ thuộc vào ba chi tiết: nó khớp với những sự kiện nào, nó thấy được thông tin đăng nhập nào, và nó làm gì với kết quả. Không chi tiết nào trong ba khó cả, và thiếu bất kỳ chi tiết nào chính là thứ tạo ra một tác vụ quay số mãi mãi.

Vì sao bộ hẹn giờ là trình kích hoạt sai

Bộ hẹn giờ quay số theo lịch riêng của nó bất kể đường hầm có rớt hay không. Điều đó tạo ra những lần thử mà không ai cần, và một lần thử giữa phiên làm việc có thể làm gián đoạn phiên đó. Trình kích hoạt sự kiện chỉ kích hoạt khi kết nối đổi trạng thái, rẻ hơn và dễ lập luận hơn. Sự kiện cũng mang theo lý do, và chính lý do phân biệt một sự cố mạng với một người cố ý ngắt kết nối.

Sự phân biệt đó là khác biệt giữa một tác vụ hữu ích và một tác vụ đánh nhau với người dùng mỗi tối. Đó cũng là phần thường thiếu trong các công thức chỉ mô tả hành động.

Cặp sự kiện, và sự kiện cần chặn

Ứng dụng của Dịch vụ Truy cập Từ xa ghi các bản ghi vòng đời vào nhật ký Application dưới nhà cung cấp RasClient. 20226 đánh dấu một kết nối đã kết thúc, và 20227 đánh dấu một lần thử thất bại, nên cả hai đều có thể biện minh cho một lần quay số mới. Mọi thứ khác trong tác vụ phụ thuộc vào việc khớp chính xác hai mã định danh đó. Chúng đã ổn định trong nhiều năm, vì thế các công thức dựa trên chúng vẫn lưu hành, nhưng một bản dựng đổi tên nhà cung cấp hoặc các mã định danh sẽ khiến truy vấn không trả về gì. Hãy chạy lại bước chứng minh sau mỗi lần cập nhật tính năng thay vì chờ tác vụ ngừng kích hoạt.

Cần loại trừ một kiểu kết thúc. Lỗi 631 nghĩa là người dùng đã ngắt cổng, và việc quay số lại ngay lúc đó là đánh nhau với người vừa cố ý đổi mạng. Hãy đặt phần loại trừ trong bộ lọc của trình kích hoạt chứ không phải trong script, để tác vụ không hề bắt đầu. Nó phải chỉ áp dụng cho một mã sự kiện, vì vị từ EventData chỉ khớp khi phần tử được nêu tên tồn tại, và một mệnh đề dùng chung sẽ âm thầm loại bỏ mọi sự kiện của mã kia. Hãy đọc tên phần tử từ một bản ghi thật trước khi viết bộ lọc:

Get-WinEvent -LogName Application -MaxEvents 5 -FilterXPath "*[System[Provider[@Name='RasClient'] and EventID=20226]]" | Select-Object -First 1 -ExpandProperty ToXml

XML hiển thị tên chính xác của Data trong bản ghi đó. ErrorCode là cách viết thông thường, và một bản ghi dùng thứ khác cần thay tên đó trong bộ lọc bên dưới.

<QueryList><Query Id="0" Path="Application"><Select Path="Application">*[System[Provider[@Name='RasClient'] and (EventID=20226 or EventID=20227)]] and (EventData[Data[@Name='ErrorCode'] != '631'] or System[EventID=20227])</Select></Query></QueryList>

Dán nội dung đó vào bộ lọc tùy chỉnh của trình kích hoạt và chứng minh nó như một truy vấn trước khi nó thành trình kích hoạt. Cùng XPath đó chạy từ PowerShell trên nhật ký trực tiếp, đây là cách rẻ để xem nó khớp với gì trong khi lịch sử tác vụ chưa liên quan.

Get-WinEvent -LogName Application -MaxEvents 40 -FilterXPath "*[System[Provider[@Name='RasClient'] and (EventID=20226 or EventID=20227)]] and (EventData[Data[@Name='ErrorCode'] != '631'] or System[EventID=20227])" | Select-Object TimeCreated,Id,Message

Một trình kích hoạt âm thầm không khớp với gì trông giống hệt một tác vụ chạy rồi thất bại. Cả hai đều hiện ra là "tự động hóa không hoạt động", và không cái nào nói nửa nào bị thiếu. Hãy kiểm tra đầu ra của truy vấn trước, vì nó tách hai trường hợp trong một bước.

Việc quay số thất bại vì không có ai gõ mật khẩu

Hành động chạy rasdial với tên kết nối. Khi hồ sơ không có thông tin đăng nhập được lưu trong bộ nhớ đệm, việc quay số thất bại ngay vì không có ai trả lời lời nhắc. Đây là lý do phổ biến nhất khiến một tác vụ được kích hoạt đúng không làm gì nhìn thấy được, nên hãy kiểm tra điều này trước khi chạm vào trình kích hoạt. Quay số thủ công từ dấu nhắc lệnh tách vấn đề thông tin đăng nhập khỏi vấn đề lên lịch.

Hãy lưu thông tin đăng nhập một lần dưới tài khoản mà tác vụ sẽ chạy, và biến tài khoản đó thành một phần của thiết kế. Một tác vụ chạy dưới SYSTEM không thể đọc thông tin đăng nhập do tài khoản tương tác của bạn lưu trong bộ nhớ đệm, và một tác vụ chạy dưới người khác cũng không. Tên cũng phải khớp chính xác với hồ sơ, kể cả mọi tiền tố miền trong trường người dùng.

rasdial
rasdial "Office VPN"
(Start-Process rasdial -ArgumentList '"Office VPN"' -Wait -PassThru -NoNewWindow).ExitCode

Lệnh đầu tiên liệt kê những tên mà Windows biết. Lệnh thứ hai quay số theo tên bằng thông tin đăng nhập đã lưu, và lệnh thứ ba là dạng mà một hành động PowerShell nên dùng, vì nó chờ và trả về một giá trị mà tác vụ có thể ghi lại.

Đọc mã thoát thay vì cửa sổ

Một tác vụ khởi động tiến trình mà không chờ sẽ báo thành công ngay khi tiến trình tồn tại. Với một lần quay số có thể thất bại một giây sau đó, phán quyết ấy vô giá trị. Chờ mã thoát biến hành động thành kết quả thật. Riêng lịch sử tác vụ chỉ cho thấy một tiến trình đã bắt đầu, không bao giờ cho thấy một đường hầm đã lên.

Ghi lại giá trị kèm dấu thời gian ở mỗi lần chạy. Một lần thất bại sau sự cố là bình thường, trong khi ba lần thất bại liên tiếp với cùng mã chỉ vào thông tin đăng nhập hoặc hồ sơ chứ không phải mạng. Chính mẫu đó khiến lịch sử đáng đọc.

Thêm một khoảng lặp ngắn như bảo hiểm, và nói rõ nó tương tác thế nào với trình kích hoạt sự kiện. Lặp mỗi phút trong năm phút cung cấp lần thử thứ hai khi internet trở lại cùng với đường hầm, và trong Cài đặt, "Nếu tác vụ đang chạy, quy tắc sau sẽ áp dụng", tác vụ muốn "Không khởi động phiên bản mới" để một lần lặp không chồng lên lần quay số vẫn đang diễn ra. Không có thiết lập đó, hai tiến trình rasdial có thể tranh nhau cùng một cổng và cái thứ hai thất bại mà không có lý do hữu ích nào.

Chứng minh đường phục hồi

Hãy thử cả hai chiều một cách có chủ đích. Ngắt kết nối bằng tay và xác nhận không có lần quay số lại nào, sau đó tắt bộ điều hợp mạng và xác nhận tác vụ kích hoạt khi đường liên kết trở lại. Hai phép thử đó bao phủ quy tắc chặn và trường hợp hỏng thật, và không gì khác làm được điều đó.

Sau đó hãy đọc lịch sử tác vụ thay vì biểu tượng kết nối. Lịch sử ghi lại khi nào tác vụ chạy, dùng tài khoản nào và hành động trả về gì, và đó là bằng chứng cần thiết khi cùng máy đó lại rớt vào tháng sau.

Bài viết liên quan