1

上下文:为 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)

仅供参考的结果看起来像这样 在此处输入图像描述


困难/问题/挑战:将其转换为发现对象时遇到了一些麻烦。
这是我的破解脚本。

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
4

1 回答 1

0

第一个例外 - 看起来您没有将目标类和发现类 ID 正确传递给发现脚本,因此 MOMAPI 无法创建 DiscoveryData 实例。

$sourceID 必须用 $MPElement$ 值初始化 $managedEntityID 必须用 $Target/Id$ 值初始化

您可以在此处阅读有关在脚本中使用参数的更多详细信息:https ://msdn.microsoft.com/en-us/library/hh329047.aspx

第二个异常是由第一个异常引起的,因为没有创建discoveryData所以它是空的:)

祝你好运!罗马。

于 2016-01-07T19:48:57.263 回答