Otomatisasi dan manajemen Komputer Virtual menggunakan PowerShell
Anda dapat menggunakan PowerShell Direct untuk menjalankan PowerShell arbitrer di Windows 10 atau lebih besar, atau Windows Server 2016 atau komputer virtual yang lebih baru dari host Hyper-V Anda. Gunakan PowerShell Direct terlepas dari konfigurasi jaringan atau pengaturan manajemen jarak jauh.
Berikut adalah beberapa cara untuk menjalankan PowerShell Direct:
- Sebagai sesi interaktif menggunakan cmdlet Enter-PSSession
- Sebagai bagian penggunaan tunggal untuk menjalankan satu perintah atau skrip menggunakan cmdlet Invoke-Command
- Sebagai sesi persisten (build 14280 dan yang lebih baru) menggunakan cmdlet New-PSSession, Copy-Item, dan Remove-PSSession
Persyaratan
Persyaratan sistem operasi:
- Host: Windows 10, Windows Server 2016, atau yang lebih baru berjalan Hyper-V.
- Komputer Tamu/Virtual: Windows 10, Windows Server 2016, atau yang lebih baru.
Jika Anda mengelola komputer virtual yang lebih lama, gunakan Koneksi Komputer Virtual (VMConnect) atau konfigurasikan jaringan virtual untuk komputer virtual.
Persyaratan konfigurasi:
- Komputer virtual harus berjalan secara lokal pada host.
- Komputer virtual harus diaktifkan dan berjalan dengan setidaknya satu profil pengguna yang dikonfigurasi.
- Anda harus masuk ke komputer host sebagai administrator Hyper-V.
- Anda harus memberikan kredensial pengguna yang valid untuk komputer virtual.
Membuat dan keluar dari sesi PowerShell interaktif
Cara term mudah untuk menjalankan perintah PowerShell di komputer virtual adalah dengan memulai sesi interaktif.
Ketika sesi dimulai, perintah yang Anda ketik berjalan pada komputer virtual, seolah-olah Anda mengetikkannya langsung ke sesi PowerShell pada komputer virtual itu sendiri.
Untuk memulai sesi interaktif:
Pada host Hyper-V, buka PowerShell sebagai Administrator.
Jalankan salah satu perintah berikut untuk membuat sesi interaktif menggunakan nama komputer virtual atau GUID:
Enter-PSSession -VMName <VMName> Enter-PSSession -VMId <VMId>
Berikan kredensial untuk komputer virtual saat diminta.
Jalankan perintah di komputer virtual Anda. Anda akan melihat VMName sebagai awalan untuk prompt PowerShell Anda sebagai berikut:
[VMName]: PS C:\>
Setiap perintah yang dijalankan akan berjalan di komputer virtual Anda. Untuk menguji, Anda dapat menjalankan
ipconfig
atauhostname
memastikan bahwa perintah ini berjalan di komputer virtual.Setelah selesai, jalankan perintah berikut untuk menutup sesi:
Exit-PSSession
Catatan
Jika sesi Anda tidak akan tersambung, lihat pemecahan masalah untuk kemungkinan penyebabnya.
Untuk mempelajari selengkapnya tentang cmdlet ini, lihat Enter-PSSession dan Exit-PSSession.
Menjalankan skrip atau perintah dengan Invoke-Command
PowerShell Direct dengan Invoke-Command sangat cocok untuk situasi di mana Anda perlu menjalankan satu perintah atau satu skrip pada komputer virtual tetapi tidak perlu terus berinteraksi dengan komputer virtual di luar titik itu.
Untuk menjalankan satu perintah:
Pada host Hyper-V, buka PowerShell sebagai Administrator.
Jalankan salah satu perintah berikut untuk membuat sesi menggunakan nama komputer virtual atau GUID:
Invoke-Command -VMName <VMName> -ScriptBlock { command } Invoke-Command -VMId <VMId> -ScriptBlock { command }
Berikan kredensial untuk komputer virtual saat diminta.
Perintah akan dijalankan pada komputer virtual, jika ada output ke konsol, perintah akan dicetak ke konsol Anda. Koneksi akan ditutup secara otomatis segera setelah perintah berjalan.
Untuk menjalankan skrip:
Pada host Hyper-V, buka PowerShell sebagai Administrator.
Jalankan salah satu perintah berikut untuk membuat sesi menggunakan nama komputer virtual atau GUID:
Invoke-Command -VMName <VMName> -FilePath C:\host\script_path\script.ps1 Invoke-Command -VMId <VMId> -FilePath C:\host\script_path\script.ps1
Berikan kredensial untuk komputer virtual saat diminta.
Skrip akan dijalankan pada komputer virtual. Koneksi akan ditutup secara otomatis segera setelah perintah berjalan.
Untuk mempelajari selengkapnya tentang cmdlet ini, lihat Invoke-Command.
Salin file dengan New-PSSession dan Copy-Item
Catatan
PowerShell Direct hanya mendukung sesi persisten di Windows build 14280 dan yang lebih baru
Sesi PowerShell persisten sangat berguna saat menulis skrip yang mengoordinasikan tindakan di satu atau beberapa komputer jarak jauh. Setelah dibuat, sesi persisten ada di latar belakang hingga Anda memutuskan untuk menghapusnya. Ini berarti Anda dapat mereferensikan sesi yang sama berulang kali dengan Invoke-Command
atau Enter-PSSession
tanpa meneruskan kredensial.
Dengan token yang sama, sesi menyimpan status. Karena sesi persisten berlanjut, variabel apa pun yang dibuat dalam sesi atau diteruskan ke sesi akan dipertahankan di beberapa panggilan. Ada sejumlah alat yang tersedia untuk bekerja dengan sesi persisten. Untuk contoh ini, kita akan menggunakan New-PSSession dan Copy-Item untuk memindahkan data dari host ke komputer virtual dan dari komputer virtual ke host.
Untuk membuat sesi, salin file:
Pada host Hyper-V, buka PowerShell sebagai Administrator.
Jalankan salah satu perintah berikut untuk membuat sesi PowerShell persisten ke komputer virtual menggunakan
New-PSSession
.$s = New-PSSession -VMName <VMName> -Credential (Get-Credential) $s = New-PSSession -VMId <VMId> -Credential (Get-Credential)
Berikan kredensial untuk komputer virtual saat diminta.
Peringatan
Ada bug dalam build sebelum 14500. Jika kredensial tidak ditentukan secara eksplisit dengan
-Credential
bendera, layanan di tamu akan mengalami crash dan perlu dimulai ulang. Jika Anda mengalami masalah ini, instruksi solusi tersedia di bagian Kesalahan: Sesi jarak jauh mungkin telah berakhir.Salin file ke komputer virtual.
Untuk menyalin
C:\host_path\data.txt
ke komputer virtual dari komputer host, jalankan:Copy-Item -ToSession $s -Path C:\host_path\data.txt -Destination C:\guest_path\
Salin file dari komputer virtual (aktif ke host).
Untuk menyalin
C:\guest_path\data.txt
ke host dari komputer virtual, jalankan:Copy-Item -FromSession $s -Path C:\guest_path\data.txt -Destination C:\host_path\
Hentikan sesi persisten menggunakan
Remove-PSSession
.Remove-PSSession $s
Pemecahan Masalah
Ada serangkaian kecil pesan kesalahan umum yang muncul melalui PowerShell Direct. Bagian berikut menjelaskan pesan kesalahan yang paling umum, beberapa penyebab, dan alat untuk mendiagnosis masalah.
Parameter -VMName atau -VMID tidak ada
Masalah:
Enter-PSSession
, Invoke-Command
, atau New-PSSession
tidak memiliki -VMName
parameter atau -VMId
.
Potensi penyebab:
Masalah yang paling mungkin adalah bahwa PowerShell Direct tidak didukung oleh sistem operasi host Anda.
Anda dapat memeriksa build Windows dengan menjalankan perintah berikut:
[System.Environment]::OSVersion.Version
Jika Anda menjalankan build yang didukung, dimungkinkan juga versi PowerShell Anda tidak menjalankan PowerShell Direct. Untuk PowerShell Direct dan JEA, versi utama harus 5 atau yang lebih baru.
Anda dapat memeriksa build versi PowerShell dengan menjalankan perintah berikut:
$PSVersionTable.PSVersion
Kesalahan: Sesi jarak jauh mungkin telah berakhir
Catatan
Untuk Enter-PSSession antara build host 10240 dan 12400, semua kesalahan di bawah ini dilaporkan sebagai "Sesi jarak jauh mungkin telah berakhir".
Pesan kesalahan:
Enter-PSSession : Terjadi kesalahan yang tidak dapat ditangani Windows PowerShell. Sesi jarak jauh mungkin telah berakhir.
Potensi penyebab:
- Komputer virtual ada tetapi tidak berjalan.
- OS tamu tidak mendukung PowerShell Direct. Lihat persyaratan.
- PowerShell belum tersedia di tamu
- Sistem operasi belum selesai booting
- Sistem operasi tidak dapat melakukan boot dengan benar
- Beberapa peristiwa waktu boot memerlukan input pengguna
Anda dapat menggunakan cmdlet Get-VM untuk memeriksa untuk melihat VM mana yang berjalan di host.
Pesan kesalahan:
New-PSSession : Terjadi kesalahan yang tidak dapat ditangani Windows PowerShell. Sesi jarak jauh mungkin telah berakhir.
Potensi penyebab:
- Salah satu alasan yang tercantum di atas -- semuanya sama-sama berlaku untuk
New-PSSession
- Bug dalam build saat ini di mana kredensial harus secara eksplisit diteruskan dengan
-Credential
. Ketika ini terjadi, seluruh layanan macet di sistem operasi tamu dan perlu dimulai ulang. Anda dapat memeriksa apakah sesi masih tersedia dengan Enter-PSSession.
Untuk mengatasi masalah kredensial, masuk ke komputer virtual menggunakan VMConnect, buka PowerShell, dan mulai ulang layanan vmicvmsession menggunakan PowerShell berikut:
Restart-Service -Name vmicvmsession
Kesalahan: Set parameter tidak dapat diselesaikan
Pesan kesalahan:
Enter-PSSession : Set parameter tidak dapat diselesaikan menggunakan parameter bernama yang ditentukan.
Potensi penyebab:
-RunAsAdministrator
tidak didukung saat menyambungkan ke komputer virtual.Saat menyambungkan ke kontainer Windows,
-RunAsAdministrator
bendera memungkinkan koneksi Administrator tanpa kredensial eksplisit. Karena komputer virtual tidak memberikan akses administrator tersirat host, Anda perlu memasukkan kredensial secara eksplisit.
Info masuk administrator dapat diteruskan ke komputer virtual dengan -Credential
parameter atau dengan memasukkannya secara manual saat diminta.
Kesalahan: Kredensial tidak valid
Pesan kesalahan:
Enter-PSSession : Kredensial tidak valid.
Potensi penyebab:
- Kredensial tamu tidak dapat divalidasi
- Kredensial yang disediakan salah.
- Tidak ada akun pengguna di tamu (OS belum di-boot sebelumnya)
- Jika menyambungkan sebagai Administrator: Administrator belum ditetapkan sebagai pengguna aktif. Pelajari selengkapnya di Mengaktifkan dan Menonaktifkan Akun Administrator Bawaan.
Kesalahan: Parameter VMName input tidak diselesaikan ke komputer virtual apa pun.
Pesan kesalahan:
Enter-PSSession : Parameter VMName input tidak diselesaikan ke komputer virtual apa pun.
Potensi penyebab:
- Anda bukan Administrator Hyper-V.
- Komputer virtual tidak ada.
Anda dapat menggunakan cmdlet Get-VM untuk memeriksa apakah kredensial yang Anda gunakan memiliki peran administrator Hyper-V dan untuk melihat VM mana yang berjalan secara lokal di host dan di-boot.
Sampel dan Panduan Pengguna
PowerShell Direct mendukung Just Enough Administration (JEA).
Lihat sampel di GitHub.