我想获取SCOM警报数据。但我一直收到错误401。我正确传递了凭据

我的脚本看起来像

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 auth(给出错误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
iCMS 回答:我想获取SCOM警报数据。但我一直收到错误401。我正确传递了凭据

我建议的第一件事是让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'}

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

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

这会让您进门,但是当您尝试拉回数据时,还有更多陷阱等待着您。

您的回复应返回两个cookie。一个是您的SCOMSessionID,第二个是您的SCOM-CSRF-TOKEN。在尝试将其发送回之前,我们需要对CSRF令牌进行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',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'))\",\"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,data = scom_alerts_body )
print(response.json())

我刚刚完成了创建非Powershell脚本以检索SCOM警报的类似任务。查找信息并不容易,我在Google搜索中多次传递了此信息。因此,希望这会有所帮助。

本文链接:https://www.f2er.com/2215352.html

大家都在问