Solved

System Center Orchestrator runbook activity returns wrong number

Posted on 2014-10-06
1
144 Views
Last Modified: 2015-01-17
The runbook looks like this:
RunbookThe return data step returns the $Degree variable returned from the script activity.

The script activity looks like this and returns the value from the $Degree variable:
Script Activity
The GetFillingDegree.ps1 script looks like this:
Function GetFillingDegree {
	param([string] $ClusterName)

	Import-Module FailoverClusters
	
	try {
		$props = @{
			errorlevel= 0;
		}

		[array] $cNodes = Get-Cluster $ClusterName|Get-ClusterNode |Where {$_.state -eq "Up"} |Select Name
		$nodecount = $cNodes.length
		[array] $hostDetails = Get-Cluster $ClusterName|Get-ClusterNode|Select name, @{Label="TotalPhysicalMemory"; Expression={[int]""}}, @{Label="AvailablePhysicalMemory"; Expression={[int]""}}, @{Label="AvailablePhysicalMemoryPC"; Expression={[int]""}}, @{Label="TotalVMStartupRamAllocated"; Expression={[int]""}}, @{Label="TotalVMMaxMemoryAllocated"; Expression={[int]""}}, @{Label="Processors"; Expression={[int]""}}, @{Label="ProcessorCore"; Expression={[int]""}}, @{Label="LogicalProcessors"; Expression={[int]""}}, @{Label="vProcessors"; Expression={[int]""}}, @{Label="HostMemoryHealth"; Expression={[int]""}}, @{Label="VMs"; Expression={[int]""}}
		For ($i=0; $i -lt $nodecount; $i++) {
			#Write-Host ("Processing Hyper-V Host "+$cNodes.Name[$i]) -Foregroundcolor Green -BackgroundColor DARKGREEN
			$hDetails = Get-WmiObject -Class win32_OperatingSystem -ComputerName $cNodes.Name[$i] |Select FreePhysicalMemory, TotalVisibleMemorySize
			[int] $hostDetails[$i].TotalPhysicalMemory =  ((($hDetails).TotalVisibleMemorySize)/1048576)
			[int] $hostDetails[$i].AvailablePhysicalMemoryPC  =  (((($hDetails).FreePhysicalMemory)/(($hDetails).TotalVisibleMemorySize))*100)
			[int] $hostDetails[$i].AvailablePhysicalMemory =  ((($hDetails).FreePhysicalMemory)/1048576)
			If (($hostDetails[$i].AvailablePhysicalMemoryPC -le "10") -OR ($hostDetails[$i].AvailablePhysicalMemory -lt "5"))
				{
				[int] $hostDetails[$i].HostMemoryHealth = "3"
				}
			ElseIf ((($hostDetails[$i].AvailablePhysicalMemoryPC -le "20") -And ($hostDetails[$i].AvailablePhysicalMemoryPC -gt "10")) -OR (($hostDetails[$i].AvailablePhysicalMemory -lt "10") -And ($hostDetails[$i].AvailablePhysicalMemory -gt "5")))
				{
				[int] $hostDetails[$i].HostMemoryHealth = 2
				}
			ElseIf ((($hostDetails[$i].AvailablePhysicalMemoryPC -le "30") -And ($hostDetails[$i].AvailablePhysicalMemoryPC -gt "20")) -OR (($hostDetails[$i].AvailablePhysicalMemory -lt "20") -And ($hostDetails[$i].AvailablePhysicalMemory -gt "10")))
				{
				[int] $hostDetails[$i].HostMemoryHealth = 1
				}
			Else
				{
				[int] $hostDetails[$i].HostMemoryHealth = 0
				}
			$procDetails = Get-WmiObject -Class Win32_Processor -Computername $cNodes.Name[$i]
			$hostDetails[$i].Processors = ($procDetails.DeviceID).Count
			$hostDetails[$i].ProcessorCore = ($procDetails.numberofcores |Measure-Object -Sum).sum
			$hostDetails[$i].LogicalProcessors = ($procDetails.numberoflogicalprocessors |Measure-Object -Sum).sum
		}
		$TotalPhysicalMemory = 0
		$AvailablePhysicalMemory = 0
		$hostDetails | % {
			$TotalPhysicalMemory += $_.TotalPhysicalMemory
			$AvailablePhysicalMemory += $_.AvailablePhysicalMemory
		}
		if(!$TotalPhysicalMemory -or $TotalPhysicalMemory -eq 0) {
			$TotalPhysicalMemory = 1;
		}
		$fillingDegree = 1-($AvailablePhysicalMemory/$TotalPhysicalMemory);
	} catch {
		throw @("ERROR: 1 Could not AOS-GetFillingDegree:" + $_.Exception.ItemName + " - " + $_.Exception.Message)
	}
	$props.Add("fillingDegree", $fillingDegree);
	Write-Host $fillingDegree
	
	return $props
}

Open in new window


When the runbook is tested with the Orchestrator runbook tester the degree that is returned is the true number, for instance 0,8432234. If the script GetFillingDegree.ps1 is run from console, it returns the same number 0,8432234. But if the runbook is run from another runbook via "Invoke Runbook," it always returns 1. I tried to echo $fillingDegree in GetFillingDegree.ps1 to a file before it was returned from the function, and I could see the result was the same there as well. So the number is not being changed to 1 on the way to the runbook, through the runbook or when it is returned from it. It is 1 already in the GetFillingDegree.ps1 script, but only if the whole ordeal is started via the runbook activity from another runbook. How to fix?
0
Comment
Question by:itnifl
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
1 Comment
 
LVL 2

Accepted Solution

by:
itnifl earned 0 total points
ID: 40554998
The answer is very simple.
1.To read the cluster resources from the cluster, the user that runs the script must have access to do this on the cluster itself.
2. To use the Get-WmiObject cmdlet, the user running the script needs to have the appropriate access rights to run this cmdlet against the hosts that the cmdlet is running against(the cluster nodes).

When all this is done, all is good.

This would be easier to know if Orchestrator threw a access right violation error, but instead it somehow ends up with returning 1 every time. Not sure why that is, and I am not diving into it :)

Problem solved,
0

Featured Post

Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Background Information Recently I have fixed file server permission issues for one of my client. The client has 1800 users and one Windows Server 2008 R2 domain joined file server with 12 TB of data, 250+ shared folders and the folder structure i…
The following article is intended as a guide to using PowerShell as a more versatile and reliable form of application detection in SCCM.
Although Jacob Bernoulli (1654-1705) has been credited as the creator of "Binomial Distribution Table", Gottfried Leibniz (1646-1716) did his dissertation on the subject in 1666; Leibniz you may recall is the co-inventor of "Calculus" and beat Isaac…
Exchange organizations may use the Journaling Agent of the Transport Service to archive messages going through Exchange. However, if the Transport Service is integrated with some email content management application (such as an antispam), the admini…

734 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question