Módulo da Fonte de Dados de Descoberta da Máquina Virtual

Microsoft.Windows.HyperV.Discovery.VirtualMachineDiscoveryDataSourceModule (DataSourceModuleType)

Módulo da Fonte de Dados de Descoberta de Máquina Virtual do Microsoft Windows Hyper-V 2016 e 1709+

Element properties:

TypeDataSourceModuleType
IsolationAny
AccessibilityInternal
RunAsSystem.PrivilegedMonitoringAccount
OutputTypeSystem.Discovery.Data

Member Modules:

ID Module Type TypeId RunAs 
DataSource DataSource Microsoft.Windows.TimedPowerShell.DiscoveryProvider Default

Overrideable Parameters:

IDParameterTypeSelectorDisplay NameDescription
IntervalSecondsint$Config/IntervalSeconds$Intervalo em SegundosIntervalo em Segundos
TimeoutSecondsint$Config/TimeoutSeconds$Tempo Limite (segundos)Tempo Limite (segundos)
SyncTimestring$Config/SyncTime$Tempo de SincronizaçãoTempo de Sincronização

Source Code:

<DataSourceModuleType ID="Microsoft.Windows.HyperV.Discovery.VirtualMachineDiscoveryDataSourceModule" Accessibility="Internal" RunAs="System!System.PrivilegedMonitoringAccount" Batching="false">
<Configuration>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="IntervalSeconds" type="xsd:integer"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="TimeoutSeconds" type="xsd:integer"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="0" name="SyncTime" type="xsd:string"/>
</Configuration>
<OverrideableParameters>
<OverrideableParameter ID="IntervalSeconds" Selector="$Config/IntervalSeconds$" ParameterType="int"/>
<OverrideableParameter ID="TimeoutSeconds" Selector="$Config/TimeoutSeconds$" ParameterType="int"/>
<OverrideableParameter ID="SyncTime" Selector="$Config/SyncTime$" ParameterType="string"/>
</OverrideableParameters>
<ModuleImplementation Isolation="Any">
<Composite>
<MemberModules>
<DataSource ID="DataSource" TypeID="Windows!Microsoft.Windows.TimedPowerShell.DiscoveryProvider">
<IntervalSeconds>$Config/IntervalSeconds$</IntervalSeconds>
<SyncTime>$Config/SyncTime$</SyncTime>
<ScriptName>DiscoverHyperV2016+VirtualMachine.ps1</ScriptName>
<ScriptBody><Script>
#Copyright (c) Microsoft Corporation. All rights reserved.
param($SourceId, $ManagedEntityId, $ComputerIdentity)

# Common Functions

function IsHigherThanWin2008
{
$osVersion = New-Object "Version" ([Environment]::OSVersion.Version.Major -As [Int32]), ([Environment]::OSVersion.Version.Minor -As [Int32]);
$osVersionTill2008=New-Object "Version" 6,1;
if ($osVersion -gt $osVersionTill2008)
{
return $true;
}
else
{
return $false;
}
}

function ThrowScriptError
{
param($msg, $errorDetails)
$errorMsg = $msg + $errorDetails;
$oApi.LogScriptEvent("DiscoverHyperV2016+VirtualMachine.ps1", 1000, 1, $errorMsg);
}

function ThrowScriptInfo
{
param($msg)
$oApi.LogScriptEvent("DiscoverHyperV2016+VirtualMachine.ps1", 1000, 4, $msg);
}
# End Common Functions

function DiscoverVirtualNetworkAdapters()
{
param($vmId, $vmName)

$query = "select InstanceID, HostResource from Msvm_EthernetPortAllocationSettingData where InstanceID LIKE 'Microsoft:" + $vmId + "%'";

if(IsHigherThanWin2008)
{
$nics = @(gcim -Query $query -Namespace $namespace -ComputerName $ComputerIdentity)
}
else
{
$nics = @(gwmi -Query $query -Namespace $namespace -ComputerName $ComputerIdentity)
}
foreach ($nic in $nics)
{
$deviceName = "Network Adapter";
$deviceID = "";
$ConnectedNetworkId = "";
$ConnectedNetworkName = "";
if ( $nic.InstanceID -ne $null)
{
$instanceIdArray = $nic.InstanceID.split("\");
if ($instanceIdArray -ne $null -and $instanceIdArray.Count -gt 1)
{
$deviceID = $instanceIdArray[1];
}
}
if ($nic.HostResource -ne $null)
{
$hostResourceArray = $nic.HostResource.split("`"");
if ($hostResourceArray -ne $null -and $hostResourceArray.Count -gt 3)
{
$ConnectedNetworkId = $hostResourceArray[3];
$switchQuery = "select ElementName from Msvm_VirtualEthernetSwitch where Name = '" + $ConnectedNetworkId + "'";
if(IsHigherThanWin2008)
{
$switches = @(gcim -Query $switchQuery -Namespace $namespace -ComputerName $ComputerIdentity)
}
else
{
$switches = @(gwmi -Query $switchQuery -Namespace $namespace -ComputerName $ComputerIdentity)
}
if ($switches -ne $null -and $switches.Count -gt 0)
{
$ConnectedNetworkName = $switches[0].ElementName;
}
}
}
$oInstance = $oDiscoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Windows.HyperV.Discovery.VirtualNetworkAdapter']$")
$oInstance.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", $deviceName)
$oInstance.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", $ComputerIdentity)
$oInstance.AddProperty("$MPElement[Name='HVLib!Microsoft.Windows.HyperV.ServerRole']/ServerId$", $ComputerIdentity)
$oInstance.AddProperty("$MPElement[Name='HVLib!Microsoft.Windows.HyperV.VirtualMachine']/VirtualMachineId$", $vmId)
$oInstance.AddProperty("$MPElement[Name='HVLib!Microsoft.Windows.HyperV.VirtualHardwareComponent']/DeviceId$", $deviceID)
$oInstance.AddProperty("$MPElement[Name='HVLib!Microsoft.Windows.HyperV.VirtualHardwareComponent']/Name$", $deviceName)
$oInstance.AddProperty("$MPElement[Name='HVLib!Microsoft.Windows.HyperV.VirtualHardwareComponent']/VirtualMachineName$", $vmName)
$oInstance.AddProperty("$MPElement[Name='HVLib!Microsoft.Windows.HyperV.VirtualNetworkAdapter']/ConnectedNetworkId$", $ConnectedNetworkId)
$oInstance.AddProperty("$MPElement[Name='HVLib!Microsoft.Windows.HyperV.VirtualNetworkAdapter']/ConnectedNetworkName$", $ConnectedNetworkName)
$oDiscoveryData.AddInstance($oInstance)


}

if ($error -eq $null -or $error.Count -eq 0)
{
$errormsg = "Successfully discovered Virtual Nic instances ";
ThrowScriptInfo -msg $errormsg
}
else
{
$errormsg = "Failed discovering Virtual Nic instances ";
ThrowScriptError -msg $errormsg -errorDetails $error
$error.Clear();
}
}


function DiscoverVirtualDisks()
{
param($vmId, $vmName)
$query = "select InstanceID, HostResource, ElementName from Msvm_StorageAllocationSettingData where InstanceID LIKE 'Microsoft:" + $vmId + "%'";
if(IsHigherThanWin2008)
{

$vhds = @(gcim -Query $query -Namespace $namespace -ComputerName $ComputerIdentity)

$vhdsvc = gcim -query "SELECT * FROM Msvm_ImageManagementService" -Namespace $namespace -ComputerName $ComputerIdentity;
}
else
{
$vhds = @(gwmi -Query $query -Namespace $namespace -ComputerName $ComputerIdentity)

$vhdsvc = gwmi -query "SELECT * FROM Msvm_ImageManagementService" -Namespace $namespace -ComputerName $ComputerIdentity;
}


foreach ($vhd in $vhds)
{
$deviceID = ""
if ($vhd.InstanceID -ne $null)
{
$deviceID = $vhd.InstanceID;
}

$filePath = ""
$driveType = ""
$deviceName = "Hard Disk"
$hostResourceArray = $vhd.HostResource;
if ($hostResourceArray -ne $null -and $vhdsvc -ne $null)
{
$filePath = $hostResourceArray[0];
if(IsHigherThanWin2008 )
{
$outParams = Invoke-CimMethod -InputObject $vhdsvc[0] -Methodname GetVirtualHardDiskSettingData -Arguments @{Path=$filePath};
}
else
{
$outParams = $vhdsvc.GetVirtualHardDiskSettingData($filePath);
}
$xmlDoc = new-object -comObject 'Microsoft.XMLDOM';
$xmlDoc.async = "false";
$xmlDoc.loadXML($outParams.SettingData)
$xPath = "/INSTANCE/PROPERTY[@NAME='Type']/VALUE/child:text()"
$node = $xmlDoc.selectSingleNode($xPath)
if ($node -ne $null)
{
if ($node.Text -ne "")
{
$driveType = $node.Text;
}
}
}

$oInstance = $oDiscoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Windows.HyperV.Discovery.VirtualDrive']$")
$oInstance.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", $deviceName)
$oInstance.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", $ComputerIdentity)
$oInstance.AddProperty("$MPElement[Name='HVLib!Microsoft.Windows.HyperV.ServerRole']/ServerId$", $ComputerIdentity)
$oInstance.AddProperty("$MPElement[Name='HVLib!Microsoft.Windows.HyperV.VirtualMachine']/VirtualMachineId$", $vmId)
$oInstance.AddProperty("$MPElement[Name='HVLib!Microsoft.Windows.HyperV.VirtualHardwareComponent']/DeviceId$", $deviceID)
$oInstance.AddProperty("$MPElement[Name='HVLib!Microsoft.Windows.HyperV.VirtualHardwareComponent']/Name$", $deviceName)
$oInstance.AddProperty("$MPElement[Name='HVLib!Microsoft.Windows.HyperV.VirtualHardwareComponent']/VirtualMachineName$", $vmName)
$oInstance.AddProperty("$MPElement[Name='HVLib!Microsoft.Windows.HyperV.VirtualDrive']/ImageFile$", $filePath)
$oInstance.AddProperty("$MPElement[Name='HVLib!Microsoft.Windows.HyperV.VirtualDrive']/DriveType$", $driveType)
$oDiscoveryData.AddInstance($oInstance)


$filePathParts = $filePath.split("\");
$driveLetter = "";
if ($filePathParts -ne $null -and $filePathParts.Count -gt 0)
{
$driveLetter = $filePathParts[0].ToUpper();
$oLogicalDisk = $oDiscoveryData.CreateClassInstance("$MPElement[Name='WSDisc!Microsoft.Windows.Server.10.0.LogicalDisk']$")
$oLogicalDisk.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", $ComputerIdentity)
$oLogicalDisk.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.LogicalDevice']/DeviceID$", $driveLetter)

# Create Relationship
$oRelationship = $oDiscoveryData.CreateRelationshipInstance("$MPElement[Name='Microsoft.Windows.Server.10.0.LogicalDisk.Contains.HyperV.2016.VirtualDrive']$")
$oRelationship.Source = $oLogicalDisk;
$oRelationship.Target = $oInstance;
$oDiscoveryData.AddInstance($oRelationship);

}
}


if ($error -eq $null -or $error.Count -eq 0)
{
$errormsg = "Successfully discovered Virtual HardDisk instances ";
ThrowScriptInfo -msg $errormsg
}
else
{
$errormsg = "Failed discovering Virtual HardDisk instances: " ;
ThrowScriptError -msg $errormsg -errorDetails $error
$error.Clear();
}
}


$error.Clear();
$oApi = new-object -comObject 'MOM.ScriptAPI'
$oDiscoveryData = $oApi.CreateDiscoveryData(0, $SourceId, $ManagedEntityId);

$namespace = "root/virtualization/v2";

if(IsHigherThanWin2008)
{
$virtualMachineList = @(gcim -Query "SELECT Name, ElementName FROM MSVM_ComputerSystem" -namespace $namespace -ComputerName $ComputerIdentity);
$hostComputerName = @(gcim Win32_ComputerSystem -Property Name -ComputerName $ComputerIdentity);
}
else
{
$virtualMachineList = @(gwmi -Query "SELECT Name, ElementName FROM MSVM_ComputerSystem" -namespace $namespace -ComputerName $ComputerIdentity);
$hostComputerName = @(gwmi Win32_ComputerSystem -ComputerName $ComputerIdentity);
}

foreach ($oVirtualMachine in $virtualMachineList)
{
if ($oVirtualMachine.Name.ToLowerInvariant() -eq $hostComputerName.Name.ToLowerInvariant())
{
continue;
}

$query = "select GuestIntrinsicExchangeItems from MSVM_KvpExchangeComponent where SystemName='" + $oVirtualMachine.Name + "'";
if(IsHigherThanWin2008)
{
$associators = @(gcim -Query $query -namespace $namespace -ComputerName $ComputerIdentity);
}
else
{
$associators = @(gwmi -Query $query -namespace $namespace -ComputerName $ComputerIdentity);
}
$computerName = "";
if ($associators -ne $null -and $associators.Count -gt 0)
{
$KVP = $associators[0];
if ($KVP -ne $null)
{
$xmlDoc = new-object -comObject 'Microsoft.XMLDOM';
$xmlDoc.async = "false";
if ($KVP.GuestIntrinsicExchangeItems -ne $null)
{
foreach ( $dataItem in $KVP.GuestIntrinsicExchangeItems)
{
$xmlDoc.loadXML($dataItem); #dataItem is in xml
$xPath = "/INSTANCE/PROPERTY[@NAME='Name']/VALUE/child:text()";
$node = $xmlDoc.selectSingleNode($xPath)
if ($node.Text -eq "FullyQualifiedDomainName")
{
$xPath = "/INSTANCE/PROPERTY[@NAME='Data']/VALUE/child:text()" ;
$node = $xmlDoc.selectSingleNode($xPath);
$computerName = $node.Text;
break;
}
}
}
}
}

$oInstance = $oDiscoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Windows.HyperV.Discovery.VirtualMachine']$")
$oInstance.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", $oVirtualMachine.ElementName)
$oInstance.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", $ComputerIdentity)
$oInstance.AddProperty("$MPElement[Name='HVLib!Microsoft.Windows.HyperV.ServerRole']/ServerId$", $ComputerIdentity)
$oInstance.AddProperty("$MPElement[Name='HVLib!Microsoft.Windows.HyperV.VirtualMachine']/VirtualMachineId$", $oVirtualMachine.Name)
$oInstance.AddProperty("$MPElement[Name='HVLib!Microsoft.Windows.HyperV.VirtualMachine']/VirtualMachineName$", $oVirtualMachine.ElementName)
$oInstance.AddProperty("$MPElement[Name='HVLib!Microsoft.Windows.HyperV.VirtualMachine']/ServerName$", $ComputerIdentity)
if ($computerName -ne "")
{
$oInstance.AddProperty("$MPElement[Name='HVLib!Microsoft.Windows.HyperV.VirtualMachine']/ComputerName$", $computerName)
}



$oDiscoveryData.AddInstance($oInstance);

DiscoverVirtualNetworkAdapters -vmId $oVirtualMachine.Name -vmName $oVirtualMachine.ElementName;

DiscoverVirtualDisks -vmId $oVirtualMachine.Name -vmName $oVirtualMachine.ElementName;


}

if ($error -eq $null -or $error.Count -eq 0)
{
$errormsg = "Successfully discovered Virtual Machine instances ";
ThrowScriptInfo -msg $errormsg
}
else
{
$errormsg = "Failed discovering Virtual Machine instances "
ThrowScriptError -msg $errormsg -errorDetails $error
$error.Clear();
}

$oDiscoveryData
</Script></ScriptBody>
<SnapIns/>
<Parameters>
<Parameter>
<Name>SourceID</Name>
<Value>$MPElement$</Value>
</Parameter>
<Parameter>
<Name>ManagedEntityID</Name>
<Value>$Target/Id$</Value>
</Parameter>
<Parameter>
<Name>ComputerIdentity</Name>
<Value>$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$</Value>
</Parameter>
</Parameters>
<TimeoutSeconds>$Config/TimeoutSeconds$</TimeoutSeconds>
<StrictErrorHandling>false</StrictErrorHandling>
</DataSource>
</MemberModules>
<Composition>
<Node ID="DataSource"/>
</Composition>
</Composite>
</ModuleImplementation>
<OutputType>System!System.Discovery.Data</OutputType>
</DataSourceModuleType>