param( [Parameter(Mandatory)] [string]$VMName ) $ns = 'root\virtualization\v2' $vm = Get-CimInstance -Namespace $ns -ClassName Msvm_ComputerSystem -Filter "ElementName = '$VMName'" if (-not $vm) { throw "VM '$VMName' not found." } $kvp = Get-CimAssociatedInstance -InputObject $vm -Association Msvm_SystemDevice | Where-Object CimClass -match 'Msvm_KvpExchangeComponent' # Intrinsic (Basic) Data $intrinsic = @() if ($kvp.GuestIntrinsicExchangeItems) { foreach ($xml in $kvp.GuestIntrinsicExchangeItems) { $x = [xml]$xml $intrinsic += [pscustomobject]@{ Name = $x.INSTANCE.PROPERTY | Where-Object { $_.Name -eq 'Name' } | Select-Object -Expand Value Data = $x.INSTANCE.PROPERTY | Where-Object { $_.Name -eq 'Data' } | Select-Object -Expand Value Source= 'Intrinsic' } } } # Exchange Data $exchange = @() if ($kvp.GuestExchangeItems) { foreach ($xml in $kvp.GuestExchangeItems) { $x = [xml]$xml $exchange += [pscustomobject]@{ Name = $x.INSTANCE.PROPERTY | Where-Object { $_.Name -eq 'Name' } | Select-Object -Expand Value Data = $x.INSTANCE.PROPERTY | Where-Object { $_.Name -eq 'Data' } | Select-Object -Expand Value Source= 'Exchange' } } } # Network Adapter info for Windows VM $networkInfo = @() $i = 0 Get-VMNetworkAdapter -VMName $vmname | ForEach-Object { $allIPs = $_.IPAddresses | Where-Object { $_ } $ipv4 = $allIPs | Where-Object { $_ -match '^\d{1,3}(\.\d{1,3}){3}$' -and $_ -notlike '169.254.*' } $ipv6 = $allIPs | Where-Object { $_ -match ':' } #$data = [ordered]@{ $data = [pscustomobject]@{ Name = $_.Name MacAddress = $_.MacAddress IPv4 = $ipv4 -join ', ' IPv6 = $ipv6 -join ', ' } $networkInfo += [pscustomobject]@{ Name = "NetworkAdapter$($i)" Data = $data Source = "Get-VM" } $i++ } $all = $intrinsic + $exchange + $networkInfo $all