IT Monkey:   


Formal Cireson Support (phone, email, and web) is not included with the free Self-Service Portal – Community app. For trouble shooting assistance, take advantage of the Cireson Community to find answers to your questions. However, if you’d like to purchase a Support Package to access more formal Cireson Support (phone, email, and web), please contact us today to learn more on the pricing options.

Custom PS Script Issue - User Input to Activity Description

Dears,

I am using SCSM 2012 R2 with the latest 2012 version of Cireson Community Portal. Our Silverlight portal is still in use as part of our transition period.

A very good solution has been provided by Gabrial Taylor for writing the user inputs into each SR activity.

https://model-technology.com/blog/scsm-workflow-populate-work-item-data-to-child-activities/

I have been using this solution without any issues in Silverlight Portal. However with the Cireson Portal, the solution is not working as expected and I don't know the reason. The user inputs are successfully captured in SR but the PowerShell script cannot populate them into the activities even though there is no error logged when the script runs.

I really appreciate if you have any idea where the problem might be or any alternative solution that can be used with Cireson Portal.

Here is the JS:

$WorkItemID

PowerShell {
    param(
        [parameter(Mandatory=$true)]$WorkItemID
    )

    #region Variables
    $SMLetsModule = "SMLets"
    [guid]$RelClassGUID_AffectedUser = "dff9be66-38b0-b6d6-6144-a412a3ebd4ce"
    [guid]$RelClassGUID_AssignedToUser = "15e577a3-6bf9-6713-4eac-ba5a5b7c4722"
    [guid]$RelClassGUID_ContainsActivity = "2da498be-0485-b2b2-d520-6ebd1698e61b"
    $VerbosePreference = "Continue"
    #endregion

    #region Functions
    function processUserInput {
        [CmdletBinding()]
        param(
            [parameter(Mandatory=$true)][xml]$UserInput
        )

        ## Create empty Question and Answer Array
        $QAArray = @()

        ## Define variables for each of the Node Types
        $StringNodes = $UserInput.Userinputs.Userinput | where {$_.Type -eq "string"}
        $EnumNodes = $UserInput.Userinputs.Userinput | where {$_.Type -eq "enum"}
        $DateNodes = $UserInput.Userinputs.Userinput | where {$_.Type -eq "datetime"}
        $QueryNodes = $UserInput.Userinputs.Userinput | where {$_.Type -eq "System.SupportingItem.PortalControl.InstancePicker"}
        $BoolNodes = $UserInput.Userinputs.Userinput | where {$_.Type -eq "bool"}

        ## Process String-type Questions and Answers, then add to the Array
        if (($StringNodes | Measure-Object).Count -gt 0) {
            foreach ($strnode in $StringNodes) {
                [string]$StringQuestion = $strnode.Question
                [string]$StringAnswer = $strnode.Answer
                $QAArray += ("$StringQuestion = $StringAnswer")
            }
        }

        ## Process Bool-type Questions and Answers, then add to the Array
        if (($BoolNodes | Measure-Object).Count -gt 0) {
            foreach ($boolnode in $BoolNodes) {
                [string]$BoolQuestion = $boolnode.Question
                [string]$BoolAnswer = $boolnode.Answer
                $QAArray += ("$BoolQuestion = $BoolAnswer")
            }
        }
    
        ## Process Date-type Questions and Answers, then add to the Array
        if (($DateNodes | Measure-Object).Count -gt 0) {
            foreach ($datenode in $DateNodes) {
                [string]$DateQuestion = $datenode.Question
                $RawDateAnswer = [datetime]$datenode.Answer
                [string]$DateAnswer = $RawDateAnswer.ToString("d")
                $QAArray += ("$DateQuestion = $DateAnswer")
            }
        }

        ## Process Enum-type Questions and Answers, then add to the Array
        if (($EnumNodes | Measure-Object).Count -gt 0) {
            foreach ($enumnode in $EnumNodes) {
                    [string]$EnumQuestion = $enumnode.Question
                    $EnumAnswer = $enumnode.Answer
                    $EnumAnswerDetails = Get-SCSMEnumeration -Id $EnumAnswer
                    [string]$AnswerDisplayName = $EnumAnswerDetails.displayname
                    $QAArray += ("$EnumQuestion = $AnswerDisplayName")
                }
        }

        ## Process Query-type Questions and Answers, then add to the Array
        if (($QueryNodes | Measure-Object).Count -gt 0) {
            foreach ($querynode in $QueryNodes) {
                [string]$QueryQuestion = $querynode.question
                [xml]$QueryAnswerXML = $querynode.answer
                if ($QueryAnswerXML.Values.Count -gt 1) {
                    [string]$QueryAnswerDS = ($QueryAnswerXML.Values.Value.DisplayName) -join "; "
                }
                else {
                    [string]$QueryAnswerDS = $QueryAnswerXML.Values.Value.DisplayName
                }
                $QAArray += ("$QueryQuestion = $QueryAnswerDS")
            }
        }

        ## Format the Array into a Multi-Line String
        $QAString = ""
        foreach ($ArrayEntry in $QAArray) {
            $QAString += "$ArrayEntry`n"
        }
        $QAString = $QAString.Substring(0,$QAString.Length-1)

        ## Output the Result
        $QAString
    }

    #endregion

    #region Import SMLets
    ## Set the identity of the default management server for SMLets cmdlets to target to the local computer
    ## Since this script will be running from a workflow, this value will always be the identity of the management server hosting the workflows
    $smdefaultcomputer = $env:COMPUTERNAME

    ## Check whether or not SMLets module has been imported and, if not, import it
    Write-Verbose "[$(Get-Date)] Loading SMLets PowerShell module ..."
    $ExistingModules = (Get-Module | ForEach-Object{$_.name}) -join " "
    If(!$ExistingModules.Contains($SMLetsModule)) {
        Import-Module $SMLetsModule -Force -Verbose:$false
    }
    #endregion

    #region Get Work Item, Assigned To User, and Affected User information
    $WorkItem = Get-SCSMObject -Id $WorkItemID

    $AffectedUserRelObj = $null
    $AffectedUserRelObj = Get-SCSMRelationshipObject -BySource $WorkItem | ?{$_.SourceObject -eq $WorkItem -and $_.IsDeleted -eq $false -and $_.RelationshipId -eq $RelClassGUID_AffectedUser}
    if ($AffectedUserRelObj -ne $null) {
        $AffectedUser = Get-SCSMObject -Id ($AffectedUserRelObj.TargetObject).PSObject.ImmediateBaseObject.Id
    }
    Else {
        $AffectedUser = $null
    }

    $AssignedToUserRelObj = $null
    $AssignedToUserRelObj = Get-SCSMRelationshipObject -BySource $WorkItem | ?{$_.SourceObject -eq $WorkItem -and $_.IsDeleted -eq $false -and $_.RelationshipId -eq $RelClassGUID_AssignedToUser}
    if ($AssignedToUserRelObj -ne $null) {
        $AssignedToUser = Get-SCSMObject -Id ($AssignedToUserRelObj.TargetObject).PSObject.ImmediateBaseObject.Id
    }
    Else {
        $AssignedToUser = $null
    }
    #endregion

    #region Enumerate Child Activities

    ## Get all child activities and store in the array
    $ChildActivities = @()
    [guid[]]$ChildActivityGUIDs = ((Get-SCSMRelationshipObject -BySource $WorkItem | ?{$_.RelationshipID -eq $RelClassGUID_ContainsActivity -and $_.IsDeleted -eq $false}).TargetObject).get_Id()
    if ($ChildActivityGUIDs.count -gt 0) {
        foreach ($GUID in $ChildActivityGUIDs) {
         $ChildActivities += Get-SCSMObject -Id $GUID
        }
    }
    #endregion

    #region Process User Input
    if ($ChildActivities.count -gt 0) {
        $UserInputStr = processUserInput -UserInput $WorkItem.UserInput
    }
    #endregion

    #region Format Parent Work Item Information
    if ($ChildActivities.count -gt 0) {
        $ParentWorkItemInfo = ""
        $LineBreak = "`n"

        $ParentWorkItemInfo += "###### Parent Request Information ######" + $LineBreak
        $ParentWorkItemInfo += "Request Id:   " + $WorkItem.Id + $LineBreak
        If ($AffectedUser -ne $null) {
            $ParentWorkItemInfo += "Requestor:   " + $AffectedUser.DisplayName + " `($($AffectedUser.Domain)\$($AffectedUser.Username)`)" + $LineBreak
        }
        Else {
            $ParentWorkItemInfo += "Requestor:   (None)" + $LineBreak + $LineBreak
        }
        $ParentWorkItemInfo += "Request Description:   " + $WorkItem.Description + $LineBreak + $LineBreak
        $ParentWorkItemInfo += "Currently Assigned Support Group:   " + $WorkItem.SupportGroup.DisplayName + $LineBreak
        If ($AssignedToUser -ne $null) {
            $ParentWorkItemInfo += "Currently Assigned Technician:   " + $AssignedToUser.DisplayName + " `($($AssignedToUser.Domain)\$($AssignedToUser.Username)`)" + $LineBreak + $LineBreak
        }
        Else {
            $ParentWorkItemInfo += "Currently Assigned Technician:   (None)" + $LineBreak + $LineBreak
        }
        $ParentWorkItemInfo += "Request Questions and User Answers:" + $LineBreak + $UserInputStr + $LineBreak
        $ParentWorkItemInfo += "###### End Parent Request Information ######"
    }
    #endregion

    #region Update Activity Descriptions
    if ($ChildActivities.count -gt 0) {
        foreach ($Activity in $ChildActivities) {
            $UpdatedDescription = $Activity.Description + $LineBreak + $ParentWorkItemInfo
            Set-SCSMObject -SMObject $Activity -Property Description -Value $UpdatedDescription
        }
    }
    #endregion

    #region Clean Up
    Remove-Module SMLets -Force
    #endregion
} -args $WorkItemID

Sign In or Register to comment.