Написание сценария обнаружения пакета управления для пользовательского MP

КОНТЕКСТ: Создание пользовательского пакета управления для SCOM[System Center]. Сейчас работаю над этапом обнаружения скриптов.

При запуске мой скрипт возвращает требуемые значения из конечной точки отдыха, представленной в json.

###########
## Authentication variables
$user = "darthMaul"
$pwd = "!deathstar" | ConvertTo-SecureString -asPlainText -Force
$limit = 1

function GetServiceStates($offset)
{

    $defUrl = "https://demo1.galacticempire.co.uk/tie-fighter/api/v2/service_states?limit=$limit&offset=$offset"
    $cred = New-Object System.Management.Automation.PSCredential($user,$pwd)
    #$stackStatus = Invoke-WebRequest -Uri $url -Credential $cred
    $stackStatus = Invoke-RestMethod -Uri $defUrl -Credential $cred

    if ($stackStatus.Count -ge 1) {
        #appends only the service url for an individual service
        $parsedUrls = $stackStatus.serviceUrl
        #secure requests required else the call fails
        $UrlsParsed = $parsedUrls.Replace("http","https")
        #$UrlsParsed 

        #for each service found perform an addition call to determine the status of the service. 
        foreach ($Url in $UrlsParsed)
        {
            $sep = Invoke-WebRequest -uri $url -Credential $cred
            $svcStatus = $sep | select @{name="Response";Expression ={$_.statuscode}}, @{name="Status";Expression ={$_.statusdescription}} 
            $svcCall = $sep | ConvertFrom-Json | select displayname, serviceTypeUrl, port, serviceport

            $svcStatus | Add-Member -MemberType NoteProperty -Name displayname -Value $svcCall.displayname
            $svcStatus | Add-Member -MemberType NoteProperty -Name serviceTypeUrl -Value $svcCall.serviceTypeUrl
            $svcStatus | Add-Member -MemberType NoteProperty -Name port -Value $svcCall.port
            $svcStatus | Add-Member -MemberType NoteProperty -Name servicePort -Value $svcCall.servicePort
            $svcStatus | ft
            $offset++

        }

            if($offset -ge $limit){
                GetServiceStates($offset)
            }

    } 
}

GetServiceStates(0)

Результаты FYI выглядят следующим образом: введите здесь описание изображения


ТРУДНОСТЬ/ПРОБЛЕМА/ЗАДАЧА: возникла проблема с преобразованием этого объекта в объект обнаружения.
Вот мой аварийный скрипт.

param($sourceId,$managedEntityId)

## Authentication variables
$user = "darthMaul"
$pwd = "!deathstar" | ConvertTo-SecureString -asPlainText -Force
$limit = 1

$api = New-Object -comObject 'MOM.ScriptAPI'
$discoveryData = $api.CreateDiscoveryData(0, $sourceId, $managedEntityId)
#Log script event
#$api.LogScriptEvent('Scripts/ManageAppServiceStatus.ps1',999,4,$service)

$defUrl = "https://demo1.galacticempire.co.uk/tie-fighter/api/v2/service_states?limit=$limit&offset=$offset"
$cred = New-Object System.Management.Automation.PSCredential($user,$pwd)
$stackStatus = Invoke-RestMethod -Uri $defUrl -Credential $cred

if ($stackStatus.Count -ge 1) 
{
    #appends only the service url for an individual service
    $parsedUrls = $stackStatus.serviceUrl
    #secure requests required else the call fails
    $UrlsParsed = $parsedUrls.Replace("http","https")
    #$UrlsParsed 

    #for each service found perform an addition call to determine the status of the service. 
    foreach ($Url in $UrlsParsed)
    {
        #create discoverty instance
        $instance = $discoveryData.CreateClassInstance("$MPElement[Name='StackAppServiceStatus.Discovery.ProbeService']$")

        $sep = Invoke-WebRequest -uri $url -Credential $cred
        #collects first different data sets
        $svcStatus = $sep | select @{name="Response";Expression ={$_.statuscode}}, @{name="Status";Expression ={$_.statusdescription}} 
        #collects seconds different data sets
        $svcCall = $sep | ConvertFrom-Json | select displayname, serviceTypeUrl, port, serviceport
        #appends both data set together
        $svcStatus | Add-Member -MemberType NoteProperty -Name displayname -Value $svcCall.displayname
        $svcStatus | Add-Member -MemberType NoteProperty -Name serviceTypeUrl -Value $svcCall.serviceTypeUrl
        $svcStatus | Add-Member -MemberType NoteProperty -Name port -Value $svcCall.port
        $svcStatus | Add-Member -MemberType NoteProperty -Name servicePort -Value $svcCall.servicePort
        #formats results
        $svcStatus | ft
        $offset++

        $instance.AddProperty("$MPElement[Name='StackAppServiceStatus.Discovery.ProbeService']/Response$", 'Response' + $svcStatus.response)
        $instance.AddProperty("$MPElement[Name='StackAppServiceStatus.Discovery.ProbeService']/Status$", 'Status' + $svcStatus.status)
        $instance.AddProperty("$MPElement[Name='StackAppServiceStatus.Discovery.ProbeService']/Displayname$", 'Displayname' + $svcStatus.displayname)
        $instance.AddProperty("$MPElement[Name='StackAppServiceStatus.Discovery.ProbeService']/Port$", 'Port' + $svcStatus.port)

        #store all variables into instance
        $discoveryData.AddInstance($instance)

    }

        if($offset -ge $limit)
        {
            GetServiceStates($offset)
        }

} 

$discoveryData = GetServiceStates(0)


Хотя это очень расстраивает, наслаждаюсь этим. Просто нужно направление или структура какой-то. Любая помощь приветствуется.
Спасибо.

СООБЩЕНИЕ ОБ ОШИБКЕ

 Exception calling "CreateDiscoveryData" with "3" argument(s): "Invalid class string (Exception from HRESULT: 0x800401F3 
(CO_E_CLASSSTRING))"
At line:13 char:1
+ $discoveryData = $api.CreateDiscoveryData(0, $sourceId, $managedEntityId)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ComMethodTargetInvocation

You cannot call a method on a null-valued expression.
At line:33 char:9
+         $instance = $discoveryData.CreateClassInstance("$MPElement[Name='StackAp ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

person Ifeanyi Ofoborh    schedule 07.01.2016    source источник
comment
Какая у вас ошибка? Где он ломается? Последняя строка $discoveryData = GetServiceStates(0) сотрет вашу переменную $discoveryData. Эта переменная обрабатывается в функции, а не возвращается функцией.   -  person Jan Chrbolka    schedule 07.01.2016
comment
Здравствуйте, @JanChrbolka, ошибка связана с вопросом выше. Спасибо за ваше время.   -  person Ifeanyi Ofoborh    schedule 07.01.2016


Ответы (1)


Первое исключение: похоже, что вы неправильно передаете идентификаторы целевого класса и класса обнаружения в сценарий обнаружения, поэтому MOMAPI не может создать экземпляр DiscoveryData.

$sourceID должен быть инициализирован значением $MPElement$. $managedEntityID должен быть инициализирован значением $Target/Id$.

Подробнее об использовании параметров в скриптах можно прочитать здесь: https://msdn.microsoft.com/en-us/library/hh329047.aspx

Второе исключение вызвано первым, потому что discoveryData не был создан, поэтому он равен нулю :)

Удачи! Римский.

person Roman Yuferev    schedule 07.01.2016