Run PowerShell script on MID server via ECC queue - Assistance required

Steven Watts2
Tera Guru

Hi,

 

I am trying to run a PS script on one of our MID servers via the ECC queue however the script isn't being run. I know the script works as it's currently being run on that Server via another integration. For the moment the script should create a log file in a designated folder. The log file should contain the parameters that have been passed to the script via ServiceNow.

 

As I'm currently only testing the script has been written as a fix script but the intention is to put this in a workflow node.

 

The Fix Script:

var requestNumber = 'RITM0123456';
var userDomain = 'emea';
var userName = 'sw123456';
var groupDomain = 'emea';
var groupName = 'JPTK_CADDATA_PSD_AEC FPC';

var ecc = new GlideRecord('ecc_queue');
ecc.initialize();
ecc.agent = 'mid.server.euw1-ldpm-ad-dev';
ecc.topic = 'Command';
var value = "ServiceNow\PowerShell Scripts\logParameters.ps1 " +"-RequestNumber " +requestNumber+ " -UserDomain " +userDomain+ " -UserName "  +userName+ " -GroupDomain" + " "+groupDomain+ " -GroupName " +groupName;
ecc.payload = '<?xml version="1.0" encoding="UTF-8"?><parameters><parameter RequestNumber="'+requestNumber+'" UserDomain="'+userDomain+'" UserName="'+userName+'" GroupDomain ="'+groupDomain+'" GroupName="'+groupName+'" value="'+value+'"/><parameter name="skip_sensor" value="true"/></parameters>';
ecc.queue = 'output';
ecc.state = 'ready';
ecc.insert();

 

ECC Queue Output:

 

<?xml version="1.0" encoding="UTF-8"?><parameters><parameter RequestNumber="RITM0123456" UserDomain="emea" UserName="sw123456" GroupDomain ="emea" GroupName="JPTK_CADDATA_PSD_AEC FPC" value="ServiceNowPowerShell ScriptslogParameters.ps1 -RequestNumber RITM0123456 -UserDomain emea -UserName sw123456 -GroupDomain emea -GroupName JPTK_CADDATA_PSD_AEC FPC"/><parameter name="skip_sensor" value="true"/></parameters>

 

ECC Queue Input:

<?xml version="1.0" encoding="UTF-8"?><results probe_time="0"><result command=""><stdout/><stderr/></result><parameters><parameter name="" value="ServiceNowPowerShell ScriptslogParameters.ps1 -RequestNumber RITM0123456 -UserDomain emea -UserName sw123456 -GroupDomain emea -GroupName JPTK_CADDATA_PSD_AEC FPC"/><parameter name="agent" value="mid.server.euw1-ldpm-ad-dev"/><parameter name="signature" value=""/><parameter name="response_to" value=""/><parameter name="from_sys_id" value=""/><parameter name="source" value=""/><parameter name="priority" value="2"/><parameter name="agent_correlator" value=""/><parameter name="skip_sensor" value="true"/><parameter name="processed" value=""/><parameter name="error_string" value=""/><parameter name="sys_id" value="a4dfbe088758691819bcec6e8bbb3591"/><parameter name="sequence" value="18581def1ea0000001"/><parameter name="from_host" value=""/><parameter name="sys_created_on" value="2023-01-05 12:19:09"/><parameter name="sys_domain" value="global"/><parameter name="name" value=""/><parameter name="topic" value="Command"/><parameter name="state" value="ready"/><parameter name="queue" value="output"/><parameter name="ecc_queue" value="a4dfbe088758691819bcec6e8bbb3591"/></parameters></results>

 

The input state is set to error when processed. 

 

Can anyone assist with why the script isn't being run via the MID server when the output gets processed?

 

Regards,

 

Steven

2 REPLIES 2

treycarroll
Giga Guru

Steven - I know that this is old.  Did you ever get an answer on this?   I'm working on something similar and your approach looks a little bit off.   This video shows a different approach:

https://www.youtube.com/watch?v=6yW-3eXMT7o&list=LL&index=5&t=719s


  gr.payload = '<?xml version="1.0" encoding="UTF-8"?>' +
        '<parameters>' +
        '<parameter name="name" value="powershell .\\scripts\\PowerShell\\Get-User.ps1 user1"/>' +
        '<parameter name="skip_sensor" value="true"/>' +
        '</parameters>';
A primitive substitute for the Microsoft AD Spoke: https://incident.do/2023/11/22/ad-spoke-substitute-running-powershell-scripts-from-a-servicenow-mid-server-using-flow-designer/

Steven Watts2
Tera Guru

Hi @treycarroll 

 

I never got a response but after looking into PS a bit more I managed to work out the problem and resolve it by only sending the parameter values to the PS script.

 

Workflow:

/*
Variables to be passed to PS script
*/

var ritm = current.number;
var name = current.variables.requested_for.u_sam_account_name;
var danaherGroupName = current.variables.danaher_group_name;

/*
Build the command for the ECC payload
*/

var powerShellScript = "C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe D:\\ServiceNow\\PS_SCRIPTS\\DanaherSharedFolderV2.ps1 " + name + " " + ritm + " " + "'" + danaherGroupName + "'";

 

Script Include:

 

 createEccRecord: function(powerShellScript, source, company) {
        var ecc = new GlideRecord("ecc_queue");
        ecc.initialize();

        switch (company) {
            case 'Danaher':
                ecc.agent = this._getMidSeverDanaher();
                break;

            case 'Pall':
                ecc.agent = this._getMidServerPall();
                break;

            default:
                ecc.agent = this._getMidSeverDanaher();

        }

        ecc.topic = "Command";
        ecc.source = source;
        ecc.payload = '<?xml version="1.0" encoding="UTF-8"?><parameters> <parameter name="name" value = "' + powerShellScript + '" /><parameter name = "skip_sensor" value = "true"/> </parameters>';
        ecc.queue = "output";
        ecc.state = "ready";
        ecc.insert();

    },

 

PowerShell script:

 

#Variables
$UserName = $args[0]
$RequestNumber = $args[1]
$GroupName = $args[2]

 

I've not had a chance to watch the video link yet but will take a look as we have more work coming up that might benefit from this approach. Thanks for reaching out.

 

Steven