2016-06-29 9 views
0

Я пишу сценарий на хосте HYPER-V для получения гостевой информации о виртуальных машинах. Есть ли способ получить имя операционной системы виртуальной машины от Hyper-V с помощью powershell?Есть ли способ получить имя операционной системы виртуальной машины от Hyper-V с помощью powershell?

Существует несколько примеров использования (Get-WmiObject Win32_OperatingSystem -ComputerName $vmName).name, но я должен получить эту информацию непосредственно из Hyper-V из-за ограничений домена.

Также я использую гипер-v модуль powershell, но я не видел никаких командлетов, связанных с ОС.

+0

Вы уже изучили [Msvm_VirtualSystemManagementService класс] (https://msdn.microsoft.com/en-us/library/hh850062 (v = vs.85) .aspx)? – vonPryz

ответ

1

Это может быть извлечено из внутренних элементов обмена гостей.

# Filter for parsing XML data 
filter Import-CimXml 
{ 
    # Create new XML object from input 
    $CimXml = [Xml]$_ 
    $CimObj = New-Object -TypeName System.Object 

    # Iterate over the data and pull out just the value name and data for each entry 
    foreach ($CimProperty in $CimXml.SelectNodes("/INSTANCE/PROPERTY[@NAME='Name']")) 
     { 
     $CimObj | Add-Member -MemberType NoteProperty -Name $CimProperty.NAME -Value $CimProperty.VALUE 
     } 

    foreach ($CimProperty in $CimXml.SelectNodes("/INSTANCE/PROPERTY[@NAME='Data']")) 
     { 
     $CimObj | Add-Member -MemberType NoteProperty -Name $CimProperty.NAME -Value $CimProperty.VALUE 
     } 

    # Display output 
    $CimObj 
} 

# Prompt for the Hyper-V Server to use 
$HyperVServer = Read-Host "Specify the Hyper-V Server to use (enter '.' for the local computer)" 

# Prompt for the virtual machine to use 
$VMName = Read-Host "Specify the name of the virtual machine" 

# Get the virtual machine object 
$query = "Select * From Msvm_ComputerSystem Where ElementName='" + $VMName + "'" 
$Vm = gwmi -namespace root\virtualization\v2 -query $query -computername $HyperVServer 

# Get the KVP Object 
$query = "Associators of {$Vm} Where AssocClass=Msvm_SystemDevice ResultClass=Msvm_KvpExchangeComponent" 
$Kvp = gwmi -namespace root\virtualization\v2 -query $query -computername $HyperVServer 

Write-Host 
Write-Host "Guest KVP information for" $VMName 

# Filter the results 
try { 
    $Kvp.GuestIntrinsicExchangeItems | Import-CimXml | where Name -eq "OSName" 
} 
catch { 
    Write-Host "Not found" 
} 

От Ben Armstrong’s Virtualization Blog.

+0

Это действительно хороший ответ. Но это не сработает, если VM не работает, поскольку на самом деле ни одно из решений не будет работать, если машина не работает. +1 –

1

Если вы не используете SCVMM, детали гостевой ОС недоступны с помощью командлетов Hyper-V PowerShell.

Вы должны запросить сам Гость, как вы уже нашли.