使用 Invoke-WebRequest 通过 Powershell 将数据发布到 ServiceNow

POSTing data to ServiceNow via Powershell using Invoke-WebRequest

我正在尝试通过 Powershell 脚本将信息 POST 放入 ServiceNow 中的 table。当我 运行 它时,我得到一个错误

Invoke-WebRequest : The remote server returned an error: (500) Internal Server Error.

谁能帮我解决这个问题?提前谢谢大家。

$userName = 'helpMe'
$password = 'iAmStuck' | ConvertTo-SecureString -asPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential($userName, $password)
$uri = 'stuff'
$postParams = "test"
#[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}
Invoke-WebRequest -Uri $uri -Method Post -Body $postParams -Credential $cred 

即使您发布了代码,也没有发布任何与问题相关的内容。无论 ServiceNow 是什么 都可能 有一个 API 用于参考它的期望。通常在与 web-based API 交互时,API 需要一个结构才能理解您在 $postParams 中提供的数据。在平面 HTTP POST 的情况下,有时它可能只是键-> 值对,但对于 RESTful API,您通常需要构建一个 JSON header 由 API 文档定义。

如果您搜索 "servicenow powershell interaction",似乎有一个 GitHub 通过 PowerShell 与 ServiceNow 交互的项目,还有一个专门涵盖该主题的 PDF。

ServiceNow 有一个 REST API 资源管理器,其中包含各种代码示例供您开始使用。

下面是我使用管理员帐户将 post 事件 table 拼凑在一起的示例。这里有两个重要因素,用户必须具有角色(此处为信息 https://docs.servicenow.com/bundle/istanbul-servicenow-platform/page/integrate/inbound-rest/reference/r_RESTAPIRoles.html)才能使用 API,并且必须有权访问您尝试 post 的 table。另外,请注意 post 的 body 需要是 RAW JSON 并且 URL 中提供了所有正确的 header 数据。如果成功 ServiceNow 将 return JSON 数据关于 post.

# Eg. User name="admin", Password="admin" for this code sample.
$user = "admin"
$pass = "noPassword"

# Build auth header
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $user, $pass)))

# Set proper headers
$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$headers.Add('Authorization',('Basic {0}' -f $base64AuthInfo))
$headers.Add('Accept','application/json')
$headers.Add('Content-Type','application/json')

# Specify endpoint uri
$uri = "https://xxxxx.service-now.com/api/now/table/incident"

# Specify HTTP method
$method = "post"

# Specify request body
{request.body ? "$body = \"" :""}}{\"active\":\"true\",\"number\":\"123\",\"short_description\":\"test\"}"

# Send HTTP request
$response = Invoke-WebRequest -Headers $headers -Method $method -Uri $uri -Body $body

# Print response
$response.RawContent