Сценарии PowerShell для Hyper-V и WMI. Использование компонента интеграции обмена парами ключ-значение (KVP Exchange integration component). Часть 2 — Добавление новых элементов из родительского раздела

В прошлый раз мы рассмотрели «Компонент интеграции обмена парами ключ-значение» (Key Value Pair, KVP Exchange Integration Component). Теперь мы знаем, какие уже есть внутренние (intrinsic) KVP, как получить текущие значения KVP и как их расшифровать.

Одни KVP доступны из родительского раздела и несут информацию о гостевой ОС (Fully Qualified Domain Name, OS Version, Processor Architecture и т.д.). Есть также KVP, доступные из гостевой ОС и содержащие информацию о родительском разделе — такие, как HostName, PhysicalHostName, PhysicalHostNameFullyQualified и VirtualMachineName. Эти значения хранятся в реестре в ветке «HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Virtual Machine\Guest\Parameters».

С помощью KVP мы можем из родительского раздела записать ключи в реестр гостевой ОС, а также прочитать в родительском разделе ключи, переданные из гостевого раздела. Это реализуется с помощью метода AddKvpItems класса Msvm_VirtualSystemManagementService. Сейчас мы рассмотрим пример передачи ключей от родительского раздела в гостевые.

Сценарий PowerShell Add-KVP.ps1

$ComputerName = "localhost"

$VMManagementService = Get-WmiObject -class "Msvm_VirtualSystemManagementService" -namespace "root\virtualization" -ComputerName $ComputerName

$Vm = Get-WmiObject -Namespace root\virtualization -ComputerName $ComputerName -Query "Select * From Msvm_ComputerSystem Where ElementName='Vista'"

$Kvp = Get-WmiObject -Namespace root\virtualization -ComputerName $ComputerName -Query "Associators of {$Vm} Where AssocClass=Msvm_SystemDevice ResultClass=Msvm_KvpExchangeComponent"

$Msvm_KvpExchangeDataItemPath = "\\$ComputerName\root\virtualization:Msvm_KvpExchangeDataItem"

$Msvm_KvpExchangeDateItem = ([WmiClass]$Msvm_KvpExchangeDataItemPath).CreateInstance()

$Msvm_KvpExchangeDateItem.Name = "Test4"

$Msvm_KvpExchangeDateItem.Data = "Testing"

$Msvm_KvpExchangeDateItem.Source = 0

$VMManagementService.AddKvpItems($Vm, $Msvm_KvpExchangeDateItem.PSBase.GetText(1))

Мы записали из родительского раздела ключ «Test4» и теперь можем увидеть в реестре гостевой ОС по адресу «HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Virtual Machine\External».

В следующей статье мы поговорим о том, как передаваемые ключи добавляются в гостевые разделы, а также о том, как их можно считать из родительского раздела.