Microsoft Dynamics NAV 2013 Web Server Instance Discovery

Microsoft.Dynamics.Nav.2013.WebServerInstanceDiscovery (Discovery)

This object discovery finds all Microsoft Dynamics NAV 2013 Web Server instances.

Knowledge Base article:

Summary

This object discovery finds all Microsoft Dynamics NAV 2013 Web Server instances.

Element properties:

TargetMicrosoft.Dynamics.Nav.2013.WebServerRole
EnabledTrue
Frequency14400
RemotableFalse

Object Discovery Details:

Discovered Classes and their attribuets:

Member Modules:

ID Module Type TypeId RunAs 
DS DataSource Microsoft.Windows.TimedPowerShell.DiscoveryProvider Microsoft.Dynamics.Nav.2013.DefaultAccount

Source Code:

<Discovery ID="Microsoft.Dynamics.Nav.2013.WebServerInstanceDiscovery" Target="Microsoft.Dynamics.Nav.2013.WebServerRole" Enabled="true" ConfirmDelivery="false" Remotable="true" Priority="Normal">
<Category>Discovery</Category>
<DiscoveryTypes>
<DiscoveryClass TypeID="Microsoft.Dynamics.Nav.2013.WebServerInstance"/>
</DiscoveryTypes>
<DataSource ID="DS" TypeID="Windows!Microsoft.Windows.TimedPowerShell.DiscoveryProvider" RunAs="Microsoft.Dynamics.Nav.2013.DefaultAccount">
<IntervalSeconds>14400</IntervalSeconds>
<SyncTime/>
<ScriptName>WebServerInstanceDiscoveryScript.ps1</ScriptName>
<ScriptBody><Script># WebServerInstanceDiscoveryScript.ps1
# Copyright (c) Microsoft Corporation. All rights reserved.

param($target, $element, $principalName)

# Generates a well formatted error details message, that helps troubleshooting
function Generate-ErrorDetails([string] $functionName)
{
[string] $errorRecord = [string]::Format("{0}`n{1}`n{2}`n{3}`n",$Error[0].Exception.Message,$Error[0].InvocationInfo.Line,$Error[0].InvocationInfo.PositionMessage,$Error[0].Exception)
if($Error[0].Exception.InnerException -ne $null) { $errorRecord = $errorRecord + $Error[0].Exception.InnerException }
$errorRecord = "`nScript: WebServerInstanceDiscoveryScript.ps1 `nFunctionName: " + $functionName + "`n`nError: " + $errorRecord
$Error[0].ErrorDetails = $errorRecord
}

# writes the last error record to the OperationManager eventlog
function Log-ScriptError()
{
# LogScriptEvent see http://msdn.microsoft.com/en-us/library/bb437630.aspx
[int] $severity = 1
[int] $eventId = 2013
[string] $eventSourceName = 'Microsoft Dynamics NAV 2013 Management Pack'

$scomapi.LogScriptEvent($eventSourceName, $eventId, $severity, $Error[0].ErrorDetails)
}

# main()
[Boolean] $noDiscData = 1
try
{
# Create the discovery data structure that we will return the discovered objects in
$scomapi = new-object -comObject "MOM.ScriptAPI"
$discData = $scomapi.CreateDiscoveryData(0, $element, $target)

# Get a list of all NAV Web Server instances on the machine
$foundWebServerInstances = Get-NavWebServerInstance

# Create SCOM objects for the NAV Web Server instances
foreach ($webServerInstance in $foundWebServerInstances)
{
# Create the WebServerInstance object and initialize it with its key properties, no matter what. If for some reason we can't get additional information from the server instance, then
# we still want the WebServerInstance object to exist, namely in order to give the opsmgr the information that a web server instance was indeed found.
$navWebServerInstance = $discData.CreateClassInstance("$MPElement[Name='Microsoft.Dynamics.Nav.2013.WebServerInstance']$")
$navWebServerInstance.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", $principalName)

# Reading the DynamicsNAVSettings settings
$navWebServerInstance.AddProperty("$MPElement[Name='Microsoft.Dynamics.Nav.2013.WebServerInstance']/WebServerInstance$", $webServerInstance.WebServerInstance)
$navWebServerInstance.AddProperty("$MPElement[Name='Microsoft.Dynamics.Nav.2013.WebServerInstance']/Server$", $webServerInstance.Server)
$navWebServerInstance.AddProperty("$MPElement[Name='Microsoft.Dynamics.Nav.2013.WebServerInstance']/ServerInstance$", $webServerInstance.ServerInstance)
$navWebServerInstance.AddProperty("$MPElement[Name='Microsoft.Dynamics.Nav.2013.WebServerInstance']/ClientServicesPort$", $webServerInstance.ClientServicesPort)
$navWebServerInstance.AddProperty("$MPElement[Name='Microsoft.Dynamics.Nav.2013.WebServerInstance']/ClientServicesCredentialType$", $webServerInstance.ClientServicesCredentialType)
$navWebServerInstance.AddProperty("$MPElement[Name='Microsoft.Dynamics.Nav.2013.WebServerInstance']/Company$", $webServerInstance.Company)
$navWebServerInstance.AddProperty("$MPElement[Name='Microsoft.Dynamics.Nav.2013.WebServerInstance']/DnsIdentity$", $webServerInstance.DnsIdentity)
$navWebServerInstance.AddProperty("$MPElement[Name='Microsoft.Dynamics.Nav.2013.WebServerInstance']/AcsUri$", $webServerInstance.AcsUri)
$navWebServerInstance.AddProperty("$MPElement[Name='Microsoft.Dynamics.Nav.2013.WebServerInstance']/ConfigurationFile$", $webServerInstance."Configuration File")
$navWebServerInstance.AddProperty("$MPElement[Name='Microsoft.Dynamics.Nav.2013.WebServerInstance']/Uri$", $webServerInstance.Uri)

# add the WebServerInstance to the DiscoveryData object
$discData.AddInstance($navWebServerInstance)
$noDiscData = 0
}

$discData
}
catch
{
Generate-ErrorDetails "main"
Log-ScriptError
}
finally
{
# the last exception must be thrown to aleret the operator, but only if we don't have any discovery data to return.
if($noDiscData)
{
if ($Error.Count -gt 0)
{
throw $Error[0]
}
}
}
</Script></ScriptBody>
<SnapIns>
<SnapIn>Microsoft.Dynamics.Nav.Management</SnapIn>
</SnapIns>
<Parameters>
<Parameter>
<Name>target</Name>
<Value>$Target/Id$</Value>
</Parameter>
<Parameter>
<Name>element</Name>
<Value>$MPElement$</Value>
</Parameter>
<Parameter>
<Name>principalName</Name>
<Value>$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$</Value>
</Parameter>
</Parameters>
<TimeoutSeconds>300</TimeoutSeconds>
<StrictErrorHandling>true</StrictErrorHandling>
</DataSource>
</Discovery>