Join the #BuildWithBuildAgent Challenge! Get recognized, earn exclusive swag, and inspire the ServiceNow Community with what you can build using Build Agent.  Join the Challenge.

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>';

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