Files
Zack Meier 1d304511b8 update
2026-04-15 15:45:50 -05:00

281 lines
12 KiB
PowerShell

<#
.SYNOPSIS
Retrieve ServiceNow records based on the provided parameters.
.DESCRIPTION
Retrieve ServiceNow records based on the provided parameters. Use the ItemType parameter for frequently used tables.
If the ItemType is not listed, then use the Table parameter to specify the ServiceNow table you wish to query.
.PARAMETER ItemType
The type of item to retrieve. Valid values are 'Incident', 'Change Request', 'Catalog Task', and 'Request Item'.
.PARAMETER Table
The name of the ServiceNow table to query if the ItemType is not listed.
.PARAMETER SysId
The SysId of the record to retrieve.
.PARAMETER Number
The number of the record to retrieve.
.PARAMETER Filter
A filter to apply to the query.
.PARAMETER Limit
The maximum number of records to retrieve. Must be a positive integer.
.PARAMETER Fields
An array of fields to include in the results.
.PARAMETER IncludeCustomVariable
A switch to include custom variables in the results.
.PARAMETER IncludeVariableSet
A switch to include variable sets in the results.
.EXAMPLE
Get-ITDServiceNowRecord -ItemType 'Incident' -Number 'INC0012345'
This example retrieves the incident record with the specified number.
.EXAMPLE
Get-ITDServiceNowRecord -Table 'cmdb_ci_win_server' -Filter 'active=true' -Limit 10
This example retrieves up to 10 active Windows server records from the specified table.
.LINK
https://developer.servicenow.com/
#>
function Get-ITDServiceNowRecord {
[CmdletBinding(SupportsPaging)]
param (
[Parameter(ParameterSetName = 'ItemType')]
[ValidateSet('Incident', 'Change Request', 'Catalog Task', 'Request Item')]
[string]
$ItemType,
[Parameter(ParameterSetName = 'Table')]
[string]
$Table,
[string]
$SysId,
[string]
$Number,
[string]
$Filter,
[ValidateRange(1, [int]::MaxValue)]
[int]
$Limit,
[string[]]
$Fields,
[switch]
$IncludeCustomVariable,
[switch]
$IncludeVariableSet
)
begin {
}
process {
switch ($PSCmdlet.ParameterSetName) {
'ItemType' {
$Table = Get-ITDServiceNowTable -ItemType $ItemType
}
'Table' {
# examples: 'cmdb_ci_win_server', 'cmdb_ci_ip_network', 'cmdb_ci_service_auto', 'sc_item_option_mtom'
# don't do anything
}
}
$Uri = ($Script:ServiceNowSession.Uri + "/api/now/table/" + $Table )
$Body = @{}
$sysparm_query = @()
switch ($PSBoundParameters.Keys) {
SysId {
$sysparm_query += "sys_id=$SysId"
}
Number {
$sysparm_query += "number=$Number"
}
Filter {
$sysparm_query += $Filter
}
Fields {
$sysparm_fields = $Fields -join ','
}
}
If ($PSCmdlet.PagingParameters.IncludeTotalCount) {
}
Else {
If ($PSBoundParameters.ContainsKey('Limit')) {
$sysparm_limit = $Limit
}
Else {
Write-Verbose "Limited to 10 records returned unless specified with Limit parameter"
$sysparm_limit = 10;
}
}
Write-Verbose $uri
$Body = @{
sysparm_limit = $sysparm_limit;
sysparm_query = $sysparm_query -join '^';
sysparm_display_value = 'all';
sysparm_fields = $sysparm_fields;
}
$InvokeRestMethodParams = @{
Method = 'Get';
Uri = $Uri
Headers = $Script:ServiceNowSession.Headers;
ContentType = $Script:ServiceNowSession.ContentType;
Body = $Body;
}
Write-Verbose -Message ($Body.sysparm_query)
try {
$Result = (Invoke-RestMethod @InvokeRestMethodParams).Result
}
catch [System.UriFormatException] {
Write-Error "Invalid URI session. Did you run New-ITDServiceNowSession before execution?"
}
If ($IncludeCustomVariable) {
ForEach ($Record in $Result) {
$RecordSysId = $Record.sys_id
<#
$CustomFieldsParams = @{
Method = 'Get';
Uri = ($Script:ServiceNowSession.Uri + "/api/now/table/sc_item_option_mtom?request_item=" + $Record.Sys_id)
Headers = $Script:ServiceNowSession.Headers;
ContentType = $Script:ServiceNowSession.ContentType;
}
$CustomFieldsLookup = (Invoke-RestMethod @CustomFieldsParams).result
$sc_item_options = ForEach ($CustomField in $CustomFieldsLookup) {
#$scitemsysid = $sc_item_option.sc_item_option.value
$params = @{
Method = 'Get';
Uri = ($Script:ServiceNowSession.Uri + "/api/now/table/sc_item_option?sys_id=" + $CustomField.sc_item_option.value ); #+ "&sysparm_limit=100"
Headers = ($Script:ServiceNowSession.Headers);
ContentType = "application/json"
}
(Invoke-RestMethod @params).result
}
$MyArrayList = [System.Collections.ArrayList]@()
ForEach ($sc_item_option in $sc_item_options) {
$params = @{
Method = 'Get';
Uri = ($Script:ServiceNowSession.Uri + "/api/now/table/item_option_new?sys_id=" + $sc_item_option.item_option_new.value);
Headers = ($Script:ServiceNowSession.Headers);
ContentType = "application/json"
}
$vars = (Invoke-RestMethod @params).result
$obj = [PSCustomObject]@{
#sc_item_option_sysid = $sc_item_option.sys_id
#item_option_new_sysid = $vars.sys_id
name = $vars.name
question_text = $vars.question_text
value = $sc_item_option.value
type = $vars.type
# YES_NO = 1; MULTI_LINE_TEXT = 2; MULTIPLE_CHOICE = 3; NUMERIC_SCALE = 4; SELECT_BOX = 5; SINGLE_LINE_TEXT = 6; CHECKBOX = 7; REFERENCE = 8; DATE = 9; DATE_TIME = 10; LABEL = 11; BREAK = 12; MACRO = 14; UI_PAGE = 15; WIDE_SINGLE_LINE_TEXT = 16; MACRO_WITH_LABEL = 17; LOOKUP_SELECT_BOX = 18; CONTAINER_START = 19; CONTAINER_END = 20; LIST_COLLECTOR = 21; LOOKUP_MULTIPLE_CHOICE = 22; HTML = 23; SPLIT = 24; MASKED = 25;
}
$null = $MyArrayList.Add($obj)
}
$Record | Add-Member @{'CustomFields' = $MyArrayList }
$Record
}#>
$Record | Add-Member @{
'CustomVariable' = [pscustomobject]@{}
}
$InvokeRestMethodParams = @{
Method = 'Get';
Uri = ($Script:ServiceNowSession.Uri + "/api/now/table/sc_item_option_mtom");
ContentType = ($Script:ServiceNowSession.ContentType);
Headers = ($Script:ServiceNowSession.Headers);
Body = @{
request_item = $Record.sys_id.value;
sysparm_fields = (@('sc_item_option.item_option_new.name',
'sc_item_option.value',
'sc_item_option.item_option_new.type',
'sc_item_option.item_option_new.question_text',
'sc_item_option.item_option_new.reference') -join ',');
#sysparm_query = "sc_item_option.item_option_new.typeIN1,2,3,4,5,6,7,8,9,10,16,18,21,22,26"
# YES_NO = 1; MULTI_LINE_TEXT = 2; MULTIPLE_CHOICE = 3; NUMERIC_SCALE = 4; SELECT_BOX = 5; SINGLE_LINE_TEXT = 6; CHECKBOX = 7; REFERENCE = 8; DATE = 9; DATE_TIME = 10; LABEL = 11; BREAK = 12; MACRO = 14; UI_PAGE = 15; WIDE_SINGLE_LINE_TEXT = 16; MACRO_WITH_LABEL = 17; LOOKUP_SELECT_BOX = 18; CONTAINER_START = 19; CONTAINER_END = 20; LIST_COLLECTOR = 21; LOOKUP_MULTIPLE_CHOICE = 22; HTML = 23; SPLIT = 24; MASKED = 25;
};
}
$customVars = (Invoke-RestMethod @InvokeRestMethodParams).result #-ov c
ForEach ($var in $customVars) {
$newVar = [pscustomobject] @{
Value = $var.'sc_item_option.value'
DisplayName = $var.'sc_item_option.item_option_new.question_text'
Type = $var.'sc_item_option.item_option_new.type'
}
# show the underlying value if the option is a reference type
<#if ($newVar.Type -eq 'Reference' ) {
$newVar.Value = (Get-ServiceNowRecord -Table $var.'sc_item_option.item_option_new.reference' -ID $var.'sc_item_option.value' -Property name -AsValue -ServiceNowSession $ServiceNowSession)
#>
$Record.CustomVariable | Add-Member @{ $var.'sc_item_option.item_option_new.name' = $newVar }
}
}
}
else {
}
If ($IncludeVariableSet) {
ForEach ($Record in $Result) {
$InvokeRestMethodParams = @{
Method = 'Get';
Uri = ($Script:ServiceNowSession.Uri + "/api/now/table/sc_multi_row_question_answer?parent_id=" + $Record.sys_id.value);
ContentType = ($Script:ServiceNowSession.ContentType);
Headers = ($Script:ServiceNowSession.Headers);
}
$AllRows = (Invoke-RestMethod @InvokeRestMethodParams).result
$Row_Indexes = ($AllRows | Select-Object -Unique row_index).row_index
$ArrayList = [System.Collections.ArrayList]@()
ForEach ($Row in $Row_Indexes) {
$obj = [PSCustomObject]@{}
$RowProperties = $AllRows | Where-Object row_index -EQ $Row
$RowProperties | ForEach-Object -ThrottleLimit 10 -Parallel {
Write-Verbose -Message ("Property start " + ($USING:Script:ServiceNowSession.Uri + "/api/now/table/item_option_new?sys_id=" + $_.item_option_new.value) )
$params = @{
Method = 'Get';
Uri = ($USING:Script:ServiceNowSession.Uri + "/api/now/table/item_option_new?sys_id=" + $_.item_option_new.value);
ContentType = ($USING:Script:ServiceNowSession.ContentType);
Headers = ($USING:Script:ServiceNowSession.Headers);
MaximumRetryCount = 10;
RetryIntervalSec = 5;
}
$vars = (Invoke-RestMethod @params).result
$USING:obj | Add-Member -MemberType NoteProperty -Name $vars.name -Value $_.value
}
$null = $ArrayList.Add($obj)
}
$Record | Add-Member @{
'VariableSet' = $ArrayList
}
}
}
Write-Output $Result
}
end {
}
}