PowerShell を使用した仮想マシンの自動化と管理Virtual Machine automation and management using PowerShell

PowerShell ダイレクトを使用すると、ネットワークの構成やリモート管理の設定に関係なく、Hyper-V ホストから、Windows 10 仮想マシンまたは Windows Server 2016 仮想マシンで任意の PowerShell を実行することができます。You can use PowerShell Direct to run arbitrary PowerShell in a Windows 10 or Windows Server 2016 virtual machine from your Hyper-V host regardless of network configuration or remote management settings.

以下に、PowerShell ダイレクトを実行する方法をいくつか示します。Here are some ways you can run PowerShell Direct:

要件Requirements

オペレーティング システムの要件:Operating system requirements:

  • ホスト: Windows 10、Windows Server 2016、または Hyper-V を実行するそれ以降のバージョン。Host: Windows 10, Windows Server 2016, or later running Hyper-V.
  • ゲスト/仮想マシン: Windows 10、Windows Server 2016、またはそれ以降のバージョン。Guest/Virtual Machine: Windows 10, Windows Server 2016, or later.

以前の仮想マシンを管理している場合は、仮想マシン接続 (VMConnect) を使用するか、仮想マシン用の仮想ネットワークを構成しますIf you're managing older virtual machines, use Virtual Machine Connection (VMConnect) or configure a virtual network for the virtual machine.

構成に必要な条件:Configuration requirements:

  • 仮想マシンがホスト上でローカルに実行されている必要があります。The virtual machine must be running locally on the host.
  • 仮想マシンが有効であり、少なくとも 1 つの構成済みユーザー プロファイルで実行されている必要があります。The virtual machine must be turned on and running with at least one configured user profile.
  • HYPER-V の管理者として、ホスト コンピューターには、ログインする必要があります。You must be logged into the host computer as a Hyper-V administrator.
  • 仮想マシンの有効なユーザー資格情報を指定する必要があります。You must supply valid user credentials for the virtual machine.

対話型 PowerShell セッションの作成と終了Create and exit an interactive PowerShell session

仮想マシンで PowerShell コマンドを実行するには、対話型セッションを開始するのが最も簡単な方法です。The easiest way to run PowerShell commands in a virtual machine is to start an interactive session.

セッションが始まると、入力したコマンドが、仮想マシン自体の PowerShell セッションに直接入力されたかのように、仮想マシンで実行されます。When the session starts, the commands that you type run on the virtual machine, just as though you typed them directly into a PowerShell session on the virtual machine itself.

対話型セッションを開始するには:To start an interactive session:

  1. Hyper-V ホストで PowerShell を管理者として開きます。On the Hyper-V host, open PowerShell as Administrator.

  2. 次のいずれかのコマンドを実行すると、仮想マシンの名前または GUID を使用して対話型セッションが作成されます。Run one of the following commands to create an interactive session using the virtual machine name or GUID:

Enter-PSSession -VMName <VMName>
Enter-PSSession -VMId <VMId>

メッセージが表示されたら仮想マシンの資格情報を指定します。Provide credentials for the virtual machine when prompted.

  1. 仮想マシンでコマンドを実行します。Run commands on your virtual machine.

PowerShell プロンプトのプレフィックスとして VMName が次のように表示されます。You should see the VMName as the prefix for your PowerShell prompt as shown:

[VMName]: PS C:\>

仮想マシンで任意のコマンドが実行されます。Any command run will be running on your virtual machine. テストのために、ipconfig または hostname を実行して、これらのコマンドが仮想マシンで実行されていることを確認します。To test, you can run ipconfig or hostname to make sure that these commands are running in the virtual machine.

  1. 次のように完了したら、セッションを終了するには、次のコマンドを実行します。When you're done, run the following command to close the session:

    Exit-PSSession 
    

注: セッションが接続されない場合は、考えられる原因の「トラブルシューティング」を参照してください。Note: If your session won't connect, see the troubleshooting for potential causes.

これらのコマンドレットの詳細については、「Enter-PSSession」と「Exit-PSSession」を参照してください。To learn more about these cmdlets, see Enter-PSSession and Exit-PSSession.


Invoke-Command でのスクリプトまたはコマンドの実行Run a script or command with Invoke-Command

PowerShell ダイレクトと Invoke-Command コマンドの組み合わせは、1 つのコマンドまたは 1 つのスクリプトを仮想マシン上で実行する必要があるが、それらの実行以降は仮想マシンとの対話を続行する必要がないという場合に最適です。PowerShell Direct with Invoke-Command is perfect for situations where you need to run one command or one script on a virtual machine but do not need to continue interacting with the virtual machine beyond that point.

単一のコマンドを実行するには:To run a single command:

  1. Hyper-V ホストで PowerShell を管理者として開きます。On the Hyper-V host, open PowerShell as Administrator.

  2. 次のいずれかのコマンドを実行すると、仮想マシンの名前または GUID を使用してセッションが作成されます。Run one of the following commands to create a session using the virtual machine name or GUID:

    Invoke-Command -VMName <VMName> -ScriptBlock { command } 
    Invoke-Command -VMId <VMId> -ScriptBlock { command }
    

    メッセージが表示されたら仮想マシンの資格情報を指定します。Provide credentials for the virtual machine when prompted.

    仮想マシンでコマンドが実行されます。コンソールへの出力がある場合は、その内容がコンソールに出力されます。The command will execute on the virtual machine, if there is output to the console, it'll be printed to your console. コマンドが実行されるとすぐに、接続が自動的に切断されます。The connection will be closed automatically as soon as the command runs.

スクリプトを実行するには:To run a script:

  1. Hyper-V ホストで PowerShell を管理者として開きます。On the Hyper-V host, open PowerShell as Administrator.

  2. 次のいずれかのコマンドを実行すると、仮想マシンの名前または GUID を使用してセッションが作成されます。Run one of the following commands to create a session using the virtual machine name or GUID:

    Invoke-Command -VMName <VMName> -FilePath C:\host\script_path\script.ps1 
    Invoke-Command -VMId <VMId> -FilePath C:\host\script_path\script.ps1 
    

    メッセージが表示されたら仮想マシンの資格情報を指定します。Provide credentials for the virtual machine when prompted.

    仮想マシンでスクリプトが実行されます。The script will execute on the virtual machine. コマンドが実行されるとすぐに、接続が自動的に切断されます。The connection will be closed automatically as soon as the command runs.

このコマンドレットの詳細については、「Invoke-Command」を参照してください。To learn more about this cmdlet, see Invoke-Command.


New-PSSession および Copy-Item でファイルをコピーするCopy files with New-PSSession and Copy-Item

注: PowerShell ダイレクトでは、Windows ビルド 14280 以降でのみ永続的なセッションをサポートしています。Note: PowerShell Direct only supports persistent sessions in Windows builds 14280 and later

永続的な PowerShell セッションは、1 つまたは複数のリモート コンピューターを対象にした動作を調整するスクリプトを記述する際にとても便利です。Persistent PowerShell sessions are incredibly useful when writing scripts that coordinate actions across one or more remote machines. いったん作成された永続的なセッションは、それを削除するまで、バック グラウンドに保持されます。Once created, persistent sessions exist in the background until you decide to delete them. すなわち、資格情報を渡さなくてもInvoke-Command または Enter-PSSession を使用して、同じセッションを何度でも繰り返し参照することができます。This means you can reference the same session over and over again with Invoke-Command or Enter-PSSession without passing credentials.

セッションは同じトークンにより状態を保持します。By the same token, sessions hold state. 永続的なセッションは存続するので、セッションで作成された変数またはセッションに渡された変数はいずれも複数回の呼び出しにわたり保持されます。Since persistent sessions persist, any variables created in a session or passed to a session will be preserved across multiple calls. 永続的なセッションでの作業で使用できるさまざまなツールがあります。There are a number of tools available for working with persistent sessions. たとえば、New-PSSession および Copy-Item を使用して、ホストから仮想マシンへ、仮想マシンからホストへデータを移動することができます。For this example, we will use New-PSSession and Copy-Item to move data from the host to a virtual machine and from a virtual machine to the host.

セッションを作成し、ファイルをコピーするには:To create a session then copy files:

  1. Hyper-V ホストで PowerShell を管理者として開きます。On the Hyper-V host, open PowerShell as Administrator.

  2. 次のいずれかのコマンドを実行すると、New-PSSession を使用して仮想マシンに対する永続的な PowerShell セッションが作成されます。Run one of the following commands to create a persistent PowerShell session to the virtual machine using New-PSSession.

$s = New-PSSession -VMName <VMName> -Credential (Get-Credential)
$s = New-PSSession -VMId <VMId> -Credential (Get-Credential)

メッセージが表示されたら仮想マシンの資格情報を指定します。Provide credentials for the virtual machine when prompted.

警告:Warning:
14500 より前のビルドにはバグがあります。There is a bug in builds before 14500. -Credential フラグで資格情報が明示的に指定されていない場合、ゲスト内のサービスはクラッシュするので、再起動する必要があります。If credentials aren't explicitly specified with -Credential flag, the service in the guest will crash and will need to be restarted. この問題が発生した場合、解決策についてはこちらを参照してください。If you hit this issue, workaround instructions are available here.

  1. 仮想マシンにファイルをコピーします。Copy a file into the virtual machine.

ホスト マシンから仮想マシンに C:\host_path\data.txt をコピーするには、次を実行します。To copy C:\host_path\data.txt to the virtual machine from the host machine, run:

Copy-Item -ToSession $s -Path C:\host_path\data.txt -Destination C:\guest_path\
  1. 仮想マシンから (ホストに) ファイルをコピーします。Copy a file from the virtual machine (on to the host).

仮想マシンからホストに C:\guest_path\data.txt をコピーするには、次を実行します。To copy C:\guest_path\data.txt to the host from the virtual machine, run:

Copy-Item -FromSession $s -Path C:\guest_path\data.txt -Destination C:\host_path\
  1. Remove-PSSession を使用して永続的なセッションを停止します。Stop the persistent session using Remove-PSSession.
Remove-PSSession $s

トラブルシューティングTroubleshooting

PowerShell Direct を通じて表示される一般的なエラー メッセージが少しあります。There are a small set of common error messages surfaced through PowerShell Direct. いくつかの最も一般的な原因、および問題を診断するためのツールは、次のとおりです。Here are the most common, some causes, and tools for diagnosing issues.

-VMName または -VMID パラメーターが存在しない-VMName or -VMID parameters don't exist

問題:Problem:
Enter-PSSessionInvoke-Command、または New-PSSession-VMName パラメーターまたは -VMId パラメーターがありません。Enter-PSSession, Invoke-Command, or New-PSSession do not have a -VMName or -VMId parameter.

考えられる原因:Potential causes:
最も可能性の高い原因として、PowerShell ダイレクトがご使用のホスト オペレーティング システムでサポートされないことが挙げられます。The most likely issue is that PowerShell Direct isn't supported by your host operating system.

Windows ビルドは、次のコマンドを実行して確認できます。You can check your Windows build by running the following command:

[System.Environment]::OSVersion.Version

サポートされたビルドを実行していても、ご使用の PowerShell バージョンで PowerShell ダイレクトが実行されない可能もあります。If you are running a supported build, it is also possible your version of PowerShell does not run PowerShell Direct. PowerShell ダイレクトと JEA については、メジャー バージョンが 5 以降である必要があります。For PowerShell Direct and JEA, the major version must be 5 or later.

PowerShell バージョンのビルドは、次のコマンドを実行して確認できます。You can check your PowerShell version build by running the following command:

$PSVersionTable.PSVersion

エラー: リモート セッションが終了した可能性があるError: A remote session might have ended

注:Note:
10240 ~ 12400 のホスト ビルドでの Enter-PSSession の場合、以下に示すエラーはすべて、"リモート セッションが終了した可能性がある" とレポートされます。For Enter-PSSession between host builds 10240 and 12400, all errors below reported as "A remote session might have ended".

エラー メッセージ:Error message:

Enter-PSSession : An error has occurred which Windows PowerShell cannot handle. A remote session might have ended.

考えられる原因:Potential causes:

  • 仮想マシンは存在しますが、まだ実行されていません。The virtual machine exists but is not running.
  • ゲスト OS が PowerShell Direct をサポートしていない (「要件」を参照してください)The guest OS does not support PowerShell Direct (see requirements)
  • PowerShell がまだゲストで使用できないPowerShell isn't available in the guest yet
    • オペレーティング システムが起動を完了していないThe operating system hasn't finished booting
    • オペレーティング システムが正しく起動できないThe operating system can't boot correctly
    • ユーザー入力が必要な起動時のイベントがあるSome boot time event needs user input

GeT-VM コマンドレットを使用すれば、どの VM がホストで実行されているかを確認することができます。You can use the Get-VM cmdlet to check to see which VMs are running on the host.

エラー メッセージ:Error message:

New-PSSession : An error has occurred which Windows PowerShell cannot handle. A remote session might have ended.

考えられる原因:Potential causes:

  • 上の一覧に示したいずれかの理由です。これらはすべて New-PSSession にも同様に当てはまりますOne of the reasons listed above -- they all are equally applicable to New-PSSession
  • 現在のビルドにバグがあります。-Credential で資格情報を明示的に渡す必要があります。A bug in current builds where credentials must be explicitly passed with -Credential. このエラーが発生すると、ゲスト オペレーティング システムでサービス全体がハングし、再起動する必要があります。When this happens, the entire service hangs in the guest operating system and needs to be restarted. Enter-PSSession を使用すれば、セッションが引き続き使用できるかどうかを確認できます。You can check if the session is still available with Enter-PSSession.

資格情報の問題を回避するには、VMConnect を使用して仮想マシンにログインし、PowerShell を開き、次の PowerShell を使用して vmicvmsession サービスを再開します。To work around the credential issue, log into the virtual machine using VMConnect, open PowerShell, and restart the vmicvmsession service using the following PowerShell:

Restart-Service -Name vmicvmsession

エラー: パラメーター セットを解決できません。Error: Parameter set cannot be resolved

エラー メッセージ:Error message:

Enter-PSSession : Parameter set cannot be resolved using the specified named parameters.

考えられる原因:Potential causes:

  • 仮想マシンへの接続時に -RunAsAdministrator がサポートされません。-RunAsAdministrator is not supported when connecting to virtual machines.

    Windows コンテナーに接続するときは、-RunAsAdministrator フラグを指定すると、明示的な資格情報がなくても管理者として接続できます。When connecting to a Windows container, the -RunAsAdministrator flag allows Administrator connections without explicit credentials. 仮想マシンはホストに暗黙の管理者アクセス権を付与しないため、資格情報を明示的に入力する必要があります。Since virtual machines do not give the host implied administrator access, you need to explicitly enter credentials.

仮想マシンに管理者の資格情報を渡すには、-Credential パラメーターを使用するか、要求されたときに手動で入力します。Administrator credentials can be passed to the virtual machine with the -Credential parameter or by entering them manually when prompted.

エラー: 資格情報が無効です。Error: The credential is invalid.

エラー メッセージ:Error message:

Enter-PSSession : The credential is invalid.

考えられる原因:Potential causes:

  • ゲストの資格情報を検証できないThe guest credentials couldn't be validated
    • 指定された資格情報が誤っていた。The supplied credentials were incorrect.
    • ゲストにユーザー アカウントがない (前もって OS が起動されていない)There are no user accounts in the guest (the OS hasn't booted before)
    • 管理者として接続する場合: 管理者がアクティブなユーザーとして設定されていない。If connecting as Administrator: Administrator has not been set as an active user. こちらをご覧ください。Learn more here.

エラー: 入力 VMName パラメーターが仮想マシンに解決されません。Error: The input VMName parameter does not resolve to any virtual machine.

エラー メッセージ:Error message:

Enter-PSSession : The input VMName parameter does not resolve to any virtual machine.

考えられる原因:Potential causes:

  • Hyper-V の管理者ではありません。You are not a Hyper-V Administrator.
  • 仮想マシンが存在しません。The virtual machine doesn't exist.

Get-VM コマンドレットを使用して、使用している資格情報に Hyper-V 管理者の役割があることを確認し、ホスト上でローカルで実行されている、起動した VM を確認することができます。You can use the Get-VM cmdlet to check that the credentials you're using have the Hyper-V administrator role and to see which VMs are running locally on the host and booted.


サンプルとユーザー ガイドSamples and User Guides

PowerShell ダイレクトでは JEA (Just Enough Administration) をサポートしています。PowerShell Direct supports JEA (Just Enough Administration). これを試すには、このユーザー ガイドをご覧ください。Check out this user guide to try it.

GitHub のサンプルをご確認ください。Check out samples on GitHub.