5

I'm currently working on a powershell script that should be able to download an attached excel file from a service now ticket, before I explain more please see the basic flow of the automation below.

  1. The user will be asked to enter the ticket number.

enter image description here

  1. The system will then find that incident ticket to accurately get the excel file needed(I saw online that I need to use sys_id).
  2. It will then be downloaded to a specific path on the user's machine. ex: "C:\downloads\Demo\".

Following all this, I found a sample script online that I'm trying to configure to match my needs; however, I'm not sure where to get the values on that sample script. You can check the bullets below the script for the questions I have in mind.

$IncidentNumber = Read-Host -Prompt 'Enter Incident Request #'
#$admin = "admin"
#$password = "admin" | ConvertTo-SecureString -AsPlainText -Force 
#$Credential = New-Object pscredential -ArgumentList ($admin,$password)
$Uri = "https://dev42835.service-now.com/api/now/table/incident?sysparm_query=number=$($IncidentNumber)&sysparm_fields=sys_id&sysparm_limit=1"
$IncidentResult = Invoke-RestMethod -Uri $Uri #-Method Get -Credential $Credential
if($IncidentResult.result.sys_id -ne $null) {
    $IncidentAttachments = Invoke-RestMethod -Uri "https://dev42835.service-now.com/api/now/attachment?sysparm_query=table_sys_id=$($IncidentResult.result.sys_id)" #-Method Get -Credential $Credential
    $IncidentAttachments.result | Select file_name , download_link
}
else{
    "Incident Not Found!"
}
  • Do I really need the credentials to run the script? If yes, is there a way to remove the need of the credentials?
  • Where can I get the URL that is assigned to the $URI variable?

I'm new to powershell automation so I would appreciate it if you can recommend better approach if there are any.

Kent Abrio
  • 445
  • 2
  • 9
  • 27
  • 1
    If your ServiceNow server requires credentials then yes, you need credentials. The url should be the url of your own SN server but if it's hosted you may have to check with the provider. – Scepticalist Feb 13 '20 at 08:18
  • 1
    Service now exposes APIs. Here is a link: https://developer.servicenow.com/app.do#!/rest_api_doc?v=madrid&id=c_TableAPI . As for ur needs, you would only have to replace `dev42835` with the URL of the servicenow used in ur company. – Sid Feb 13 '20 at 10:18

2 Answers2

4

Yes you need credentials.

Your URI is the URL of your servicenow instance. Change the dev42835 portion to match. If you're unsure of your instance, contact servicenow support. https://dev42835.service-now.com

If you use the REST API explorer, you can view API endpoints and versions which will help with forming your requests. You do need to have the rest_api_explorer role to access the REST API Explorer. If you do not have this role, contact your service-now admin requesting it.

https://docs.servicenow.com/bundle/geneva-servicenow-platform/page/integrate/inbound_rest/task/t_GetStartedAccessExplorer.html

shadow2020
  • 1,315
  • 1
  • 8
  • 30
4

Yes, you need credentials but don't hard code them like that. Instead you can use built-in method Get-Credential that will securely collect your username and password. The user will have to enter their own ServiceNow credentials each time this is run.

My version only has one thing you need to configure, the $SubDomain variable which is specific to your tenant.

$SubDomain = "YourServiceNowSubdomaingoeshere" # Configure this per tenant

$Credential = Get-Credential
If(!$Credential){
    # User Cancelled
    exit 1
}

$IncidentNumber = Read-Host -Prompt 'Enter Incident Request #'
$Uri = "https://$SubDomain.service-now.com/api/now/table/incident?sysparm_query=number=$($IncidentNumber)&sysparm_fields=sys_id&sysparm_limit=1"
$IncidentResult = Invoke-RestMethod -Uri $Uri -Method Get -Credential $Credential
if($IncidentResult.result.sys_id -ne $null) {
    $IncidentAttachments = Invoke-RestMethod -Uri "https://$SubDomain.service-now.com/api/now/attachment?sysparm_query=table_sys_id=$($IncidentResult.result.sys_id)" -Method Get -Credential $Credential
    $IncidentAttachments.result | Select file_name , download_link
}
else{
    "Incident Not Found!"
}
HackSlash
  • 4,944
  • 2
  • 18
  • 44