Microsoft Dynamics NAV 2015 Web Server Instance Discovery

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

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

Knowledge Base article:

Summary

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

Element properties:

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

Object Discovery Details:

Discovered Classes and their attribuets:

Member Modules:

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

Source Code:

<Discovery ID="Microsoft.Dynamics.Nav.2015.WebServerInstanceDiscovery" Target="Microsoft.Dynamics.Nav.2015.WebServerRole" Enabled="true" ConfirmDelivery="false" Remotable="true" Priority="Normal">
<Category>Discovery</Category>
<DiscoveryTypes>
<DiscoveryClass TypeID="Microsoft.Dynamics.Nav.2015.WebServerInstance"/>
</DiscoveryTypes>
<DataSource ID="DS" TypeID="Microsoft.Dynamics.Nav.2015.TimedPowerShell.DiscoveryProvider" RunAs="Microsoft.Dynamics.Nav.2015.DefaultAccount">
<IntervalSeconds>14400</IntervalSeconds>
<TimeoutSeconds>120</TimeoutSeconds>
<ScriptName>WebServerInstanceDiscoveryScript.ps1</ScriptName>
<Arguments>'$Target/Id$' '$MPElement$' '$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$'</Arguments>
<ScriptBody><Script>
# ServerInstanceDiscoveryScript.ps1
# Copyright (c) Microsoft Corporation. All rights reserved.
$scriptName = 'NavAdminTool.ps1'

$errorVariable = $null
$instanceName = ''
$arguments = ''
for ($i = 0; $i -lt $args.Count; $i++)
{
$arguments += " '$($args[$i])'"
}

# 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: " + $scriptName + "`nArguments: " + $arguments + "`nInstanceName: " + $instanceName + "`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 = 2015
[string] $eventSourceName = 'Microsoft Dynamics NAV 2015 Management Pack'

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

# Import-Module or register Snap-in, that will enable side-by-side registrations of management dll
function RegisterSnapIn($snapIn)
{
$nstPath = "HKLM:\SOFTWARE\Microsoft\Microsoft Dynamics NAV\80\Service"
$managementDllPath = Join-Path (Get-ItemProperty -path $nstPath).Path '\Microsoft.Dynamics.Nav.Management.dll'

# First try to import the management module
Import-Module $managementDllPath -ErrorVariable errorVariable -ErrorAction SilentlyContinue

if (Check-ErrorVariable -eq $true)
{
# fallback to add the snap-in
if ((Get-PSSnapin -Name $snapIn -ErrorAction SilentlyContinue) -eq $null)
{
if ((Get-PSSnapin -Registered $snapIn) -eq $null)
{
throw "Could not locate the PSSnapin: $snapIn"
}
else
{
Add-PSSnapin $snapIn
}
}
}
}

# Check if there is any error in the ErrorVariable
function Check-ErrorVariable
{
return ($errorVariable -ne $null -and $errorVariable.Count -gt 0)
}

# WebServerInstanceDiscoveryScript.ps1
# Copyright (c) Microsoft Corporation. All rights reserved.
$scriptName = 'WebServerInstanceDiscoveryScript.ps1'

# Assign global variables to parameters passed in from the command line.
$target = $args[0]
$element = $args[1]
$principalName = $args[2]

# main()
try
{
$scomapi = new-object -comObject "MOM.ScriptAPI"

# Register Microsoft Dynamics NAV Management Snap-in
RegisterSnapIn "Microsoft.Dynamics.Nav.Management"

# Create the discovery data structure that we will return the discovered objects in
$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)
{
$instanceName = $webServerInstance.WebServerInstance
# 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.2015.WebServerInstance']$")
$navWebServerInstance.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", $principalName)

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

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

$scomapi.Return($discData)
}
catch
{
Generate-ErrorDetails "main"
Log-ScriptError
Exit -1
}
</Script></ScriptBody>
</DataSource>
</Discovery>