# encoding: ascii # api: powershell # title: dvSwitchNetworkAdapter # description: A simple module to temporarily replace the stock PowerCLI networkadapter cmdlets until they work with vdSwitches. Based off LucD’s functions http://www.lucd.info/2010/03/04/dvswitch-scripting-part-8-get-and-set-network-adapters/ # version: 0.1 # type: script # author: glnsize # license: CC0 # function: Get-dvSwitchNetworkAdapter # x-poshcode-id: 1895 # x-archived: 2016-03-18T21:32:59 # x-published: 2011-06-03T12:06:00 # # <# .SYNOPSIS Retrieves the virtual network adapters available on a vSphere server. .DESCRIPTION A replacement for the default cmdlet will work with either a standard vSwitch or a dvSwitch. Retrieves the virtual network adapters available on a vSphere server. .PARAMETER VM Specify the virtual machines from which you want to retrieve virtual network adapters. .EXAMPLE Get-VM | Get-dvSwitchNetworkAdapter .OUTPUTS PSObject .LINK Set-dvSwitchNetworkAdapter #> Function Get-dvSwitchNetworkAdapter { [cmdletbinding()] param( [parameter(Mandatory = $true, ValueFromPipeline = $true)] [VMware.VimAutomation.Client20.VirtualMachineImpl[]] $VM ) process { Foreach ($VirtualMachine in (get-view -VIObject $VM -Property "Config.Hardware.Device","Network")) { $VirtualVmxnets = $VirtualMachine.Config.Hardware.Device | Where-Object {"VirtualEthernetCard","VirtualVmxnet" -contains $_.GetType().BaseType.Name} Foreach ($VirtualVmxnet in $VirtualVmxnets) { New-Object PSObject -Property @{ MacAddress = $VirtualVmxnet.MacAddress WakeOnLanEnabled = $VirtualVmxnet.WakeOnLanEnabled NetworkName = switch ($VirtualVmxnet.Backing.GetType().Name) { "VirtualEthernetCardNetworkBackingInfo" { Get-View $VirtualVmxnet.Backing.network -Property 'Name'| Select-Object -ExpandProperty 'Name' } Default { Get-view -ID $VirtualMachine.Network -Property 'Name','Key' | Where-Object {$_.Key -eq $VirtualVmxnet.Backing.Port.PortgroupKey} | Select-Object -ExpandProperty 'Name' } } Type = $VirtualVmxnet.GetType().Name ParentId = $VirtualMachine.MoRef.Type + "-" + $VirtualMachine.MoRef.Value ConnectionState = New-Object PSObject -Property @{ Connected = $VirtualVmxnet.Connectable.Connected StartConnected = $VirtualVmxnet.Connectable.StartConnected } Id = "{0}-{1}/{2}" -f $VirtualMachine.MoRef.Type,$VirtualMachine.MoRef.Value, $VirtualVmxnet.Key Name = $VirtualVmxnet.DeviceInfo.Label } } } } } <# .SYNOPSIS Changes the configuration of the virtual network adapter. .DESCRIPTION A replacement for the default cmdlet will work with either a standard vSwitch or a dvSwitch. Changes the configuration of the virtual network adapter. .PARAMETER NetworkAdapter Specify the name of the network to which you want to connect the virtual network adapter. NetworkName must be globally unique within vSphere. .PARAMETER NetworkName Specify the virtual network adapter you want to configure. .PARAMETER StartConnected If the value is $true, the virtual network adapter starts connected when its associated virtual machine powers on. If the value is $false, it starts disconnected. If Nothing is Supplied than nothing will be changed. .PARAMETER Connected If the value is $true, the virtual network adapter is connected after its creation. If the value is $false, it is disconnected. If Nothing is Supplied than nothing will be changed. .RunAsync If supplied then the cmdlet will not wait for the completion of the network reconfiguration. Instead a Task object will be returned and the cmdlet will process the next object in the pipeline. .EXAMPLE Get-VM | Get-dvSwitchNetworkAdapter | Where-object{$_.NetworkName -eq "192.168.1.0"}| Set-dvSwitchNetworkAdapter -NetworkName "dvSwitch0_192.168.1.0" .EXAMPLE Get-VM | Get-dvSwitchNetworkAdapter | Set-dvSwitchNetworkAdapter -StartConnected $True .OUTPUTS PSObject .LINK Get-dvSwitchNetworkAdapter #> Function Set-dvSwitchNetworkAdapter { [cmdletbinding(SupportsShouldProcess=$true)] param( [parameter(Mandatory = $true, ValueFromPipeline = $true)] [PSCustomObject[]] $NetworkAdapter , [parameter(Mandatory = $false)] [string] $NetworkName , [parameter()] [bool] $StartConnected , [parameter()] [bool] $Connected , [parameter()] [switch] $RunAsync ) process { Foreach ($netAdapter in $NetworkAdapter) { $VirtualMachine = Get-View $netAdapter.ParentId -Property 'Runtime.Host','Config.Hardware.Device','Name' $HostSystem = Get-View -ID $VirtualMachine.Runtime.Host -Property 'Network','Name' $VirtualDeviceConfigSpec = New-Object VMware.Vim.VirtualDeviceConfigSpec $VirtualDeviceConfigSpec.operation = "edit" Try { $VirtualDeviceConfigSpec.device = $VirtualMachine.Config.Hardware.Device | Where-Object {$_.GetType().Name -eq $netAdapter.Type -and $_.MacAddress -eq $netAdapter.MacAddress} } Catch { write-warning "$($netAdapter.Name) not found on $($VirtualMachine.name)" break; } $Msg = "" if ($NetworkName) { $Network = Get-View -Id $HostSystem.Network -Property 'Name','Config' | Where-Object { $_.Name -eq $NetworkName } if ($Network) { $Msg += "Connecting $($netAdapter.Name) to $($NetworkName) " # Determine backing type switch($Network.GetType().Name) { "Network" { $VirtualDeviceConfigSpec.device.backing = New-Object VMware.Vim.VirtualEthernetCardNetworkBackingInfo $VirtualDeviceConfigSpec.device.backing.deviceName = $NetworkName } "DistributedVirtualPortgroup" { $VirtualDeviceConfigSpec.device.Backing = New-Object VMware.Vim.VirtualEthernetCardDistributedVirtualPortBackingInfo $VirtualDeviceConfigSpec.device.backing.port = New-Object VMware.Vim.DistributedVirtualSwitchPortConnection $VirtualDeviceConfigSpec.device.backing.port.switchUuid = (Get-View $Network.Config.DistributedVirtualSwitch).Uuid $VirtualDeviceConfigSpec.device.backing.port.portgroupKey = $Network.Config.Key } } } Else { Write-Warning "$($NetworkName) was not found on $($HostSystem.Name)" } } if ($PSCmdlet.MyInvocation.BoundParameters.Connected -ne $null) { $Msg += "Connected:$($Connected) " $VirtualDeviceConfigSpec.Device.Connectable.Connected = $Connected } Else { $VirtualDeviceConfigSpec.Device.Connectable.Connected = $netAdapter.ConnectionState.Connected } if ($PSCmdlet.MyInvocation.BoundParameters.StartConnected -ne $null) { $Msg += "StartConnected:$($StartConnected) " $VirtualDeviceConfigSpec.Device.Connectable.StartConnected = $StartConnected } Else { $VirtualDeviceConfigSpec.Device.Connectable.StartConnected = $netAdapter.ConnectionState.StartConnected } $VirtualMachineConfigSpec = New-Object VMware.Vim.VirtualMachineConfigSpec $VirtualMachineConfigSpec.deviceChange += $VirtualDeviceConfigSpec IF ($PSCmdlet.ShouldProcess($VirtualMachine.Name,$Msg)) { $Task = Get-VIObjectByVIView -MORef $VirtualMachine.ReconfigVM_Task($VirtualMachineConfigSpec) if (-Not $RunAsync) { Wait-Task -Task $Task | Out-Null $returnNetworkAdapter = $netAdapter $returnNetworkAdapter.NetworkName = $NetworkName $returnNetworkAdapter.ConnectionState.StartConnected = $VirtualDeviceConfigSpec.Device.Connectable.StartConnected $returnNetworkAdapter.ConnectionState.Connected = $VirtualDeviceConfigSpec.Device.Connectable.Connected $returnNetworkAdapter } else { $task } } } } } New-Alias -Name Get-NetworkAdapter -Value Get-dvSwitchNetworkAdapter New-Alias -Name Set-NetworkAdapter -Value Set-dvSwitchNetworkAdapter Export-ModuleMember -Function Get-dvSwitchNetworkAdapter, Set-dvSwitchNetworkAdapter -Alias Get-NetworkAdapter,Set-NetworkAdapter