# encoding: ascii # api: powershell # title: SCOM-CreatePortMonitor # description: Creates a port monitor inside of Operations Manager 2007. Usage is SCOM-CreatePortMonitoring.ps1 -serverName:‘TargetServerName.contoso.com’ -portNumber:‘80’ -pollIntervalSeconds:‘120’ -watcherNodes:“watcher1.contoso.com”, “watcher2.contoso.com” -displayName:‘Test URL monitoring’ -targetMP:‘Port Monitoring MP’ # version: 0.1 # type: function # author: Jeremy Pavleck # license: CC0 # x-poshcode-id: 616 # x-archived: 2016-09-17T15:17:25 # x-published: 2009-09-30T17:45:00 # # param($serverName,$portNumber,$pollIntervalSeconds,$watcherNodes,$displayName,$targetMp) function GetPortMonitoringTemplate { $criteria = "Name = 'Microsoft.SystemCenter.SyntheticTransactions.TCPPortCheck.Template'"; $templateCriteria = new-object Microsoft.EnterpriseManagement.Configuration.MonitoringTemplateCriteria($criteria); $template = (Get-ManagementGroupConnection).ManagementGroup.GetMonitoringTemplates($templateCriteria)[0]; $template; } function GetManagementPack([string]$mpDisplayName) { $criteria = [string]::Format("DisplayName = '{0}'", $mpDisplayName); $mpCriteria = new-object Microsoft.EnterpriseManagement.Configuration.ManagementPackCriteria($criteria); $mg = (Get-ManagementGroupConnection).ManagementGroup; $mp = $mg.GetManagementPacks($mpCriteria)[0]; $mp; } function AddChildElement([System.Xml.XmlElement]$parentElement,[string]$newElementName,[string]$value) { $document = $parentElement.get_OwnerDocument(); $newElement = $document.CreateElement($newElementName); $newElement.set_InnerText($value); $parentElement.AppendChild($newElement); } function CreateWatcherComputerList($watcherNodes) { if($watcherNodes.Count -eq $null) { $watcherNodesList = $watcherNodes; } else { $watcherNodesString = "" for($i = 0; $i -le $watcherNodes.Count; $i++) { $watcherNodesList += $watcherNodes[$i]; if($i -le ($watcherNodes.Count - 2)) { $watcherNodesList += " | " } } $watcherNodesList = [string]::Format("({0})",$watcherNodesList); } $watcherNodesList } function AddWatcherNodesIds([system.Xml.XmlElement]$rootNode,$watcherNodes) { $nodeIdsAdded = $true; $doc = $rootNode.get_OwnerDocument(); $includeListElement = $doc.CreateElement("IncludeList"); $rootNode.AppendChild($includeListElement) if($watcherNodes.Count -eq $null) { $computerMonitoringObject = GetComputerMonitoringObject $watcherNodes; $computerMonitoringObject; if($computerMonitoringObject -eq $null) { $watcherNodes + " not found"; $nodeIdsAdded = $false; } else { AddChildElement $includeListElement "MonitoringObjectId" $computerMonitoringObject.Id.ToString() } } else { foreach($watcherNode in $watcherNodes) { $computerMonitoringObject = GetComputerMonitoringObject $watcherNode if($computerMonitoringObject -eq $null) { $watcherNodes + " not found"; $nodeIdsAdded = $false; } else { AddChildElement $includeListElement "MonitoringObjectId" $computerMonitoringObject.Id.ToString() } } } } function GetComputerMonitoringObject($computerFQDN) { $mg = (Get-ManagementGroupConnection).ManagementGroup; $windowsComputerClass = Get-MonitoringClass -Name:"Microsoft.Windows.Computer" $criteriaFormatString = "[Microsoft.Windows.Computer].[PrincipalName]='{0}'" $criteriaString = [string]::Format($criteriaFormatString,$computerFQDN) $criteria = new-object Microsoft.EnterpriseManagement.Monitoring.MonitoringObjectCriteria($criteriaString,$windowsComputerClass); $monitoringObjects = $mg.GetMonitoringObjects($criteria); $monitoringObjects[0]; } $configDoc = new-object System.Xml.XmlDocument; $rootNode = $configDoc.CreateElement("Configuration"); $configDoc.AppendChild($rootNode); $typeId = [string]::Format("PortMonitoring_{0}", [System.Guid]::NewGuid().ToString("N")) AddChildElement $rootNode "TypeId" $typeId AddChildElement $rootNode "Name" $displayName AddChildElement $rootNode "Description" "" AddChildElement $rootNode "LocaleId" "ENU" AddChildElement $rootNode "ServerName" $serverName AddChildElement $rootNode "Port" $portNumber AddChildElement $rootNode "PollIntervalInSeconds" $pollIntervalSeconds AddWatcherNodesIds $rootNode $watcherNodes $watcherNodesList = CreateWatcherComputerList $watcherNodes AddChildElement $rootNode "WatcherComputersList" $watcherNodesList $uniqueKey = [System.Guid]::NewGuid().ToString(); AddChildElement $rootNode "UniquenessKey" $uniqueKey $template = GetPortMonitoringTemplate $mp = GetManagementPack $targetMp $configDoc.get_InnerXml() $mp.ProcessMonitoringTemplate($template,$configDoc.get_InnerXml(),"PortMon" + [System.Guid]::NewGuid().ToString("N"),$displayName,"")