Powershell Activity In Progress
All,
we have been working in automating a bit our services.
Case: We need to get the affected user of an request offering and update an attribute of the user in our AD.
However the script remains in Progress:
Script:
param([guid]$parentId)
Import-module ActiveDirectory
Import-Module SMLets
# Get WorkItem
$SRClass = Get-SCSMClass -name "System.WorkItem.ServiceRequest"
$parent = Get-SCSMObject -id $parentId
#Get Affected User
$UserDisplayName = ( Get-SCSMRelationshipObject -BySource $parent | where {$_.Sourceobject -like'*powershell*'} ).TargetObject.DisplayName
#Update AD attribute
$user = Get-ADUser -Filter { Displayname -eq$UserDisplayName}
Set-ADUser -Identity $user-Replace @{extensionAttribute10='true'}
Account:
It runs under an account that has admin rights in AD.
Any support is appreciated.
thank you.
George
Best Answer
-
Adam_Dzyacky Product Owner Contributor Monkey ✭✭✭✭✭
Breaking up the error message:
- Cannot bind argument to parameter 'Id' because it is null.
- Cannot bind argument to parameter 'BySource' because it is null.
- Variable: 'UserDisplayName' found in expression: $UserDisplayName is not defined.
- Cannot validate argument on parameter 'Identity'. The argument is null. Provide a valid value for the argument, and then try running the command again.
It all starts with -Id being null, which means the $parent variable must be empty/returns no results. Since we're hitting an error at the outset, it would suggest the property for $parentId hasn't been mapped. Once you create the PSA, you'll then need to create a Template for the Cireson PowerShell Activity Class. (This follows a similar pattern from Orchestrator runbooks wherein Runbooks are synced and then you create a Template from that item.) Then choose the script you created. It is here you'll then be able to set a default mapping as seen below.
In this case I've modified the script a bit as I'm simply outputting the user's display name. So when I run a test I see this:
5
Answers
You're so close!
Steps 1 and 3 are perfectly fine, but the issue here is in step 2 - how you're asking for the relationship from the parent work item. Let's break this down a bit further:
Perfect. You'll get all of the relationships as it pertains to the Parent Work Item (a Service Request in this case). This command will return a list of Relationship Objects to you in PowerShell. Something like the Affected User to the SR, Assigned to User to the SR, Created By User to the SR, etc.
The syntax here is valid, but you're asking Service Manager the wrong question. Given the previous command to the left of the pipeline gave you all of the Relationship Objects (with one of them being the Affected User) we should be filtering a property that we know for certain will return a single Relationship Object. So in this case, we should filter on the RelationshipId. A guid that will never change and always point us to the Affected User. How can we get the guid of the Affected User relationship? In your own PowerShell window run the following against one of your management servers.
This returns the unique id of dff9be66-38b0-b6d6-6144-a412a3ebd4ce. This is the guid we can now use in the pipeline.
So now this command will give us all of the relationship objects, filter down to just the Affected User to Service Request, then select only the Target Object's (affected user's) Display Name property. The rest of the PowerShell at this point should work fine.
Adam,
thank you for the prompt reply. Script looks like this now:
param([guid]$parentId)
Import-module ActiveDirectory
Import-Module SMLets
# Get WorkItem
$SRClass = Get-SCSMClass -name "System.WorkItem.ServiceRequest"
$parent = Get-SCSMObject -id $parentId
#Get Affected User
$UserDisplayName = (Get-SCSMRelationshipObject -BySource $parent | where-object {$_.RelationshipId -eq'dff9be66-38b0-b6d6-6144-a412a3ebd4ce'}).TargetObject.DisplayName
#Update AD attribute
$user = Get-ADUser -Filter { Displayname -eq$UserDisplayName}
Set-ADUser -Identity $user-Replace @{extensionAttribute10='true'}
but still remains in Progress.
In the logs we see the following:
Start workflow
Date: 27/08/2020 15:25:02
27/08/2020 15:25:02 Initialize EMG
27/08/2020 15:25:02 Get Instacce Id: 63fe3fd5-7911-910e-51c7-b6835786f703
27/08/2020 15:25:02 Set Criteria
27/08/2020 15:25:03 Get data reader
27/08/2020 15:25:03 Get powershell script
27/08/2020 15:25:03 Determining if script is to be executed by an account
27/08/2020 15:25:03 Script is to be executed by an account
27/08/2020 15:25:03 Error excuting PowerShell
27/08/2020 15:25:03 GetSpecificAccountById error...
Any ideas what might cause it to fail? It runs under domain admin account.
thank you
George
Hey there George,
Looking at the logs you posted, the last message (GetSpecificAccountById error) references an issue from a previous version. When you can, upgrade your PowerShell Activity management pack and try this piece of automation again.
Thank you Adam,We have updated to latest version as advised, but script give still error.
Script:
param([guid]$parentId)
Import-module ActiveDirectory
Import-Module SMLets
# Get WorkItem
$SRClass = Get-SCSMClass -name "System.WorkItem.ServiceRequest"
$parent = Get-SCSMObject -id $parentId
#Get Affected User
$UserDisplayName = (Get-SCSMRelationshipObject -BySource $parent | where-object {$_.RelationshipId -eq'dff9be66-38b0-b6d6-6144-a412a3ebd4ce'}).TargetObject.DisplayName
#Update AD attribute
$user = Get-ADUser -Filter { Displayname -eq$UserDisplayName}
Set-ADUser -Identity $user-Replace @{extensionAttribute10='true'}
Error:
Start workflow
Date: 28/08/2020 08:07:45
28/08/2020 08:07:45 Initialize EMG
28/08/2020 08:07:45 Get Instacce Id: c02d02c5-6d5c-30d9-b489-6da136032341
28/08/2020 08:07:45 Set Criteria
28/08/2020 08:07:45 Get data reader
28/08/2020 08:07:45 Get powershell script
28/08/2020 08:07:45 Determining if script is to be executed by an account
28/08/2020 08:07:45 Get property mapping
28/08/2020 08:07:45 Deserialize property mapping xml
28/08/2020 08:07:45 Initialize PowerShell object
28/08/2020 08:07:45 Get activity parent
28/08/2020 08:07:45 Add PowerShell to execute
28/08/2020 08:07:45 Run PowerShell in normal worklfow
28/08/2020 08:07:45 Add work item data to parameter
28/08/2020 08:07:45 Finish adding parameters
28/08/2020 08:07:45 Invoke PowerShell Object
28/08/2020 08:07:49 PowerShell finish executing
28/08/2020 08:07:49 Printing PowerShell output to Output property
28/08/2020 08:07:49 Assigning ManuallyRunWorkflow to false
28/08/2020 08:07:49 Powershell has error.
Cannot bind argument to parameter 'Id' because it is null.Cannot bind argument to parameter 'BySource' because it is null.Variable: 'UserDisplayName' found in expression: $UserDisplayName is not defined.Cannot validate argument on parameter 'Identity'. The argument is null. Provide a valid value for the argument, and then try running the command again.
28/08/2020 08:07:49 Start updating instance
28/08/2020 08:07:49 Instance successfully updated
Any ideas?
thank you
George
Breaking up the error message:
It all starts with -Id being null, which means the $parent variable must be empty/returns no results. Since we're hitting an error at the outset, it would suggest the property for $parentId hasn't been mapped. Once you create the PSA, you'll then need to create a Template for the Cireson PowerShell Activity Class. (This follows a similar pattern from Orchestrator runbooks wherein Runbooks are synced and then you create a Template from that item.) Then choose the script you created. It is here you'll then be able to set a default mapping as seen below.
In this case I've modified the script a bit as I'm simply outputting the user's display name. So when I run a test I see this:
Adam,
thank you very much for the reply.
Trying you way works normally but i get an error when we try to update the item in our AD.
So it is permissions related. We will figure it out.
G.