281 lines
12 KiB
PowerShell
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 {
|
|
|
|
}
|
|
} |