Hồ sơ VPN của Windows là một mục trong danh bạ điện thoại, và PowerShell là một cách để sửa mục đó. Từ sự khác biệt này nảy sinh hai lỗi: một khóa chia sẻ trước đến máy chủ khi đã bị hỏng, và một địa chỉ máy chủ trông như đã cập nhật nhưng không phải địa chỉ mà đường hầm tiếp theo sẽ gọi. Cả hai dễ thấy hơn nếu bạn coi hồ sơ là trạng thái đã lưu chứ không phải lệnh bạn đã chạy. Phần trình bày theo thứ tự các sửa đổi: tạo, thay đổi, phạm vi, đọc lại.

Tạo hồ sơ bằng khóa nguyên văn

Add-VpnConnection nhận khóa L2TP chia sẻ trước qua -L2tpPsk. PowerShell xử lý chuỗi trước khi cmdlet nhận nó, và bên trong dấu ngoặc kép, dấu đô la bắt đầu tham chiếu biến trong khi backtick bắt đầu escape. Một khóa chứa một trong hai sẽ đến ngắn hơn, hoặc với ký tự khác, và hồ sơ vẫn được tạo thành công với bí mật sai.

Sau đó lỗi xuất hiện ở xác thực IPsec, nơi đường hầm từ chối dựng lên. Đó là lý do lỗi dấu ngoặc kép thường được báo là vấn đề phía máy chủ: hồ sơ tồn tại, tên đúng, và bí mật âm thầm sai.

How you write itWhat PowerShell doesResult
"p@ss$word!42"Expands $word as a variableStored key is truncated
Double-quoted with an escape characterConsumes the next character as an escapeOne character disappears
'p@ss$word!42'Keeps the literal charactersStored key matches the secret

Dấu ngoặc kép đơn là cách khắc phục, và chúng phải bao quanh toàn bộ giá trị. Nếu mục đã tồn tại với khóa xấu, -Force thay thế nó, hoặc xóa và tạo lại hồ sơ rồi thử với kết nối mới:

Add-VpnConnection -Name "Contoso-L2TP" -ServerAddress vpn.contoso.example -TunnelType L2tp -L2tpPsk 'n3w$ecret!2026' -AuthenticationMethod Pap -RememberCredential -Force

Giữ bí mật thật ngoài lịch sử shell và các script chia sẻ. Đọc nó khi chạy từ kho đã được phê duyệt và truyền biến thay vì giá trị nguyên văn, điều này tránh hoàn toàn vấn đề dấu ngoặc kép.

Đổi địa chỉ, rồi kết nối lại

Set-VpnConnection nhận các tham số phân tách bằng dấu cách, không phải cú pháp gán. Viết -ServerAddress = "203.0.113.10" truyền thêm một token, và cmdlet hoặc báo lỗi hoặc lưu thứ bạn không định. Dạng đúng là -Name "Office L2TP" -ServerAddress 203.0.113.10.

Ngay cả với cú pháp đúng, thay đổi không đến được đường hầm đã dựng. Kết nối đã thiết lập giữ địa chỉ nó đã gọi cho đến khi bị ngắt, nên thử cùng phiên đó không chứng minh gì về giá trị mới. Ngắt, sửa, kết nối lại, và xác nhận địa chỉ của đối tác trong chi tiết kết nối.

Một số thuộc tính không thể đổi tại chỗ. Khi cmdlet từ chối, hãy ghi lại các tham số hiện có, xóa hồ sơ và tạo lại với giá trị đã sửa, và giữ nguyên cài đặt đường hầm và xác thực ban đầu. Một script chỉ cần đổi số điện thoại có thể sửa mục trong danh bạ qua API RAS thay vì tạo lại mọi thứ. Dù chọn đường nào, hãy xác nhận giá trị đã lưu sau đó thay vì tin vào sự im lặng của lệnh.

Biết bạn đã sửa danh bạ nào

Hồ sơ theo từng người dùng nằm trong thư mục kết nối mạng của người đó, và hồ sơ cho mọi người dùng nằm trong thư mục toàn máy dưới cây dữ liệu chương trình. Đây là những mục khác nhau với phạm vi khác nhau, và sửa cái này để nguyên cái kia.

Vì thế một thay đổi có thể trông như biến mất: script chạy dưới một tài khoản và bài kiểm tra dưới tài khoản khác. Dùng -AllUserConnection khi hồ sơ thuộc về máy, và kiểm tra cùng phạm vi khi bạn đọc lại.

Đọc lại hồ sơ trước khi thử

Hỏi Windows xem nó đã lưu gì, không phải bạn đã truyền gì:

Get-VpnConnection -Name "Office L2TP" | Select-Object Name, ServerAddress, TunnelType, AuthenticationMethod

So sánh đầu ra đó với ý định, rồi bắt đầu kết nối mới. Nếu quay số thất bại, xem nhật ký ứng dụng khách RAS trong Event Viewer trước khi đổi hồ sơ lần nữa, vì nhật ký nêu tên giai đoạn đã thất bại.

Giữ nguyên thiết kế xác thực trong khi sửa. Một lệnh đổi địa chỉ nhưng bỏ chứng chỉ hoặc cấu hình EAP tạo ra lỗi trông không liên quan đến sửa đổi, và xuất hồ sơ đang hoạt động trước đó cho bạn thứ để khôi phục thay vì phỏng đoán.

Bài viết liên quan