VMware Virtual Machine Discovery

Community.VMware.Discovery.VirtualMachine (Discovery)

PowerShell script that connects to vCenter to discover Virtual Machines

Element properties:

TargetCommunity.VMware.Class.vCenter
EnabledTrue
Frequency14400
RemotableFalse

Object Discovery Details:

Discovered Classes and their attribuets:
Discovered relationships and their attribuets:

Member Modules:

ID Module Type TypeId RunAs 
DS DataSource Microsoft.Windows.TimedPowerShell.DiscoveryProvider Community.VMware.SecureReference.RunAsProfile

Source Code:

<Discovery ID="Community.VMware.Discovery.VirtualMachine" Target="Community.VMware.Class.vCenter" Enabled="true" ConfirmDelivery="false" Remotable="true" Priority="Normal">
<Category>Discovery</Category>
<DiscoveryTypes>
<DiscoveryClass TypeID="Community.VMware.Class.VirtualMachine"/>
<DiscoveryRelationship TypeID="Community.VMware.Relationship.vCenterHostsVirtualMachine"/>
</DiscoveryTypes>
<DataSource ID="DS" TypeID="Windows!Microsoft.Windows.TimedPowerShell.DiscoveryProvider" RunAs="Community.VMware.SecureReference.RunAsProfile">
<IntervalSeconds>14400</IntervalSeconds>
<SyncTime>00:35</SyncTime>
<ScriptName>Community.VMware.Discovery.VirtualMachine.ps1</ScriptName>
<ScriptBody><Script>param($sourceId,$managedEntityId,$vCenterServerName)

Function ExitPrematurely ($Message) {
$discoveryData.IsSnapshot = $false
$api.LogScriptEvent($ScriptName,1985,2,$Message)
$discoveryData
exit
}

Function LogScriptEvent {
Param (

#0 = Informational
#1 = Error
#2 = Warning
[parameter(Mandatory=$true)]
[ValidateRange(0,2)]
[int]$EventLevel
,

[parameter(Mandatory=$true)]
[string]$Message
)

$api.LogScriptEvent($ScriptName,1985,$EventLevel,$Message)
}

Function DefaultErrorLogging {
LogScriptEvent -EventLevel 1 -Message ("$_`rType:$($_.Exception.GetType().FullName)`r$($_.InvocationInfo.PositionMessage)`rReceivedParam:`rsourceId:$sourceId`rmanagedEntityId:$managedEntityId`rvCenterServerName:$vCenterServerName")
}

$ScriptName = 'Community.VMware.Discovery.VirtualMachines.ps1'
$api = new-object -comObject 'MOM.ScriptAPI'
$discoveryData = $api.CreateDiscoveryData(0, $sourceId, $managedEntityId)

Try {
Add-PSSnapin VMware.VimAutomation.Core
} Catch {
Start-Sleep -Seconds 10
Try {
Add-PSSnapin VMware.VimAutomation.Core
} Catch {
DefaultErrorLogging
Exit
}
}

Try {
$connection = Connect-VIServer -Server $vCenterServerName -Force:$true -NotDefault
} Catch {
Start-Sleep -Seconds 10
Try {
$connection = Connect-VIServer -Server $vCenterServerName -Force:$true -NotDefault
} Catch {
DefaultErrorLogging
}
}

If ($connection.IsConnected -ne $True){
ExitPrematurely ("Unable to connect to vCenter server " + $vCenterServerName)
}

Try {$VMwareVirtualMachines = (Get-View -Server $connection -ViewType VirtualMachine -Property Name,Summary -Filter @{"Config.Template"="false"}) | Select Name,Summary}
Catch {DefaultErrorLogging}

If (!$VMwareVirtualMachines){
Try {Disconnect-VIServer -Server $connection -Confirm:$false}
Catch {DefaultErrorLogging}
ExitPrematurely ("No VMs found in vCenter " + $vCenterServerName)
}

ForEach ($VM in $VMwareVirtualMachines){

#Virtual Machine Obj
$VMInstance = $discoveryData.CreateClassInstance("$MPElement[Name='Community.VMware.Class.VirtualMachine']$")
$VMInstance.AddProperty("$MPElement[Name='Community.VMware.Class.VirtualMachine']/VirtualMachineName$", [string]$VM.Name )
$VMInstance.AddProperty("$MPElement[Name='Community.VMware.Class.VirtualMachine']/VirtualMachineHostName$", [string]$VM.Summary.Guest.HostName )
$VMInstance.AddProperty("$MPElement[Name='Community.VMware.Class.VirtualMachine']/VirtualMachineId$", [string]$VM.Summary.Vm )
$VMInstance.AddProperty("$MPElement[Name='Community.VMware.Class.vCenter']/vCenterServerName$", $vCenterServerName )
$VMInstance.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", [string]$VM.Name )
$discoveryData.AddInstance($VMInstance)

#vCenter Obj (already discovered)
$vCenterObj = $discoveryData.CreateClassInstance("$MPElement[Name='Community.VMware.Class.vCenter']$")
$vCenterObj.AddProperty("$MPElement[Name='Community.VMware.Class.vCenter']/vCenterServerName$", $vCenterServerName )

#vCenter Hosts Virtual Machine
$rel1 = $discoveryData.CreateRelationshipInstance("$MPElement[Name='Community.VMware.Relationship.vCenterHostsVirtualMachine']$")
$rel1.Source = $vCenterObj
$rel1.Target = $VMInstance
$discoveryData.AddInstance($rel1)
}
Try {Disconnect-VIServer -Server $connection -Confirm:$false}
Catch {DefaultErrorLogging}
$discoveryData</Script></ScriptBody>
<Parameters>
<Parameter>
<Name>sourceID</Name>
<Value>$MPElement$</Value>
</Parameter>
<Parameter>
<Name>managedEntityID</Name>
<Value>$Target/Id$</Value>
</Parameter>
<Parameter>
<Name>vCenterServerName</Name>
<Value>$Target/Property[Type="Community.VMware.Class.vCenter"]/vCenterServerName$</Value>
</Parameter>
</Parameters>
<TimeoutSeconds>300</TimeoutSeconds>
</DataSource>
</Discovery>