PowerShell - Change Cost Center of Cireson Hardware Asset
Hello everybody,
I want to change the cost center of Cireson Hardware Assets but I can´t get it to work :(
Here is my script:
################### # START OF SCRIPT # ################### # Get the needed SCSM classes $ClassHWA = Get-SCSMClass -Name "Cireson.AssetManagement.HardwareAsset" $RelClassHWAPU = Get-SCSMRelationshipClass -Name "Cireson.AssetManagement.HardwareAssetHasPrimaryUser" $RelClassCostCenter = Get-SCSMRelationshipClass -Name "Cireson.AssetManagement.HardwareAssetHasCostCenter" # Get SCSM hardware asset $HWA = Get-SCSMObject -Class $ClassHWA | Where-Object {$_.DisplayName -like "*LBCNBT110*"} # Get the cost center relationship object of the hardware asset $GetRelAsset_CostCenter = Get-SCSMRelationshipObject -Relationship $RelClassCostCenter | Where-Object {$_.SourceObject -like "*$($HWA.DisplayName)*"} $GetRelAsset_CostCenter.TargetObject # Output: ClassName = Cireson.AssetManegement.CostCenter / DisplayName = 1BA / LastModified ... $GetRelAsset_CostCenter.TargetObject.DisplayName # Output: 1BA # Get the projection type $ProjType = Get-SCSMTypeProjection -name "Cireson.AssetManagement.HardwareAsset.ProjectionType" #$ProjType = Get-SCSMTypeProjection -name "Cireson.AssetManager.CostCenter" # Get the projection object $GetProjTypeAsset = Get-SCSMObjectProjection -ProjectionObject $ProjType -Filter "Name -eq LBCNBT110" $GetProjTypeAsset.Target_HardwareAssetHasCostCenter # Cireson.AssetManegement.CostCenter / DisplayName = 1BA / LastModified ... $GetProjTypeAsset.Target_HardwareAssetHasCostCenter.DisplayName # Output: 1BA # Prepare new cost center value in hash table $HashProperties = @{"Target_HardwareAssetHasCostCenter" = "6NA"} # New value # Set object projection with new cost center value Set-SCSMObjectProjection -Projection $GetProjTypeAsset -PropertyValues $HashProperties ################# # END OF SCRIPT # #################
I get following error messages:
Error Message 1 (PowerShell ISE):
Set-SCSMObjectProjection : Object reference not set to an instance of an object. At line:3 char:1 + Set-SCSMObjectProjection -Projection $GetProjTypeAsset.Target_Hardwar ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [Set-SCSMObjectProjection], NullReferenceException + FullyQualifiedErrorId : System.NullReferenceException,SMLets.SetSCSMObjectProjectionCommand
Error Message 2 (Visual Studio Code):
Set-SCSMObjectProjection : Target_HardwareAssetHasCostCenter At line:1 char:1 + Set-SCSMObjectProjection -Projection $GetProjTypeAsset -PropertyValue ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (LBCNBT110:EnterpriseManagementObject) [Set-SCSMObjectProjection], ObjectNotFoundException + FullyQualifiedErrorId : property not found on object,SMLets.SetSCSMObjectProjectionCommand
I can read the cost center from the projection but I can´t edit it:
I hoped editing is so easy as removing the value of the cost center :P
Remove-SCSMRelationshipObject -SMObject $GetRelAsset_CostCenter
I have the feeling that I´m just one line of code away from success but sadly I don´t get it.
Do you have any ideas? :)
Ty!
Best Answer
-
Geoff_Ross Cireson Consultant O.G.
Hi Robin,
Just been playing with this myself and I'm not actually sure its possible like that. You might have to forget the projection and just update the relationships directly.
Looking at your code, this may have been how you started as you already gather all the relationships and classes.
################### # START OF SCRIPT # ################### # Get the needed SCSM classes $ClassHWA = Get-SCSMClass -Name "Cireson.AssetManagement.HardwareAsset" $ClassCC = Get-SCSMClass -Name "Cireson.AssetManagement.CostCenter" $RelClassHWAPU = Get-SCSMRelationshipClass -Name "Cireson.AssetManagement.HardwareAssetHasPrimaryUser" $RelClassCostCenter = Get-SCSMRelationshipClass -Name "Cireson.AssetManagement.HardwareAssetHasCostCenter" # Get SCSM hardware asset $HWA = Get-SCSMObject -Class $ClassHWA | Where-Object {$_.DisplayName -like "*LBCNBT110*"} # Get the objects to relate $CostCenter = Get-SCSMObject -Class $ClassCC | Where-Object {$_.DisplayName -like "*6NA*"} # Set the new relationships New-SCSMRelationshipObject -Relationship $RelClassCostCenter -Source $HWA -Target $CostCenter -Bulk ################# # END OF SCRIPT # #################
1
Answers
Hi @Robin_Fakler
You are pretty close I think.
The issue is this line:
You need to give it an object (of type CostCenter) not just the string.
You need something like this:
This gets the object and then sets that in the projection.
FYI, I know you've just been experimenting but this code is not the most efficient way of doing things. For one, you get a lot a data into variables that you never use. Secondly, the Get-SCSMObject | Where-Object is much slower than Get-SCSMObject -Filter
I've followed your method here to help you understand but if you want some bedtime reading...
Geoff
Hi Geoff,
thank you very much for your input. I tried your code above but unfortunately I get an other error:
It looks like that the property "Target_HardwareAssetHasCostCenter" can not be found in the used projection type "Cireson.AssetManagement.HardwareAsset.ProjectionType".
But this property exists like you see in the screenshot of my first post?!
Thanks for the link! :)
Robin,
Try just "CostCenter" is the key in that hashtable.
Geoff
Hi Geoff,
same error :( I tried it also with "Cireson.Asset.Management.CostCenter".
Hi Robin,
Just been playing with this myself and I'm not actually sure its possible like that. You might have to forget the projection and just update the relationships directly.
Looking at your code, this may have been how you started as you already gather all the relationships and classes.
Hi Geoff,
thank you (again) for solving my problems! :) That was way easier then I have expected because you need the relationship between the asset and the cost center to read the value of the current set cost center. But you can change and delete it without the relationship reference.
Thank you again for the link how to query SCSM, my scripts are working waaaay faster :)
@Geoff_Ross
Is there a faster way to query SCSM Relationship Objects like in the example below?
I have tried to adapt it like in your posted article but I can´t get it to work because of an invalid property:
@Robin_Fakler - On the last question, I usually go the other way.
$GetRelAsset_PrimaryUser = (Get-SCSMRelationshipObject -BySource $HWA | Where-Object {$_.RelationshipId -eq $RelClassHWAPU.Id}).TargetObject
@Robin_Fakler
+1 to Justin's work above. I have not ever managed to get the -Filter param to work so pick the param I think will produce the least results out of -Relationship, -BySource and -ByTarget and then use Where-Object to filter the results by the other items.
Geoff
Hi @Justin_Workman @Geoff_Ross,
thank you, your code example is like 10x faster then my code above! :)