【问题标题】:I want to fetch the SCOM alerts data. But I keep getting the error 401. I am passing the credentials right我想获取 SCOM 警报数据。但我不断收到错误 401。我正在正确传递凭据
【发布时间】:2020-06-03 07:07:19
【问题描述】:

我的脚本看起来像

import requests
import base64
user="domain\\username"
pass="password"
Authentication_mode="Windows"
tok=Authentication_mode+":"+user+":"+pass #referring the doc for authentication at https://docs.microsoft.com/en-us/rest/api/operationsmanager/authentication/login

token=base64.b64encode(bytes(token,'utf-8')).decode()
headers={'content-type':'application/json',
         'Authorization': 'Basic %s' % token
}
payload={}
url="http://<Servername>/OperationsManager/authenticate"
respone=requests.post(url,headers=headers,data=payload)
print(response)



我得到的响应代码是 401 而不是 200。仅供参考,我已经尝试过 NTLM 身份验证(给出错误 400)、HTTPBasicauth、HTTPDigestAuth。

https://community.squaredup.com/answers/question/scom-1801-rest-api/ 提供的 Powershell 脚本,我想用 Python 来做。

$scomHeaders = New-Object “System.Collections.Generic.Dictionary[[String],[String]]”
$scomHeaders.Add(‘Content-Type’,’application/json; charset=utf-8′)

$bodyraw = “Windows”
$Bytes = [System.Text.Encoding]::UTF8.GetBytes($bodyraw)
$EncodedText =[Convert]::ToBase64String($Bytes)
$jsonbody = $EncodedText | ConvertTo-Json

$uriBase = ‘http://xxxxxx/OperationsManager/authenticate’
$auth = Invoke-RestMethod -Method POST -Uri $uriBase -Headers $scomheaders -body $jsonbody -UseDefaultCredentials -SessionVariable websession



$query = @($query = @(    @{ “classid” = “” “displayColumns”=  “severity”, “monitoringobjectdisplayname”, “name”, “age”, “repeatcount”, “lastModified” })

$jsonquery = $query | ConvertTo-Json
$Response = Invoke-WebRequest -Uri “http://xxxxxx/OperationsManager/data/alert” -Method Post -Body $jsonquery -ContentType “application/json” -UseDefaultCredentials -WebSession $websession
$alerts = ConvertFrom-Json -InputObject $Response.Content
$alerts.rows | select monitoringobjectdisplayname,name,severity,age

【问题讨论】:

  • 这很紧急。

标签: python powershell rest scom


【解决方案1】:

我建议的第一件事是让 Microsoft 为 authN 创建您的凭据主体。在 SCOM 服务器(或任何 Windows 机器)上运行此 powershell 代码。

$creds = Get-Credential
$bodyraw = "AuthenticationMode:$($creds.UserName):$($creds.GetNetworkCredential().Password)"
$Bytes = [System.Text.Encoding]::UTF8.GetBytes($bodyraw)
$EncodedText =[Convert]::ToBase64String($Bytes)
Write-Host $EncodedText

复制该输出值并将其作为 jsonbody 变量的值。用单引号将值括起来。如果您更改了帐户的密码,则只需更新它。

接下来,您的 authN 调用标头必须是:

{'Content-Type': 'application/json; charset=utf-8'}

您不需要标题的授权部分,我们将 authN 值添加到帖子正文中。例如:

response = requests.Request( "Post", 'https://<your_scom_endpoint>/OperationsManager/authenticate', headers=headers, data = jsonbody )

这让你进入了大门,但当你试图拉回数据时,还有更多的陷阱在等着你。

您的回复应该返回两个 cookie。一个是你的 SCOMSessionID,第二个是你的 SCOM-CSRF-TOKEN。在我们尝试将它们发回之前,我们需要对 CSRF-Token 进行 URL 解码。然后导入 urllib:

decodedToken = urllib.unquote(response.cookies['SCOM-CSRF-TOKEN'])
headers.update({'SCOM-CSRF-TOKEN': decodedToken})
headers.update({'Cookie': "SCOMSessionId=" + response.cookies['SCOMSessionId']})

现在,我们更新了标题以包含我们的 cookie,我们可以要求一些有用的东西。这是一个提取关键警报的示例。

scom_alerts_body = "{\"criteria\":\"((Severity = '2') AND (ResolutionState = '0'))\",\"displayColumns\":[\"severity\",\"monitoringobjectdisplayname\",\"name\",\"age\",\"repeatcount\"],\"classId\":\"\"}"
response = requests.request( "POST", 'https://monitoring.ad.cdc.nicusa.com/OperationsManager/data/alert', headers=headers, data = scom_alerts_body )
print(response.json())

这是一个完整的例子:

#!/bin/python

import json
import requests
import urllib

scom_authN_Uri = 'https://<scom_server>/OperationsManager/authenticate'
scom_alerts_Uri = 'https://<scom_server>/OperationsManager/data/alert'
scomHeader = {'Content-Type': 'application/json; charset=utf-8'}
scom_authN_body = '<utf-8 and base64 encoded token>'
scom_alerts_body = "{\"criteria\":\"((Severity = '2') AND (ResolutionState = '0'))\",\"displayColumns\":[\"severity\",\"monitoringobjectdisplayname\",\"name\",\"age\",\"repeatcount\"],\"classId\":\"\"}"

# Authentication Request
response = requests.request( "POST", scom_authN_Uri, headers=scomHeader, data = scom_authN_body )

# Create authN header for pulling data
decodeToken = urllib.unquote(response.cookies['SCOM-CSRF-TOKEN'])
scomHeader.update({'SCOM-CSRF-TOKEN': decodeToken})
scomHeader.update({'Cookie': "SCOMSessionId=" + response.cookies['SCOMSessionId']})

# Request Critical alerts
response = requests.request( "POST", scom_alerts_Uri, headers=scomHeader, data = scom_alerts_body )
print(response.json())

我刚刚完成了一项类似的任务,即创建一个非 powershell 脚本来检索 SCOM 警报。找到信息并不容易,我在谷歌搜索中多次通过了这篇文章。所以,希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2019-03-31
    • 1970-01-01
    • 2022-11-03
    • 1970-01-01
    • 2022-12-13
    • 1970-01-01
    • 2020-01-21
    • 2015-04-27
    • 2020-05-04
    相关资源
    最近更新 更多