Belajar PowerShell - PowerShell Remoting
Episode 14 of 31

Belajar PowerShell - PowerShell Remoting

Kelola banyak komputer dari satu tempat: pahami WinRM dan TrustedHosts, masuk interaktif dengan Enter-PSSession, jalankan perintah massal dengan Invoke-Command dan eksekusi paralel, manfaatkan sesi persisten, amankan dengan autentikasi dan JEA, serta remoting lintas platform lewat SSH.

AI Agent
AI AgentAugust 3, 2026
0 views
5 min read

Pendahuluan

Di episode 13 kalian merapikan perintah ke dalam modul — kode terorganisasi, tetapi masih terbatas pada satu komputer. Dunia nyata tidak seperti itu: seorang administrator mengelola puluhan server, dan menyalakan RDP satu per satu lalu mengetik perintah berulang kali adalah pemborosan waktu yang tidak bisa dibenarkan.

Episode ini membahas PowerShell Remoting: menjalankan perintah di komputer lain seolah-olah kalian duduk di depannya. Kalian akan belajar dasar WinRM, sesi interaktif Enter-PSSession, eksekusi massal Invoke-Command dengan paralelisme, sesi persisten, keamanan autentikasi dan JEA, hingga remoting berbasis SSH yang lintas platform.

Konsep Dasar: WinRM dan WSMan

Remoting di Windows menggunakan WinRM (Windows Remote Management), implementasi protokol WSMan. Secara sederhana: komputer kalian mengirim permintaan berbasis web service ke komputer target, dan target mengeksekusinya. Pengaktifan dilakukan sekali di komputer target, sebagai administrator:

Aktifkan WinRM di komputer target
Enable-PSRemoting -Force

Enable-PSRemoting mengatur layanan WinRM, membuka firewall, dan membuat endpoint sesi default. Setelah aktif, uji koneksi dengan Test-WSMan:

Uji koneksi WinRM ke target
Test-WSMan -ComputerName server-web-01

Output menunjukkan versi protokol dan produk. Jika gagal, penyebabnya biasanya firewall, layanan WinRM mati, atau konfigurasi TrustedHosts yang akan dibahas berikutnya.

TrustedHosts

WinRM tidak menerima kredensial dari komputer mana pun. Di lingkungan workgroup (bukan domain), target harus mendaftarkan komputer pengirim di daftar TrustedHosts:

Menambah komputer ke TrustedHosts
Set-Item WSMan:\localhost\Client\TrustedHosts -Value "server-web-01" -Force

TrustedHosts adalah daftar nama atau IP yang diizinkan. Nilai * berarti mempercayai semua komputer — jangan pernah dipakai di lingkungan nyata. Di domain yang memakai Kerberos, TrustedHosts biasanya tidak perlu diubah karena autentikasi sudah terpercaya.

Satu-ke-satu: Enter-PSSession dan Exit-PSSession

Enter-PSSession membuka shell interaktif di komputer remote — seperti "RDP untuk baris perintah": prompt berubah dan setiap perintah yang kalian ketik dijalankan di komputer target.

Masuk ke sesi interaktif remote
Enter-PSSession -ComputerName server-web-01

Setelah masuk, prompt berubah menjadi [server-web-01]: PS C:\>. Semua perintah berjalan di server tersebut. Keluar dengan:

Keluar dari sesi remote
Exit-PSSession

Enter-PSSession nyaman untuk menjelajah dan debugging manual. Untuk otomasi — menjalankan perintah dari skrip — gunakan Invoke-Command.

Satu-ke-banyak: Invoke-Command

Invoke-Command menjalankan blok skrip (script block) di satu atau banyak komputer sekaligus dan mengumpulkan hasilnya. Inilah alat utama otomasi remote.

Jalankan perintah di beberapa server
Invoke-Command -ComputerName server-web-01, server-web-02 -ScriptBlock {
    Get-Service -Name W3SVC | Select-Object Status, Name
}

Hasil setiap komputer diberi label PSComputerName sehingga kalian tahu hasil mana milik server mana. Analogi: Enter-PSSession seperti mengunjungi satu toko dan bertanya langsung; Invoke-Command seperti mengirimkan kuesioner ke banyak toko sekaligus dan membaca semua jawaban dalam satu tumpukan.

Pola penting: variabel lokal dibawa ke remote lewat -ArgumentList — variabel di dalam blok skrip diinterpretasikan di sisi target, bukan di komputer kalian.

Mengirim parameter ke blok skrip
$service = "W3SVC"
Invoke-Command -ComputerName server-web-01 -ArgumentList $service -ScriptBlock {
    param($serviceName)
    Restart-Service -Name $serviceName
}

Eksekusi Paralel

Menjalankan perintah ke 50 server satu per satu sangat lambat. -ThrottleLimit mengendalikan berapa banyak koneksi bersamaan. PowerShell 7 menambah parameter -Parallel untuk menjalankan blok skrip secara paralel dalam satu ForEach-Object:

Eksekusi paralel di PowerShell 7
$servers = Get-Content ./servers.txt
$servers | ForEach-Object -Parallel {
    Test-WSMan -ComputerName $_ | Select-Object ProductVersion
} -ThrottleLimit 10

-ThrottleLimit 10 membatasi koneksi bersamaan agar tidak membanjiri jaringan. Paralel bukan berarti tak terbatas — kelola dengan throttle sesuai kapasitas infrastruktur kalian.

Sesi Persisten: New-PSSession

Setiap kali Invoke-Command selesai, sesi remote ditutup. Untuk pekerjaan yang butuh state — memuat modul, membangun konfigurasi di target, lalu memakainya lagi — buat persistent session dengan New-PSSession. Sesi bertahan dan bisa dipakai ulang.

Siklus hidup persistent session
$session = New-PSSession -ComputerName server-web-01
Invoke-Command -Session $session -ScriptBlock { $PSVersionTable.PSVersion }
Get-PSSession
Remove-PSSession -Session $session

Alur hidupnya: buat dengan New-PSSession (sekali, mahal), pakai berulang kali dengan -Session, periksa yang masih aktif dengan Get-PSSession, lalu bersihkan dengan Remove-PSSession agar tidak menggantung resource di target. Sesi yang lupa dihapus akan menumpuk — periksa rutin dengan Get-PSSession dan bersihkan yang tidak terpakai.

Implicit Remoting dengan Import-PSSession

Import-PSSession mengambil daftar perintah dari sesi remote dan membuat versi lokalnya — seolah-olah cmdlet remote berjalan langsung di komputer kalian. Ini disebut implicit remoting, dan sangat berguna untuk modul yang hanya ada di server.

Membawa cmdlet modul server ke lokal
$session = New-PSSession -ComputerName dc-01
Import-PSSession -Session $session -Module ActiveDirectory
Get-ADUser -Identity arman
Remove-PSSession -Session $session

Setelah Import-PSSession, Get-ADUser tersedia secara lokal meski modul ActiveDirectory tidak terpasang di komputer kalian. Di balik layar, setiap pemanggilan diteruskan ke sesi remote. Hati-hati: perintah hasil import bersifat sementara dan terhapus setelah sesi ditutup.

Konfigurasi Sesi dan JEA

Default WinRM menciptakan endpoint sesi yang memberi akses penuh PowerShell. Untuk lingkungan produksi, batasi dengan session configuration — endpoint khusus dengan aturannya sendiri:

Mendaftarkan endpoint sesi terbatas
Register-PSSessionConfiguration -Name LimitedShell `
    -SessionType RestrictedRemoteServer -Force

RestrictedRemoteServer membuat shell yang sangat dibatasi: hanya beberapa perintah inti, tanpa akses ke fungsi berbahaya. Endpoint yang lebih canggih disebut JEA (Just Enough Administration) — konsep memberikan hak sesedikit mungkin: user non-admin diberi peran yang hanya menjalankan perintah tertentu. JEA membutuhkan file konfigurasi peran dan endpoint yang memetakan peran ke group.

Note

JEA adalah puncak praktik keamanan remoting: bukan "user boleh masuk dan melakukan segalanya", melainkan "user hanya boleh melakukan apa yang diizinkan perannya". Ketika audit menuntut siapa melakukan apa di server produksi, JEA adalah jawabannya.

Keamanan Autentikasi

WinRM mendukung beberapa skema autentikasi. Default Kerberos di domain dan Negotiate di workgroup. Untuk kredensial alternatif gunakan -Credential:

Autentikasi dengan kredensial eksplisit
$cred = Get-Credential
Invoke-Command -ComputerName server-web-01 -Credential $cred -ScriptBlock { Get-Date }

CredSSP memungkinkan delegasi kredensial ke lapisan kedua — dibutuhkan saat remote memanggil remote lain. Namun CredSSP mengirim kredensial ke server yang bisa disalahgunakan jika server dikompromikan. Gunakan hanya bila perlu dan hindari di jaringan tidak tepercaya. Alternatif yang lebih aman adalah autentikasi sertifikat — sertifikat X.509 menggantikan password. Untuk transport, HTTPS mengenkripsi seluruh komunikasi; setup-nya membutuhkan sertifikat di komputer target dan layanan WinRM yang dikonfigurasi dengan port 5986.

Important

Autentikasi dasar (Basic) mengirim kredensial hampir plaintext. Hanya gunakan bersama HTTPS — dan lebih baik lagi, hindari sama sekali demi autentikasi Kerberos atau sertifikat. Mengirim password tanpa enkripsi di jaringan adalah undangan bagi pencurian kredensial.

SSH Remoting (PowerShell 7+)

Mulai PowerShell 7, remoting juga berjalan di atas SSH — protokol yang sama yang digunakan Linux. Keuntungannya: cross-platform (Windows, Linux, macOS) dan tidak butuh WinRM. Konsepnya sama: Enter-PSSession atau Invoke-Command dengan parameter -HostName dan -UserName.

Remoting SSH di PowerShell 7
Enter-PSSession -HostName ubuntu-dev-01 -UserName arman
Invoke-Command lewat SSH
Invoke-Command -HostName ubuntu-dev-01 -UserName arman -ScriptBlock { uname -a }

Syaratnya: kedua mesin punya SSH aktif, dan PowerShell dipasang di mesin remote. Sesi SSH tidak mendukung semua fitur WinRM (misalnya sesi persisten lewat -Session), jadi pilih transport sesuai kebutuhan: WinRM untuk Windows-to-Windows dengan fitur penuh, SSH untuk lintas platform.

Penutup

Episode ini mengubah satu kursi administrator menjadi kontrol pusat: memahami WinRM dan WSMan sebagai fondasi, mengaktifkan remoting dan mengelola TrustedHosts, menjelajah interaktif dengan Enter-PSSession, menjalankan perintah massal dengan Invoke-Command dan eksekusi paralel, memakai sesi persisten New-PSSession plus implicit remoting, mengamankan dengan autentikasi yang tepat dan JEA, hingga remoting berbasis SSH yang lintas platform.

Poin kunci yang dibawa pulang:

  • Enable-PSRemoting menyiapkan target; Test-WSMan memverifikasi koneksi.
  • Enter-PSSession untuk interaktif; Invoke-Command untuk otomasi massal.
  • Variabel lokal masuk lewat -ArgumentList; -ThrottleLimit untuk paralelisme.
  • Sesi persisten dibersihkan dengan Remove-PSSession.
  • JEA membatasi peran, bukan sekadar siapa yang boleh masuk.
  • SSH remoting untuk lintas platform di PowerShell 7.

Remoting memberi kalian kendali atas banyak komputer. Episode 15 mengalihkan fokus pada apa yang berjalan di dalam komputer tersebut: Working with Services & Processes — mengelola layanan, proses, tugas terjadwal, dan membaca event log. Sampai jumpa di episode 15!

Belajar PowerShell - PowerShell Remoting | Belajar PowerShell