次の方法で共有


PowerShell を使用した仮想マシンの自動化と管理

PowerShell Direct を使用して、Hyper-V ホストから Windows 10 以降、または Windows Server 2016 以降の仮想マシンで任意の PowerShell を実行できます。 ネットワーク構成やリモート管理設定に関係なく、PowerShell Direct を使用します。

PowerShell Direct を実行する方法を次に示します。

Requirements

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

  • ホスト: Hyper-V を実行している Windows 10、Windows Server 2016 以降。
  • ゲスト/仮想マシン: Windows 10、Windows Server 2016 以降。

古い仮想マシンを管理している場合は、仮想マシン接続 (VMConnect) を使用するか 、仮想マシンの仮想ネットワークを構成します

構成要件:

  • 仮想マシンは、ホスト上でローカルに実行されている必要があります。
  • 仮想マシンを有効にし、少なくとも 1 つの構成済みユーザー プロファイルで実行する必要があります。
  • ホスト コンピューターに Hyper-V 管理者としてログインする必要があります。
  • 仮想マシンの有効なユーザー資格情報を指定する必要があります。

対話型 PowerShell セッションを作成して終了する

仮想マシンで PowerShell コマンドを実行する最も簡単な方法は、対話型セッションを開始することです。

セッションが開始されると、入力したコマンドは、仮想マシン自体の PowerShell セッションに直接入力したのと同様に、仮想マシン上で実行されます。

対話型セッションを開始するには:

  1. Hyper-V ホストで、管理者として PowerShell を開きます。

  2. 次のいずれかのコマンドを実行して、仮想マシン名または GUID を使用して対話型セッションを作成します。

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

    メッセージが表示されたら、仮想マシンの資格情報を指定します。

  3. 仮想マシンでコマンドを実行します。 次のように、PowerShell プロンプトのプレフィックスとして VMName が表示されます。

    [VMName]: PS C:\>
    

    すべてのコマンドの実行は、仮想マシン上で実行されます。 テストするには、 ipconfig または hostname を実行して、これらのコマンドが仮想マシンで実行されていることを確認します。

  4. 完了したら、次のコマンドを実行してセッションを閉じます。

     Exit-PSSession 
    

セッションが接続されない場合は、考えられる原因の トラブルシューティングを 参照してください。

これらのコマンドレットの詳細については、「 Enter-PSSession 」および 「Exit-PSSession」を参照してください。

Invoke-Command を使用してスクリプトまたはコマンドを実行する

Invoke-Command を使用した PowerShell Direct は、仮想マシン上で 1 つのコマンドまたは 1 つのスクリプトを実行する必要があるが、その時点を超えて仮想マシンとの対話を続行する必要がない状況に最適です。

1 つのコマンドを実行するには:

  1. Hyper-V ホストで、管理者として PowerShell を開きます。

  2. 次のいずれかのコマンドを実行して、仮想マシン名または GUID を使用してセッションを作成します。

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

    メッセージが表示されたら、仮想マシンの資格情報を指定します。

    このコマンドは仮想マシンで実行され、コンソールに出力がある場合はコンソールに出力されます。 接続は、コマンドが実行されるとすぐに自動的に閉じられます。

スクリプトを実行するには:

  1. Hyper-V ホストで、管理者として PowerShell を開きます。

  2. 次のいずれかのコマンドを実行して、仮想マシン名または GUID を使用してセッションを作成します。

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

    メッセージが表示されたら、仮想マシンの資格情報を指定します。

    スクリプトは仮想マシン上で実行されます。 接続は、コマンドが実行されるとすぐに自動的に閉じられます。

このコマンドレットの詳細については、「 Invoke-Command」を参照してください。

New-PSSession と Copy-Item を使用してファイルをコピーする

PowerShell Direct では、Windows ビルド 14280 以降の永続的なセッションのみがサポートされます

永続的な PowerShell セッションは、1 つ以上のリモート マシン間でアクションを調整するスクリプトを記述する場合に非常に便利です。 作成されると、永続的なセッションは、削除するまでバックグラウンドに存在します。 つまり、資格情報を渡さずに、 Invoke-Command または Enter-PSSession で同じセッションを何度も繰り返し参照できます。

同じトークンによって、セッションは状態を保持します。 永続的なセッションは保持されるため、セッションで作成された変数またはセッションに渡された変数は、複数の呼び出しで保持されます。 永続的なセッションを操作するために使用できるツールは多数あります。 この例では、 New-PSSessionCopy-Item を使用して、ホストから仮想マシン、および仮想マシンからホストにデータを移動します。

セッションを作成するには、ファイルをコピーします。

  1. Hyper-V ホストで、管理者として PowerShell を開きます。

  2. 次のいずれかのコマンドを実行し、 New-PSSessionを使用して仮想マシンへの永続的な PowerShell セッションを作成します。

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

    メッセージが表示されたら、仮想マシンの資格情報を指定します。

    Warnung

    14500 より前のビルドにはバグがあります。 -Credential フラグで資格情報が明示的に指定されていない場合、ゲスト内のサービスはクラッシュし、再起動する必要があります。 この問題が発生した場合は、「 エラー: リモート セッションが終了した可能性があります」セクションの回避策の手順を参照してください。

  3. 仮想マシンにファイルをコピーします。

    ホスト マシンから仮想マシンに C:\host_path\data.txt をコピーするには、次のコマンドを実行します。

    Copy-Item -ToSession $s -Path C:\host_path\data.txt -Destination C:\guest_path\
    
  4. 仮想マシン (オン) からホストにファイルをコピーします。

    仮想マシンからホストに C:\guest_path\data.txt をコピーするには、次のコマンドを実行します。

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

    Remove-PSSession $s
    

トラブルシューティング

PowerShell Direct を介して表示される一般的なエラー メッセージの小さなセットがあります。 次のセクションでは、最も一般的なエラー メッセージ、いくつかの原因、および問題を診断するためのツールについて説明します。

-VMName パラメーターまたは -VMID パラメーターが存在しない

問題:

Enter-PSSessionInvoke-Command、または New-PSSession-VMName または -VMId パラメーターがありません。

考えられる原因:

最も可能性の高い問題は、PowerShell Direct がホスト オペレーティング システムでサポートされていないことです。

次のコマンドを実行して、Windows ビルドを確認できます。

[System.Environment]::OSVersion.Version

サポートされているビルドを実行している場合は、PowerShell のバージョンで PowerShell Direct が実行されない可能性もあります。 PowerShell Direct と JEA の場合、メジャー バージョンは 5 以降である必要があります。

次のコマンドを実行して、PowerShell バージョンのビルドを確認できます。

$PSVersionTable.PSVersion

エラー: リモート セッションが終了した可能性がある

ホスト ビルド 10240 と 12400 の間の Enter-PSSession では、以下のすべてのエラーが "リモート セッションが終了した可能性があります" と報告されます。

エラーメッセージ:

Enter-PSSession: Windows PowerShell で処理できないエラーが発生しました。 リモート セッションが終了した可能性があります。

考えられる原因:

  • 仮想マシンは存在しますが、実行されていません。
  • ゲスト OS は PowerShell Direct をサポートしていません。 要件を参照してください。
  • PowerShell はまだゲストで使用できません
    • オペレーティング システムの起動が完了していない
    • オペレーティング システムが正しく起動できない
    • 一部のブート時間イベントにはユーザー入力が必要です

Get-VM コマンドレットを使用して、ホストで実行されている VM を確認できます。

エラーメッセージ:

New-PSSession: Windows PowerShell で処理できないエラーが発生しました。 リモート セッションが終了した可能性があります。

考えられる原因:

  • 上記の理由の 1 つは、すべて同じように適用されます。 New-PSSession
  • -Credentialを使用して資格情報を明示的に渡す必要がある、現在のビルドのバグ。 この場合、サービス全体がゲスト オペレーティング システムでハングし、再起動する必要があります。 Enter-PSSession でセッションがまだ使用可能かどうかを確認できます。

資格情報の問題を回避するには、VMConnect を使用して仮想マシンにログインし、PowerShell を開き、次の PowerShell を使用して vmicvmsession サービスを再起動します。

Restart-Service -Name vmicvmsession

エラー: パラメーター セットを解決できません

エラーメッセージ:

Enter-PSSession: 指定した名前付きパラメーターを使用してパラメーター セットを解決できません。

考えられる原因:

  • -RunAsAdministrator は、仮想マシンに接続する場合はサポートされません。

    Windows コンテナーに接続する場合、 -RunAsAdministrator フラグを使用すると、明示的な資格情報なしで管理者接続が許可されます。 仮想マシンはホストに暗黙的な管理者アクセス権を付与しないため、資格情報を明示的に入力する必要があります。

管理者の資格情報は、 -Credential パラメーターを使用して仮想マシンに渡すか、プロンプトが表示されたら手動で入力します。

エラー: 資格情報が無効です

エラーメッセージ:

Enter-PSSession: 資格情報が無効です。

考えられる原因:

  • ゲスト資格情報を検証できませんでした
    • 指定された資格情報が正しくありません。
    • ゲストにユーザー アカウントがありません (OS は以前に起動していません)
    • 管理者として接続する場合: 管理者がアクティブ ユーザーとして設定されていません。 詳細については、「 組み込みの管理者アカウントを有効または無効にする」を参照してください。

エラー: 入力 VMName パラメーターはどの仮想マシンにも解決されません。

エラーメッセージ:

Enter-PSSession: 入力 VMName パラメーターはどの仮想マシンにも解決されません。

考えられる原因:

  • Hyper-V 管理者ではありません。
  • 仮想マシンが存在しません。

Get-VM コマンドレットを使用して、使用している資格情報に Hyper-V 管理者ロールがあることを確認し、ホスト上でローカルで実行され起動されている VM を確認できます。

サンプルとユーザー ガイド

PowerShell Direct では、Just Enough Administration (JEA) がサポートされます。

GitHub でサンプルを確認してください。