从主机设置 vm 的 ip 地址时出错

error while setting ip address of vm from host

3 天以来,我一直在尝试 运行 下面的 powershell 脚本,但出现错误。

如果我设置 $NetworkSettings[0].ProtocolIFType = 4096,则 $job.jobstate 给出值 =10(例外情况)。 如果我只是注释掉 - $NetworkSettings[0].ProtocolIFType = 4096,脚本执行成功但 VM 的 IP 地址未更改。

 Function Set-VMNetworkConfiguration {
[CmdletBinding()]
Param (
    [Parameter(Mandatory=$true,
               Position=1,
               ParameterSetName='DHCP',
               ValueFromPipeline=$true)]
    [Parameter(Mandatory=$true,
               Position=0,
               ParameterSetName='Static',
               ValueFromPipeline=$true)]
    [Microsoft.HyperV.PowerShell.VMNetworkAdapter]$NetworkAdapter,

    [Parameter(Mandatory=$true,
               Position=1,
               ParameterSetName='Static')]
    [String[]]$IPAddress=@(),

    [Parameter(Mandatory=$false,
               Position=2,
               ParameterSetName='Static')]
    [String[]]$Subnet=@(),

    [Parameter(Mandatory=$false,
               Position=3,
               ParameterSetName='Static')]
    [String[]]$DefaultGateway = @(),

    [Parameter(Mandatory=$false,
               Position=4,
               ParameterSetName='Static')]
    [String[]]$DNSServer = @(),

    [Parameter(Mandatory=$false,
               Position=0,
               ParameterSetName='DHCP')]
    [Switch]$Dhcp
)

$VM = Get-WmiObject -Namespace 'root\virtualization\v2' -Class 'Msvm_ComputerSystem' | Where-Object { $_.ElementName -eq $NetworkAdapter.VMName } 
$VMSettings = $vm.GetRelated('Msvm_VirtualSystemSettingData') | Where-Object { $_.VirtualSystemType -eq 'Microsoft:Hyper-V:System:Realized' }    

$VMNetAdapters = $VMSettings.GetRelated('Msvm_SyntheticEthernetPortSettingData') 

$NetworkSettings = @()
foreach ($NetAdapter in $VMNetAdapters) {
    if ($NetAdapter.Address -eq $NetworkAdapter.MacAddress) {
        $NetworkSettings = $NetworkSettings + $NetAdapter.GetRelated("Msvm_GuestNetworkAdapterConfiguration")
    }
}

$NetworkSettings[0].IPAddresses = $IPAddress
$NetworkSettings[0].Subnets = $Subnet
$NetworkSettings[0].DefaultGateways = $DefaultGateway
$NetworkSettings[0].DNSServers = $DNSServer
$NetworkSettings[0].ProtocolIFType = 4096

if ($dhcp) {
    $NetworkSettings[0].DHCPEnabled = $true
} else {
    $NetworkSettings[0].DHCPEnabled = $false
}

$Service = Get-WmiObject -Class "Msvm_VirtualSystemManagementService" -Namespace "root\virtualization\v2"
$setIP = $Service.SetGuestNetworkAdapterConfiguration($VM, $NetworkSettings[0].GetText(1))

if ($setip.ReturnValue -eq 4096) {
    $job=[WMI]$setip.job 

    while ($job.JobState -eq 3 -or $job.JobState -eq 4) {
        start-sleep 1
        $job=[WMI]$setip.job
    }
    write-host "**jobstate = $job.JobState "
    if ($job.JobState -eq 7) {
        write-host "Success"
    }
    else {
        $job.GetError()
    }
} elseif($setip.ReturnValue -eq 0) {
    Write-Host "Success"
}

}

Get-VMNetworkAdapter -VMName uebase | Set-VMNetworkConfiguration -IPAddress 10.101.5.198 -Subnet 255.255.255.0 -DefaultGateway 10.101.5.1

脚本对我来说运行良好。

我觉得有几点可能对您有所帮助,

  • 检查网络适配器状态。
  • 确保集成服务已启动并更新。

我不确定 SetGuestNetworkAdapterConfiguration 是否适合少数 Linux 位客人。 IP 注入在 Ubuntu 上不起作用,已修复。 https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1360580