Skrip yang membuka jendela VPN lalu tidur sepuluh detik sedang menebak, dan tebakan itu salah di kedua arah: ia memulai penyalinan sebelum terowongan bisa dipakai, atau menunggu setelah pekerjaan seharusnya sudah bisa dimulai. Tidak ada satu pun hasil yang memberi tahu apakah autentikasi selesai. Gunakan hasil dari perintah itu sendiri, lalu ajukan pertanyaan kepada layanan yang benar-benar bisa dijawabnya. Urutan kedua langkah itulah seluruh rancangannya.

Apa yang sebenarnya dilaporkan perintah itu

Untuk profil Windows asli yang dipahami alat baris perintah terpasang, rasdial.exe memanggil entri bernama dan mengembalikan kode keluar proses. Kode itu menjelaskan percobaan panggilan: nol berarti koneksi terbentuk untuk profil itu, dan bukan nol berarti gagal pada tahap yang ditunjukkan kode. Bacalah sebagai hasil satu lapisan, bukan hasil pekerjaan.

Hasilnya tidak mengatakan apa pun tentang pemberian alamat, DNS privat, rute yang ditambahkan atau izin menjangkau server tertentu. Semua itu terjadi setelah panggilan berhasil, dan salah satunya masih bisa keliru. Celah itulah sebabnya ikon terhubung dan penyalinan yang gagal begitu sering muncul bersamaan.

Catat hasilnya sebelum apa pun yang lain berjalan

Mulailah dengan memastikan profil itu ada untuk akun yang akan menjalankan pekerjaan, bukan hanya untuk akun yang Anda pakai menguji:

Get-VpnConnection -Name "Contoso-Office"
Get-VpnConnection -Name "Contoso-Office" -AllUserConnection

Lalu panggil dan baca kodenya segera. PowerShell menyimpan hasil asli di $LASTEXITCODE hanya sampai perintah eksternal berikutnya berjalan, jadi ping yang nyasar di antara panggilan dan pemeriksaan menghancurkan nilai yang ingin Anda baca. Tetapkan dulu ke variabel Anda sendiri, baru putuskan apa yang harus dilakukan.

& rasdial.exe "Contoso-Office"
$dial = $LASTEXITCODE
if ($dial -ne 0) { throw "rasdial failed with $dial" }

Catat kode itu bersama teks kesalahan yang bukan rahasia, karena entri yang hilang, kredensial ditolak dan batas waktu membutuhkan tanggapan berbeda. Tabel memetakan hasil umum ke langkah berikutnya.

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

Kesiapan adalah sumber daya, bukan terowongan

Setelah panggilan berhasil, ujilah hal yang dibutuhkan pekerjaan. Berbagi file, titik akhir API atau port basis data adalah uji kesiapan yang lebih baik daripada situs web publik, karena situs publik menjawab lewat jalur mana pun yang berfungsi dan tidak membuktikan apa pun tentang jalur privat. Pilih uji yang menjadi sandaran aplikasi itu sendiri. Koneksi TCP yang berhasil memberi tahu bahwa perutean dan penyaringan terbuka, dan itulah sebagian besar yang dibutuhkan penulisan pertama:

Test-NetConnection -ComputerName files.contoso.example -Port 445

Batasi percobaan dan catat tahap mana yang gagal. Kredensial yang ditolak harus menghentikan skrip, bukan memberi makan loop percobaan ulang; nama DNS yang belum muncul layak mendapat beberapa percobaan ulang singkat; port yang tidak pernah terbuka adalah masalah perutean atau kebijakan di atas klien.

Jika koneksi sudah ada sebelum pekerjaan dimulai, biarkan saja. Memutus sesi yang tidak Anda buka mengganggu pekerjaan lain pengguna, jadi catat siapa pemilik sesi dan pembongkaran seperti apa yang pantas.

Batasi profil pada akun yang menjalankan pekerjaan

Tugas terjadwal berjalan dengan identitas dan sesinya sendiri, dan profil yang berfungsi di desktop Anda bisa tidak terlihat di sana. Ulangi pemeriksaan visibilitas dan panggilan di bawah akun tugas sebelum memercayai jadwalnya. Jauhkan juga kata sandi dari baris perintah: argumen terlihat oleh proses lain dan sering berakhir di log.

Jika penerapan memerlukan prompt peramban, ketukan kartu pintar atau persetujuan MFA, interaksi itu adalah bagian dari rancangan dan tidak dapat diotomatiskan dengan meniru ketukan tombol. Gunakan klien yang didukung untuk kasus itu dan biarkan langkah manusia terjadi.

Bentuk skrip akhirnya tetap singkat: periksa profil, panggil, baca kode, uji sumber daya, lalu mulai pekerjaan. Setiap langkah menjawab pertanyaan yang tidak bisa dijawab langkah sebelumnya, dan tidak ada yang bergantung pada tidur.

Artikel terkait