Home > Windows にまつわる e.t.c.

Move-VM を Invoke-Command する時のエラー回避方法


今回やろうとしたのはこんな事です。

 

VM のライブ マイグレーションを Invoke-Command しようとしたらエラーになっちゃいました。

PS C:\> Invoke-Command "Host001" -Credential "hogehoge\administrator" -ScriptBlock $Function:MoveVM -ArgumentList "Host002"
この操作を実行するアクセス許可がありません。この操作を実行するアクセス許可があると思われる場合は、管理者に問い合わせてください。
    + CategoryInfo          : PermissionDenied: (:) [Move-VM], VirtualizationOperationFailedException
    + FullyQualifiedErrorId : AccessDenied,Microsoft.HyperV.PowerShell.Commands.MoveVMCommand
    + PSComputerName        : Host001

Invoke-Command した関数

# 全ての VM を Live Migration する
function MoveVM($DestHost){
    [array]$VMs = Get-VM
    foreach( $VM in $VMs ){
        Move-VM -VM $VM -DestinationHost $DestHost -IncludeStorage
    }
}

このエラーが起きる原因は、ライブ マイグレーションをする際に、マイグレーション元からマイグレーション先へのリモート操作が入り、その際に PowerShell の仕様で Next Hop 処理が default 禁止されている制限に引っかかったからです。
(当分悩んだのはナイショ w)

この問題を回避するには、Next Hop 処理を許可します。
Next Hop 処理を許可するには、Credssp を有効にして -Authentication Credssp オプションで Invoke-Command します。

 

Hyper-V Host の Credssp を有効にする

Server 側の Credssp の状態を確認するには、winrm get winrm/config/service コマンドを使います。

PS C:\> winrm get winrm/config/service
Service
    RootSDDL = O:NSG:BAD:P(A;;GA;;;BA)(A;;GR;;;IU)S:P(AU;FA;GA;;;WD)(AU;SA;GXGW;;;WD)
    MaxConcurrentOperations = 4294967295
    MaxConcurrentOperationsPerUser = 1500
    EnumerationTimeoutms = 240000
    MaxConnections = 300
    MaxPacketRetrievalTimeSeconds = 120
    AllowUnencrypted = false
    Auth
        Basic = false
        Kerberos = true
        Negotiate = true
        Certificate = false
        CredSSP = false
        CbtHardeningLevel = Relaxed
    DefaultPorts
        HTTP = 5985
        HTTPS = 5986
    IPv4Filter = *
    IPv6Filter = *
    EnableCompatibilityHttpListener = false
    EnableCompatibilityHttpsListener = false
    CertificateThumbprint
    AllowRemoteAccess = true

この例では CredSSP が無効になっています。

PowerShell のコマンドレットで確認する場合は、Get-WSManCredSSP を使います。

PS C:\> Get-WSManCredSSP
このコンピューターは、新しい資格情報の委任を許可するようには構成されていません。
このコンピューターは、リモート クライアント コンピューターから資格情報を受け取るように構成されていません。

 

CredSSP を有効にするには、以下コマンドレットを使います

Enable-WSManCredSSP -Role Server -Force

 

PS C:\> Enable-WSManCredSSP -Role Server -Force


cfg               : http://schemas.microsoft.com/wbem/wsman/1/config/service/auth
lang              : ja-JP
Basic             : false
Kerberos          : true
Negotiate         : true
Certificate       : false
CredSSP           : true
CbtHardeningLevel : Relaxed

 

これで Hyper-V ホスト側の準備ができました。

 

管理サーバーの Credssp を有効にする

Credssp は、Invoke-Command の受け側の Server だけではなく、Invoke-Command を送る側の Client でも有効にする必要があります。

Client 側の Credssp の状態を確認するには、winrm get winrm/config/client コマンドを使います。

PS C:\> winrm get winrm/config/client
Client
    NetworkDelayms = 5000
    URLPrefix = wsman
    AllowUnencrypted = false
    Auth
        Basic = true
        Digest = true
        Kerberos = true
        Negotiate = true
        Certificate = true
        CredSSP = false
    DefaultPorts
        HTTP = 5985
        HTTPS = 5986
    TrustedHosts = *

 

CredSSP が無効になっています。

PowerShell のコマンドレットで確認する場合も、Get-WSManCredSSP を使います。

PS C:\> Get-WSManCredSSP
このコンピューターは、新しい資格情報の委任を許可するようには構成されていません。
このコンピューターは、リモート クライアント コンピューターから資格情報を受け取るように構成されています。

 

Client 側の CredSSP を有効にするには、以下コマンドレットを使います

Enable-WSManCredSSP -Role Client -DelegateComputer * -Force

 

PS C:\> Enable-WSManCredSSP -Role Client -DelegateComputer * -Force


cfg         : http://schemas.microsoft.com/wbem/wsman/1/config/client/auth
lang        : ja-JP
Basic       : true
Digest      : true
Kerberos    : true
Negotiate   : true
Certificate : true
CredSSP     : true

 

Invoke-Command を Credssp で実行する

準備ができたので、Invoke-Command を Credssp で実行します。

Credssp で実行するには、-Authentication Credssp オプションを使います。

Invoke-Command 投入先 -ScriptBlock [Move-VM] -Authentication Credssp

 

PS C:\> Invoke-Command "Host001" -Credential "hogehoge\administrator" -ScriptBlock $Function:MoveVM -ArgumentList "Host002" -Authentication Credssp

 

これで、Move-VM の Invoke-Command が出来ました。
-AsJob で Invoke-Command すると同時並行でライブマイグレーションが出来るのがうれしいですね。

Enter-PSSession も同じなので、Enter-PSSession で Move-VM する場合も -Authentication Credssp オプションを使います。

 

参考情報

Windows PowerShell: 次ホップを実行する
https://technet.microsoft.com/ja-jp/library/jj853299.aspx

リモート コンピューターのバッチ操作(Invoke-Command)
http://www.vwnet.jp/Windows/PowerShell/InvokeCommand.htm

PowerShell で仮想マシンをライブマイグレーションする
http://www.vwnet.jp/Windows/WS12R2/MoveVM/MoveVMbyPS.htm

仮想マシンの移動設定
http://www.vwnet.jp/Windows/WS12R2/MoveVMSetting/MoveVMSet.htm

 

 

back.gif (1980 バイト)

home.gif (1907 バイト)

Copyright © MURA All rights reserved.