<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>System Center WebLog by Russ Slaten</title><link>http://blogs.msdn.com/rslaten/default.aspx</link><description>Are you interested in having a dedicated engineer that will be your Microsoft 'go to' technical resource, work with you on projects, provide training and also help troubleshoot problems that come up? Then Dedicated Support Engineering (DSE) is for you. Learn more at &lt;a href="http://www.microsoft.com/services/Microsoftservices"&gt;Microsoft Premier Services&lt;/a&gt; or contact your Technical Account Manager.</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>URL Monitoring Part III – The Monitors</title><link>http://blogs.msdn.com/rslaten/archive/2009/07/07/url-monitoring-part-iii-the-monitors.aspx</link><pubDate>Wed, 08 Jul 2009 00:22:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9823156</guid><dc:creator>rslaten</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/rslaten/comments/9823156.aspx</comments><wfw:commentRss>http://blogs.msdn.com/rslaten/commentrss.aspx?PostID=9823156</wfw:commentRss><wfw:comment>http://blogs.msdn.com/rslaten/rsscomments.aspx?PostID=9823156</wfw:comment><description>&lt;P&gt;This entry is part of the following series: &lt;BR&gt;&lt;A href="http://blogs.msdn.com/rslaten/archive/2009/07/07/custom-url-monitoring-part-i-the-design.aspx" mce_href="http://blogs.msdn.com/rslaten/archive/2009/07/07/custom-url-monitoring-part-i-the-design.aspx"&gt;URL Monitoring Part I – The Design&lt;/A&gt; &lt;BR&gt;&lt;A href="http://blogs.msdn.com/rslaten/archive/2009/07/07/url-monitoring-part-ii-the-classes-and-discoveries.aspx" mce_href="http://blogs.msdn.com/rslaten/archive/2009/07/07/url-monitoring-part-ii-the-classes-and-discoveries.aspx"&gt;URL Monitoring Part II – The Classes and Discoveries&lt;/A&gt; &lt;BR&gt;&lt;A href="http://blogs.msdn.com/rslaten/archive/2009/07/07/url-monitoring-part-iii-the-monitors.aspx" mce_href="http://blogs.msdn.com/rslaten/archive/2009/07/07/url-monitoring-part-iii-the-monitors.aspx"&gt;URL Monitoring Part III – The Monitors&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Creating the monitors was by far the most complex part of this solution because monitors do not use data sources directly.&amp;nbsp; Instead, they use Monitor Types which in turn use data sources.&amp;nbsp; This is because data sources don’t understand the difference between what is considered healthy and what isn’t.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Again, I will use the System Center Configuration Manager Management Point monitor for this example since the other scenarios are built in the same way.&lt;/P&gt;
&lt;P&gt;Step 1 – Creating the web page up/down data source.&amp;nbsp; This custom data source is generic and can be used for any URL but its primary function is to return whether or not a web page returns with or without error.&amp;nbsp; &lt;BR&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture15.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture15.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=Capture15 border=0 alt=Capture15 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture15_thumb.jpg" width=604 height=641 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture15_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;I use the System.Scheduler and Microsoft.SystemCenter.WebApplication.UrlProbe modules so this MP does take a dependency on the Web Application Library MP.&amp;nbsp; Make sure this is added as a reference under File\Management Pack Properties before continuing. &lt;BR&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture16.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture16.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=Capture16 border=0 alt=Capture16 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture16_thumb.jpg" width=604 height=641 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture16_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;The System.Scheduler module is used for kicking off the URL Probe on a dynamic interval which in my example ends up being every 15 seconds.&amp;nbsp; This is a parameter that is passed at the monitor level. &lt;BR&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture17.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture17.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=Capture17 border=0 alt=Capture17 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture17_thumb.jpg" width=604 height=607 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture17_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;The Microsoft.SystemCenter.WebApplication.URLProbe module is very complex so I pasted the configuration below:&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#c0c0c0&gt;&amp;lt;ProbeAction ID="Probe" TypeID="MicrosoftSystemCenterWebApplicationLibrary!Microsoft.SystemCenter.WebApplication.UrlProbe"&amp;gt; &lt;BR&gt;&amp;nbsp; &amp;lt;Proxy /&amp;gt; &lt;BR&gt;&amp;nbsp; &amp;lt;ProxyUserName /&amp;gt; &lt;BR&gt;&amp;nbsp; &amp;lt;ProxyPassword /&amp;gt; &lt;BR&gt;&amp;nbsp; &amp;lt;ProxyAuthenticationScheme&amp;gt;None&amp;lt;/ProxyAuthenticationScheme&amp;gt; &lt;BR&gt;&amp;nbsp; &amp;lt;CredentialUserName /&amp;gt; &lt;BR&gt;&amp;nbsp; &amp;lt;CredentialPassword /&amp;gt; &lt;BR&gt;&amp;nbsp; &amp;lt;AuthenticationScheme&amp;gt;None&amp;lt;/AuthenticationScheme&amp;gt; &lt;BR&gt;&amp;nbsp; &amp;lt;FollowRedirects&amp;gt;true&amp;lt;/FollowRedirects&amp;gt; &lt;BR&gt;&amp;nbsp; &amp;lt;RetryCount&amp;gt;0&amp;lt;/RetryCount&amp;gt; &lt;BR&gt;&amp;nbsp; &amp;lt;RequestTimeout&amp;gt;0&amp;lt;/RequestTimeout&amp;gt; &lt;BR&gt;&amp;nbsp; &amp;lt;Requests&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Request&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;RequestID&amp;gt;1&amp;lt;/RequestID&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;URL&amp;gt;$Config/URLPath$&amp;lt;/URL&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Verb&amp;gt;GET&amp;lt;/Verb&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Version&amp;gt;HTTP/1.1&amp;lt;/Version&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;HttpHeaders&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;HttpHeader&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Name&amp;gt;User-Agent&amp;lt;/Name&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Value&amp;gt;Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)&amp;lt;/Value&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/HttpHeader&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/HttpHeaders&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Body /&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;CheckContentChange&amp;gt;false&amp;lt;/CheckContentChange&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ContentHash&amp;gt;00000000-0000-0000-0000-000000000000&amp;lt;/ContentHash&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Depth&amp;gt;0&amp;lt;/Depth&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ThinkTime&amp;gt;0&amp;lt;/ThinkTime&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;CheckInternalLinks&amp;gt;false&amp;lt;/CheckInternalLinks&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;CheckExternalLinks&amp;gt;false&amp;lt;/CheckExternalLinks&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;CheckResources&amp;gt;false&amp;lt;/CheckResources&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;RequestEvaluationCriteria&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;StopProcessingIfWarningCriteriaIsMet&amp;gt;false&amp;lt;/StopProcessingIfWarningCriteriaIsMet&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;StopProcessingIfErrorCriteriaIsMet&amp;gt;false&amp;lt;/StopProcessingIfErrorCriteriaIsMet&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;BasePageEvaluationCriteria&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;WarningCriteria /&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ErrorCriteria&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;NumericCriteriaExpressions&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;NumericCriteriaExpression&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;NumericRequestMetric&amp;gt;BasePageData/TotalResponseTime&amp;lt;/NumericRequestMetric&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Operator&amp;gt;Greater&amp;lt;/Operator&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Value&amp;gt;$Config/ResponseTime$&amp;lt;/Value&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/NumericCriteriaExpression&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/NumericCriteriaExpressions&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ErrorCriteria&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/BasePageEvaluationCriteria&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;LinksEvaluationCriteria&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;WarningCriteria&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;StatusCodeCriteria&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ListNumericRequestMetric&amp;gt;StatusCode&amp;lt;/ListNumericRequestMetric&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Operator&amp;gt;GreaterEqual&amp;lt;/Operator&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Value&amp;gt;400&amp;lt;/Value&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/StatusCodeCriteria&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/WarningCriteria&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ErrorCriteria /&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/LinksEvaluationCriteria&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ResourcesEvaluationCriteria&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;WarningCriteria&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;StatusCodeCriteria&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ListNumericRequestMetric&amp;gt;StatusCode&amp;lt;/ListNumericRequestMetric&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Operator&amp;gt;GreaterEqual&amp;lt;/Operator&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Value&amp;gt;400&amp;lt;/Value&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/StatusCodeCriteria&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/WarningCriteria&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ErrorCriteria /&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ResourcesEvaluationCriteria&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;WebPageTotalEvaluationCriteria&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;WarningCriteria /&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ErrorCriteria /&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/WebPageTotalEvaluationCriteria&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DepthEvaluationCriteria&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;WarningCriteria /&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ErrorCriteria /&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/DepthEvaluationCriteria&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/RequestEvaluationCriteria&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;FormsAuthCredentials /&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Request&amp;gt; &lt;BR&gt;&amp;nbsp; &amp;lt;/Requests&amp;gt; &lt;BR&gt;&amp;lt;/ProbeAction&amp;gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;This is passed to another data source in the Web Application Library which uses internal libraries to do the actual HTTP request.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;The Configuration Schema tab contains the parameters which are passed to this data source.&amp;nbsp; Currently it only accepts the URL and the interval at which the URL is to be watched. &lt;BR&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture18.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture18.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=Capture18 border=0 alt=Capture18 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture18_thumb.jpg" width=604 height=638 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture18_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;This Data Source should output WebApplicationData. &lt;BR&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture19.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture19.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=Capture19 border=0 alt=Capture19 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture19_thumb.jpg" width=604 height=644 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture19_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Step 2 – Creating the Monitor Type.&amp;nbsp; The Monitor Type takes parameters from the Monitor and passes them onto the data source.&amp;nbsp; It also evaluates the data source to help the monitor determine what criteria equals healthy versus unhealthy. &lt;BR&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture20.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture20.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=Capture20 border=0 alt=Capture20 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture20_thumb.jpg" width=604 height=599 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture20_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;For States just enter something that makes sense for the type of monitor you will be using. &lt;BR&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture21.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture21.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=Capture21 border=0 alt=Capture21 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture21_thumb.jpg" width=604 height=602 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture21_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;The Member Modules start with the data source we just created.&amp;nbsp; The Condition Detections are used to evaluate the results of the data source and the Probe Action is used to recalculate the state of the monitor manually. &lt;BR&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture22.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture22.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=Capture22 border=0 alt=Capture22 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture22_thumb.jpg" width=604 height=599 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture22_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;The configuration of the data source module is fairly simple in that we are accepting parameters from the monitor (which we haven’t created yet) and are just re-passing them to the data source. &lt;BR&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture23.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture23.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=Capture23 border=0 alt=Capture23 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture23_thumb.jpg" width=604 height=607 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture23_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;The first expression filter evaluates the web page as down. &lt;BR&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture24.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture24.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=Capture24 border=0 alt=Capture24 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture24_thumb.jpg" width=604 height=526 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture24_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;The second expression filter evaluates the web page as up. &lt;BR&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture25.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture25.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=Capture25 border=0 alt=Capture25 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture25_thumb.jpg" width=604 height=524 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture25_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;The OnDemandReset Probe Action does not contain any custom configuration information.&lt;/P&gt;
&lt;P&gt;Next we have to specify what order the modules will be executed for the regular detection when there is a failure. &lt;BR&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture26.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture26.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=Capture26 border=0 alt=Capture26 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture26_thumb.jpg" width=604 height=599 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture26_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;Next we have to specify what order the modules will be executed for the regular detection when there is not a failure. &lt;BR&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture27.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture27.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=Capture27 border=0 alt=Capture27 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture27_thumb.jpg" width=604 height=604 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture27_thumb.jpg"&gt;&lt;/A&gt; &lt;BR&gt;
&lt;P&gt;For On Demand we just use the ErrorCodeOK state. &lt;BR&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture28.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture28.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=Capture28 border=0 alt=Capture28 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture28_thumb.jpg" width=604 height=599 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture28_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;The Configuration Schema defines what parameters this Monitor Type accepts. &lt;BR&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture29.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture29.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=Capture29 border=0 alt=Capture29 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture29_thumb.jpg" width=604 height=602 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture29_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Step 3 – Create the Monitor.&amp;nbsp; The monitor is a custom monitor which uses the monitor type we just created.&amp;nbsp; It is also targeted to the SCCMMP class which we created in Part II of this series. &lt;BR&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture30.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture30.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=Capture30 border=0 alt=Capture30 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture30_thumb.jpg" width=604 height=604 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture30_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;The Configuration is how often we want to query the URL and the URL itself.&amp;nbsp; In this case we want the URL to be the registry value(s) that we discovered in the SCCMMP class.&amp;nbsp; This is how one monitor can be used to watch thousands of websites.&amp;nbsp; &lt;BR&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture31.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture31.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=Capture31 border=0 alt=Capture31 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture31_thumb.jpg" width=604 height=576 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture31_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;We must tell the monitor which state means Critical and which means Healthy. &lt;BR&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture32.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture32.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=Capture32 border=0 alt=Capture32 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture32_thumb.jpg" width=604 height=576 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture32_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;I set the example monitor to not alert but this can obviously be configured.&amp;nbsp; Also, in the final solution for my customer we sealed the data sources and monitor types and used a different MP for the classes, discoveries, relationships, and monitors.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;To test out this solution the MP you just created can be imported and if the agent from Part II still exists the discovered inventory should look like this: &lt;BR&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture33.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture33.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=Capture33 border=0 alt=Capture33 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture33_thumb.jpg" width=604 height=404 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture33_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;I don’t have a website with this name so it shows as critical.&amp;nbsp; This is what Health Explorer looks like: &lt;BR&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture34.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture34.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=Capture34 border=0 alt=Capture34 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture34_thumb.jpg" width=604 height=449 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIITheMonitors_CB4A/Capture34_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;If you want to do some more testing add some real URLs to the SCCMMP registry key and add that key to some more watcher nodes.&amp;nbsp; Also, open the MP attached to Part I and look at the other classes and data sources to understand how the text parsing and response time solutions work.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;If you have any questions about this series please let me know.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9823156" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/rslaten/archive/tags/SCCM+2007/default.aspx">SCCM 2007</category><category domain="http://blogs.msdn.com/rslaten/archive/tags/SCOM+2007/default.aspx">SCOM 2007</category></item><item><title>URL Monitoring Part II – The Classes and Discoveries</title><link>http://blogs.msdn.com/rslaten/archive/2009/07/07/url-monitoring-part-ii-the-classes-and-discoveries.aspx</link><pubDate>Wed, 08 Jul 2009 00:14:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9823148</guid><dc:creator>rslaten</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/rslaten/comments/9823148.aspx</comments><wfw:commentRss>http://blogs.msdn.com/rslaten/commentrss.aspx?PostID=9823148</wfw:commentRss><wfw:comment>http://blogs.msdn.com/rslaten/rsscomments.aspx?PostID=9823148</wfw:comment><description>&lt;P&gt;This entry is part of the following series: &lt;BR&gt;&lt;A href="http://blogs.msdn.com/rslaten/archive/2009/07/07/custom-url-monitoring-part-i-the-design.aspx" mce_href="http://blogs.msdn.com/rslaten/archive/2009/07/07/custom-url-monitoring-part-i-the-design.aspx"&gt;URL Monitoring Part I – The Design&lt;/A&gt; &lt;BR&gt;&lt;A href="http://blogs.msdn.com/rslaten/archive/2009/07/07/url-monitoring-part-ii-the-classes-and-discoveries.aspx" mce_href="http://blogs.msdn.com/rslaten/archive/2009/07/07/url-monitoring-part-ii-the-classes-and-discoveries.aspx"&gt;URL Monitoring Part II – The Classes and Discoveries&lt;/A&gt; &lt;BR&gt;&lt;A href="http://blogs.msdn.com/rslaten/archive/2009/07/07/url-monitoring-part-iii-the-monitors.aspx" mce_href="http://blogs.msdn.com/rslaten/archive/2009/07/07/url-monitoring-part-iii-the-monitors.aspx"&gt;URL Monitoring Part III – The Monitors&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Each of the 3 web applications has its own class.&amp;nbsp; The applicable discovery queries a registry key and based on the values in that key creates an instance of the proper web application’s class.&amp;nbsp; Also, each web application can contain multiple URLs if necessary.&lt;/P&gt;
&lt;P&gt;I will use the class I created to monitor System Center Configuration Manager Management Points for this example because they are all built the same way.&lt;/P&gt;
&lt;P&gt;Step 1 - The first thing I did was create a new custom class in the authoring console.&amp;nbsp; The base class is System.Perspective.&amp;nbsp; Notice that one of the attributes is “Hosted”.&amp;nbsp; Do not worry about checking this yet because once we add a relationship it will be checked automatically.&amp;nbsp; Also, I always make what I create “Public”.&amp;nbsp; This is important if you decide to seal the MP and want to access the class from a separate management pack. &lt;BR&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture1.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture1.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=Capture1 border=0 alt=Capture1 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture1_thumb.jpg" width=604 height=614 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture1_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;I added an attribute called “URL” and made it a key value.&amp;nbsp; When the instance of this class is created the “URL” attribute will contain the URL we will be monitoring. &lt;BR&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture2.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture2.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=Capture2 border=0 alt=Capture2 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture2_thumb.jpg" width=604 height=612 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture2_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Step 2 – Next I created a relationship so that the URL we are monitoring is tied to the Watcher Node.&amp;nbsp; I made this a hosting relationship and made it public. &lt;BR&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture3.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture3.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=Capture3 border=0 alt=Capture3 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture3_thumb.jpg" width=604 height=614 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture3_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Step 3 – I then created a new custom data source that the discovery will end up using to create instances of the SCCM MP Class in addition to the other classes I use in the solution. &lt;BR&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture4.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture4.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=Capture4 border=0 alt=Capture4 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture4_thumb.jpg" width=604 height=602 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture4_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I use the System.Scheduler and Microsoft.Windows.ScriptDiscoveryProbe modules in this data source &lt;BR&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture5.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture5.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=Capture5 border=0 alt=Capture5 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture5_thumb.jpg" width=604 height=604 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture5_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;The System.Scheduler module takes a parameter which is passed to the data source by the discovery itself.&amp;nbsp; This parameter is the interval at which the discovery should be run in seconds. &lt;BR&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture6.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture6.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=Capture6 border=0 alt=Capture6 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture6_thumb.jpg" width=604 height=604 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture6_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;The Microsoft.Windows.ScriptDiscoveryProbe module is used to run a script that returns discovery data. &lt;BR&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture7.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture7.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=Capture7 border=0 alt=Capture7 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture7_thumb.jpg" width=604 height=607 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture7_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;The Microsoft.Windows.ScriptDiscoveryProbe module is a bit more complex so I will paste the configuration below: &lt;BR&gt;&lt;BR&gt;&lt;FONT color=#c0c0c0&gt;&amp;lt;ProbeAction ID="DiscoveryProbe" TypeID="Windows!Microsoft.Windows.ScriptDiscoveryProbe"&amp;gt; &lt;BR&gt;&amp;nbsp; &amp;lt;ScriptName&amp;gt;WatcherDiscovery.vbs&amp;lt;/ScriptName&amp;gt; &lt;BR&gt;&amp;nbsp; &amp;lt;Arguments&amp;gt;$Config/FQDN$ $Config/SourceID$ $Config/ManagedEntityID$ $Config/Class$ $Config/Property$ $Config/URLRegKey$&amp;lt;/Arguments&amp;gt; &lt;BR&gt;&amp;nbsp; &amp;lt;ScriptBody&amp;gt;&amp;lt;![CDATA['Arg1 = FQDN of Watcher Node &lt;BR&gt;'Arg2 = SourceID (MPElement) &lt;BR&gt;'Arg3 = ManagedEntityID (Target/Id) &lt;BR&gt;'Arg4 = Class ID &lt;BR&gt;'Arg5 = Property ID &lt;BR&gt;'Arg6 = URL Watcher reg key off hklm &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#c0c0c0&gt;Set oArgs = Wscript.Arguments &lt;BR&gt;sFQDN = UCase(oArgs(0)) &lt;BR&gt;sSourceID = oArgs(1) &lt;BR&gt;sManagedEntityID = oArgs(2) &lt;BR&gt;sClassID = oArgs(3) &lt;BR&gt;sPropertyID = oArgs(4) &lt;BR&gt;sURLRegKey = oArgs(5) &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#c0c0c0&gt;Set oAPI = CreateObject("MOM.ScriptAPI") &lt;BR&gt;Set oDiscoveryData = oAPI.CreateDiscoveryData(0,sSourceID, sManagedEntityID) &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#c0c0c0&gt;'Determine if this is a Watcher Node &lt;BR&gt;const HKEY_LOCAL_MACHINE = &amp;amp;H80000002 &lt;BR&gt;bIsWatcher = False &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#c0c0c0&gt;Set oReg = GetObject("winmgmts:root\default:StdRegProv") &lt;BR&gt;oReg.EnumValues HKEY_LOCAL_MACHINE, sURLRegKey, arrValues &lt;BR&gt;If isarray(arrValues) Then &lt;BR&gt;&amp;nbsp;&amp;nbsp; bIsWatcher = True &lt;BR&gt;End If &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#c0c0c0&gt;If bIsWatcher Then &lt;BR&gt;&amp;nbsp;&amp;nbsp; For Each sValue in arrValues &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; oReg.GetStringValue HKEY_LOCAL_MACHINE, sURLRegKey, sValue, sURL &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set oWatcher = oDiscoveryData.CreateClassInstance(sClassID) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; oWatcher.AddProperty "$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$",sFQDN &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; oWatcher.AddProperty sPropertyID,sURL &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; oWatcher.AddProperty "$MPElement[Name='System!System.Entity']/DisplayName$",sURL &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; oDiscoveryData.AddInstance(oWatcher) &lt;BR&gt;&amp;nbsp;&amp;nbsp; Next &lt;BR&gt;End If &lt;BR&gt;Call oAPI.Return(oDiscoveryData)]]&amp;gt;&amp;lt;/ScriptBody&amp;gt; &lt;BR&gt;&amp;nbsp; &amp;lt;TimeoutSeconds&amp;gt;240&amp;lt;/TimeoutSeconds&amp;gt; &lt;BR&gt;&amp;lt;/ProbeAction&amp;gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;As you can see this is a vbscript that takes 5 arguments.&amp;nbsp; The script queries a registry key and if the key is found returns discovery data that is used by the discovery to create instances of the applicable class.&amp;nbsp; This is the reason we only need to create a handful of monitors to watch thousands of URLs.&lt;/P&gt;
&lt;P&gt;The Configuration Tab of the data source contains all the parameters that are passed into the data source by the discovery, which we will create next. &lt;BR&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture8.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture8.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=Capture8 border=0 alt=Capture8 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture8_thumb.jpg" width=604 height=544 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture8_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The Data Types tab should show that this data source outputs discovery data. &lt;BR&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture9.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture9.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=Capture9 border=0 alt=Capture9 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture9_thumb.jpg" width=604 height=544 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture9_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Step 4 – Now I need to create the discovery that will use this data source.&amp;nbsp; I target the discovery to Microsoft.Windows.Computer because any computer can be a watcher.&amp;nbsp; The way the data source identifies a watcher is by the registry key we pass it. &lt;BR&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture10.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture10.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=Capture10 border=0 alt=Capture10 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture10_thumb.jpg" width=604 height=604 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture10_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Next I added the discovered types.&amp;nbsp; We are discovering instances of the SCCM MP Class so we just add that along with the appropriate attributes we will be populating. &lt;BR&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture11.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture11.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=Capture11 border=0 alt=Capture11 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture11_thumb.jpg" width=604 height=607 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture11_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Next I choose the data source we just created and plug in the appropriate parameters.&amp;nbsp; Notice the interval is set to every 24 hours and the URLRegKey is HKLM by default – Software\URLWatcher\SCCMMP.&amp;nbsp; So if the data source finds this registry key it will read the values underneath it.&amp;nbsp; The value should contain a URL like “&lt;A href="http://mysccmmp/sms_mp/.sms_aut?mplist" mce_href="http://mySCCMMP/sms_mp/.sms_aut?mplist"&gt;http://mySCCMMP/sms_mp/.sms_aut?mplist&lt;/A&gt;”. &lt;BR&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/image_6.png" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/image_6.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/image_thumb_2.png" width=604 height=536 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/image_thumb_2.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;That is it for the class and discovery, just 4 steps (class, relationship, data source, and discovery).&amp;nbsp; To test this out add the following registry key and value to one of your OpsMgr agents and import the MP.&amp;nbsp; Note, you can add more registry values under this key if you want that agent to watch more than one URL in this particular class (so more than one SCCM MP). &lt;BR&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture13.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture13.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=Capture13 border=0 alt=Capture13 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture13_thumb.jpg" width=604 height=434 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture13_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;After importing the MP you just created you should see new discovered, but not monitored, inventory of type “SCCM MP Class”.&amp;nbsp; Notice that the “Path” is actually the Watcher Node while the Display Name is the URL. &lt;BR&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture14.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture14.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=Capture14 border=0 alt=Capture14 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture14_thumb.jpg" width=604 height=404 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/URLMonitoringPartIIClassesandDiscoveries_D7C7/Capture14_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9823148" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/rslaten/archive/tags/SCCM+2007/default.aspx">SCCM 2007</category><category domain="http://blogs.msdn.com/rslaten/archive/tags/SCOM+2007/default.aspx">SCOM 2007</category></item><item><title>Custom URL Monitoring Part I – The Design</title><link>http://blogs.msdn.com/rslaten/archive/2009/07/07/custom-url-monitoring-part-i-the-design.aspx</link><pubDate>Wed, 08 Jul 2009 00:11:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9823144</guid><dc:creator>rslaten</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/rslaten/comments/9823144.aspx</comments><wfw:commentRss>http://blogs.msdn.com/rslaten/commentrss.aspx?PostID=9823144</wfw:commentRss><wfw:comment>http://blogs.msdn.com/rslaten/rsscomments.aspx?PostID=9823144</wfw:comment><description>&lt;P&gt;The out of the box Web Application template that exists in OpsMgr 2007 SP1 and R2 is useful but there are situations where it just doesn’t fit.&lt;/P&gt;
&lt;P&gt;Consider the following scenario: The Contoso Corporation’s global IT headquarters is located in Richardson, TX.&amp;nbsp; They have over 2,000 retail stores spread out across the world and over slow connections.&amp;nbsp; Each of these retail stores have two local servers.&amp;nbsp; One of these servers is a web server that hosts 3 web applications which are used for internal tools critical to the operation of the retail store.&amp;nbsp; The CIO wants the main page of SCCM Management Point site to be checked every 15 seconds to ensure the site is up.&amp;nbsp; She wants the POS Web Application site to be checked every 15 seconds to ensure it is responding within 500ms.&amp;nbsp; Finally, she also wants Store Inventory site to be checked for the text “store inventory web application” every 15 seconds to make sure the site is displaying the appropriate information.&amp;nbsp; Because of the remote nature of these retail stores the CIO wants the check to be done from the non-web server at each retail store where the websites are going to be viewed.&lt;/P&gt;
&lt;P&gt;The out-of-the-box Web Application template in OpsMgr doesn’t fit well in this scenario because we need to monitor 6,000 websites every 15 seconds from 2,000 different watcher nodes.&amp;nbsp; One of my customers has a very similar scenario in their environment and asked for a custom solution that uses OpsMgr.&amp;nbsp; I created a solution that does these checks every 15 seconds from the local watcher node at each retail store.&amp;nbsp; The cool part about this solution is we only use 3 monitors to watch all 6,000 web sites, it is dynamic so once the solution is in place there is very little additional administrative overhead, and it scales incredibly well.&lt;/P&gt;
&lt;P&gt;Because of the complexity of this management pack I decided to split this topic up into multiple blog entries.&amp;nbsp; The primary purpose of this series is to offer an alternative to the Web Application template in OpsMgr and the secondary purpose is to show how I developed this solution.&amp;nbsp; The series is broken up into the following posts:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/rslaten/archive/2009/07/07/custom-url-monitoring-part-i-the-design.aspx" mce_href="http://blogs.msdn.com/rslaten/archive/2009/07/07/custom-url-monitoring-part-i-the-design.aspx"&gt;Custom URL Monitoring Part I – The Design&lt;/A&gt; &lt;BR&gt;&lt;A href="http://blogs.msdn.com/rslaten/archive/2009/07/07/url-monitoring-part-ii-the-classes-and-discoveries.aspx" mce_href="http://blogs.msdn.com/rslaten/archive/2009/07/07/url-monitoring-part-ii-the-classes-and-discoveries.aspx"&gt;Custom URL Monitoring Part II – The Classes and Discoveries&lt;/A&gt; &lt;BR&gt;&lt;A href="http://blogs.msdn.com/rslaten/archive/2009/07/07/url-monitoring-part-iii-the-monitors.aspx" mce_href="http://blogs.msdn.com/rslaten/archive/2009/07/07/url-monitoring-part-iii-the-monitors.aspx"&gt;Custom URL Monitoring Part III – The Monitors&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;My design is generic and was designed for OpsMgr 2007 SP1 although it should also work in R2.&amp;nbsp; It consists of 3 discoveries, 3 classes, 3 monitors, 3 monitor types, and 4 data sources.&amp;nbsp; I attached the entire solution to this blog entry.&lt;/P&gt;
&lt;P&gt;Here is a diagram of the design of this MP:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/CustomURLMonitoringPart1TheDesign_D66B/URLMon_4.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/CustomURLMonitoringPart1TheDesign_D66B/URLMon_4.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: block; FLOAT: none; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; MARGIN-LEFT: auto; BORDER-LEFT-WIDTH: 0px; MARGIN-RIGHT: auto" title=URLMon border=0 alt=URLMon src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/CustomURLMonitoringPart1TheDesign_D66B/URLMon_thumb_1.jpg" width=495 height=978 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/CustomURLMonitoringPart1TheDesign_D66B/URLMon_thumb_1.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;To test this MP in the lab do the following:&lt;/P&gt;
&lt;P&gt;1.&amp;nbsp; Create a test website with the text “store inventory web application” on the main page &lt;BR&gt;2.&amp;nbsp; On several OpsMgr agents (which would act as watcher nodes) create the following registry entries: &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -&amp;nbsp; HKLM\Software\URLWatcher\SCCMMP (Key) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -&amp;nbsp; HKLM\Software\URLWatcher\SCCMMP\SCCMMP:http://&amp;lt;yourwebsite&amp;gt; (String Value) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -&amp;nbsp; HKLM\Software\URLWatcher\POS (Key) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -&amp;nbsp; HKLM\Software\URLWatcher\POS\POS:http://&amp;lt;yourwebsite&amp;gt; (String Value) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -&amp;nbsp; HKLM\Software\URLWatcher\StoreInv (Key) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -&amp;nbsp; HKLM\Software\URLWatcher\StoreInv\StoreInv:http://&amp;lt;yourwebsite&amp;gt; (String Value) &lt;BR&gt;3.&amp;nbsp; Import the MP and wait 5 minutes &lt;BR&gt;4.&amp;nbsp; Under Monitoring\Discovered Inventory look at the 3 classes in the Website Watcher Library MP &lt;BR&gt;5.&amp;nbsp; Change the text and bring the website up/down to view the results&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9823144" width="1" height="1"&gt;</description><enclosure url="http://blogs.msdn.com/rslaten/attachment/9823144.ashx" length="84314" type="application/octet-stream" /><category domain="http://blogs.msdn.com/rslaten/archive/tags/SCCM+2007/default.aspx">SCCM 2007</category><category domain="http://blogs.msdn.com/rslaten/archive/tags/SCOM+2007/default.aspx">SCOM 2007</category></item><item><title>Monitoring the Monitoring solution</title><link>http://blogs.msdn.com/rslaten/archive/2009/02/25/monitoring-the-monitoring-solution.aspx</link><pubDate>Thu, 26 Feb 2009 02:14:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9444762</guid><dc:creator>rslaten</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/rslaten/comments/9444762.aspx</comments><wfw:commentRss>http://blogs.msdn.com/rslaten/commentrss.aspx?PostID=9444762</wfw:commentRss><wfw:comment>http://blogs.msdn.com/rslaten/rsscomments.aspx?PostID=9444762</wfw:comment><description>&lt;P&gt;What if OpsMgr is in a state where it is running but not working properly?&amp;nbsp; Maybe your RMS is gray or the notification and alerting systems are down.&amp;nbsp; How do you detect this condition so someone can take action to resolve it?&amp;nbsp; Monitoring the console all day isn't very efficient.&amp;nbsp; This is where monitoring the monitoring solution is required.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Below is just one approach to detecting these types of failure conditions.&amp;nbsp; First, we generate an alert on an interval which triggers a notification.&amp;nbsp; The alert auto-resolves and the notification triggers a vbscript that updates a log file on a share.&amp;nbsp; An OpsMgr agent (watcher node) is used to read the log file on the share periodically.&amp;nbsp; If the log file is out of date then the agent triggers an external process which notifies the appropriate administrators that OpsMgr is down.&amp;nbsp; Here is a diagram of this design:&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/MonitoringtheMonitor_DF58/Drawing1_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/MonitoringtheMonitor_DF58/Drawing1_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=389 alt=Drawing1 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/MonitoringtheMonitor_DF58/Drawing1_thumb.jpg" width=740 border=0 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/MonitoringtheMonitor_DF58/Drawing1_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=left&gt;The way the agent notifies an administrator is configurable on the rule that runs the script on the agent.&amp;nbsp; The script writes an event 9898 to the agent's Operations Manager event log.&amp;nbsp; This event can be picked up by any other method that can be used to notify the appropriate administrator of a problem.&amp;nbsp; Also, there is an optional parameter of a process that the script can run.&amp;nbsp; This process could me something like sendmail, net send, createticket, etc...&amp;nbsp; which would be used to notify the appropriate administrator of a problem.&amp;nbsp; This is a good design for determining the health of a management group because it uses the alerting and notification systems and if both of these are working then chances are you're going to be alerted of any issues that occur.&lt;/P&gt;
&lt;P align=left&gt;I have created an example MP using this design and provided the steps below to use such an MP.&lt;/P&gt;
&lt;P align=left&gt;Step 1 - Create a share that the RMS and agent watcher can write to&lt;/P&gt;
&lt;P align=left&gt;Step 2 - Copy the RMSMonitor.vbs script to this share&lt;/P&gt;
&lt;P align=left&gt;Step 3 - If an alerting or notification program is to be used then copy this program to the share as well&lt;/P&gt;
&lt;P align=left&gt;Step 4 - Configure Command Notification passing the management group name as a parameter to the VBScript.&amp;nbsp; The MG name is used so if you have multiple management groups you can use the same share&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/MonitoringtheMonitor_DF58/Cap1_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/MonitoringtheMonitor_DF58/Cap1_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=621 alt=Cap1 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/MonitoringtheMonitor_DF58/Cap1_thumb.jpg" width=619 border=0 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/MonitoringtheMonitor_DF58/Cap1_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/MonitoringtheMonitor_DF58/Cap2_4.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/MonitoringtheMonitor_DF58/Cap2_4.jpg"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=213 alt=Cap2 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/MonitoringtheMonitor_DF58/Cap2_thumb_1.jpg" width=625 border=0 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/MonitoringtheMonitor_DF58/Cap2_thumb_1.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/MonitoringtheMonitor_DF58/Cap3_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/MonitoringtheMonitor_DF58/Cap3_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=539 alt=Cap3 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/MonitoringtheMonitor_DF58/Cap3_thumb.jpg" width=625 border=0 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/MonitoringtheMonitor_DF58/Cap3_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=left&gt;Step 5 - Import the MP (it contains one group, one monitor, and one rule with an override)&lt;/P&gt;
&lt;P align=left&gt;Step 6 - Add an agent (which will be the watcher node) to the RMSHealthAgent group&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/MonitoringtheMonitor_DF58/Cap4.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/MonitoringtheMonitor_DF58/Cap4.jpg"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=514 alt=Cap4 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/MonitoringtheMonitor_DF58/Cap4_thumb.jpg" width=724 border=0 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/MonitoringtheMonitor_DF58/Cap4_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=left&gt;Step 7 - Ensure the "Alert Generator" monitor is working by checking for the &amp;lt;mgmtgroupname&amp;gt;RMSMonitor.log.&amp;nbsp; It should contain a new line every 10 minutes.&lt;/P&gt;
&lt;P align=left&gt;Step 8 - Configure the "LogWatcher" Rule.&amp;nbsp; Create an override for this rule so that it is enabled for the RMSHealthAgent group.&amp;nbsp; Modify the script so that the proper parameters are passed (the share path, the mgmt group name-optional, and the application you would like to call to alert you - optional).&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/MonitoringtheMonitor_DF58/Cap5.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/MonitoringtheMonitor_DF58/Cap5.jpg"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=520 alt=Cap5 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/MonitoringtheMonitor_DF58/Cap5_thumb.jpg" width=724 border=0 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/MonitoringtheMonitor_DF58/Cap5_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=left&gt;Step 9 - Confirm it is working properly.&amp;nbsp; If the appropriate RMSMonitor.log is updated within 30 minutes this rule will simply clear the log to keep the size small.&amp;nbsp; If it hasn't then it will update the log saying there is a problem, log an event 9898, and call the alerter program if one was configured.&amp;nbsp; Make sure that the log is either empty or contains fewer than 3 or 4 lines.&amp;nbsp; If it contains more then this rule isn't working properly.&lt;/P&gt;
&lt;P align=left&gt;Much of this example would probably need to be customized based on your environment.&amp;nbsp; Things such as how often the alert is generated, how often the watcher node checks the log, how you get notified, changes in the script, etc...&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9444762" width="1" height="1"&gt;</description><enclosure url="http://blogs.msdn.com/rslaten/attachment/9444762.ashx" length="5536" type="application/x-zip-compressed" /><category domain="http://blogs.msdn.com/rslaten/archive/tags/SCOM+2007/default.aspx">SCOM 2007</category></item><item><title>What do you do here?</title><link>http://blogs.msdn.com/rslaten/archive/2009/02/25/what-do-you-do-here.aspx</link><pubDate>Wed, 25 Feb 2009 05:17:07 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9443471</guid><dc:creator>rslaten</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/rslaten/comments/9443471.aspx</comments><wfw:commentRss>http://blogs.msdn.com/rslaten/commentrss.aspx?PostID=9443471</wfw:commentRss><wfw:comment>http://blogs.msdn.com/rslaten/rsscomments.aspx?PostID=9443471</wfw:comment><description>&lt;p&gt;Here at Microsoft I have had the opportunity to work in different roles on several teams all of which contained very smart people.&amp;#160; I have to say though, I am currently working with some of the most talented engineers of my career.&amp;#160; I work with a team of rock stars and we are part of a larger, very talented, organization called Premier Field Engineering.&amp;#160; &lt;/p&gt;  &lt;p&gt;My OpsMgr focused peers are DSE's (Dedicated Support Engineers).&amp;#160; This means that we work with a single customer, or a very small group of customers, and are their primary resource for everything OpsMgr.&amp;#160; We work with our customers on projects, provide training, and also provide solutions to problems that may arise.&lt;/p&gt;  &lt;p&gt;My current OpsMgr DSE teammates are &lt;a href="http://blogs.msdn.com/steverac"&gt;Steve Rachui&lt;/a&gt;, &lt;a href="http://blogs.technet.com/kevinholman"&gt;Kevin Holman&lt;/a&gt;, &lt;a href="http://blogs.technet.com/jonathanalmquist"&gt;Jonathan Almquist&lt;/a&gt;, and &lt;a href="http://blogs.technet.com/jimmyharper"&gt;Jimmy Harper&lt;/a&gt;.&amp;#160; If you are reading my blog then chances are you've also read their blogs and know about the quality of work that these guys do.&lt;/p&gt;  &lt;p&gt;If you would like to learn more about DSE check out the &lt;a href="http://download.microsoft.com/download/7/a/7/7a722760-703b-49a6-8dea-f24b3af57a45/DSE.pdf"&gt;data sheet&lt;/a&gt; available on the &lt;a href="http://www.microsoft.com/services/Microsoftservices"&gt;Microsoft Services&lt;/a&gt; site or send me an &lt;a href="http://blogs.msdn.com/rslaten/contact.aspx"&gt;e-mail&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9443471" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/rslaten/archive/tags/About+Me/default.aspx">About Me</category></item><item><title>Using a property bag to populate an alert description part II</title><link>http://blogs.msdn.com/rslaten/archive/2009/02/25/using-a-property-bag-to-populate-an-alert-description-part-ii.aspx</link><pubDate>Wed, 25 Feb 2009 04:06:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9443411</guid><dc:creator>rslaten</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/rslaten/comments/9443411.aspx</comments><wfw:commentRss>http://blogs.msdn.com/rslaten/commentrss.aspx?PostID=9443411</wfw:commentRss><wfw:comment>http://blogs.msdn.com/rslaten/rsscomments.aspx?PostID=9443411</wfw:comment><description>&lt;P&gt;Over a year ago I &lt;A href="http://blogs.msdn.com/rslaten/archive/2007/10/12/populating-an-alert-description-with-propertybag-data.aspx" mce_href="http://blogs.msdn.com/rslaten/archive/2007/10/12/populating-an-alert-description-with-propertybag-data.aspx"&gt;blogged&lt;/A&gt; about the proper syntax required to populate an alert description with data returned from a property bag.&amp;nbsp; The syntax in the blog is correct but the idea of doing this confused some.&amp;nbsp; I will describe below how to accomplish this with a rule using the following scenario.&lt;/P&gt;
&lt;P&gt;Lets say you have an application that creates an event (we'll use event 9999 as an example) when it has a certain problem.&amp;nbsp; You want to get alerted when this event occurs, but you want to do some additional diagnostics before the alert is generated and populate the alert description with information collected from the diagnostics.&amp;nbsp; I have put a diagram of this scenario below:&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Diagram1%5B6%5D.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Diagram1%5B6%5D.jpg"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=566 alt=Diagram1 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Diagram1%5B6%5D_thumb.jpg" width=717 border=0 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Diagram1%5B6%5D_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=left&gt;I have listed each step that I used to create this management pack below.&lt;/P&gt;
&lt;P align=left&gt;Step 1 - Create and name a new management pack in the Authoring Console&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture1.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture1.jpg"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=544 alt=Capture1 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture1_thumb.jpg" width=723 border=0 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture1_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=left&gt;Step 2 - Create a new composite data source&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture2.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture2.jpg"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=544 alt=Capture2 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture2_thumb.jpg" width=726 border=0 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture2_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=left&gt;Step 3 - Add the Microsoft.Windows.EventProvider member module to the data source&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture3.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture3.jpg"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=544 alt=Capture3 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture3_thumb.jpg" width=722 border=0 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture3_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=left&gt;Step 4 - Configure the member module to look for an event id from the application event log where the id = a parameter that is passed in.&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture4.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture4.jpg"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=540 alt=Capture4 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture4_thumb.jpg" width=722 border=0 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture4_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=left&gt;Step 5 - Add the Microsoft.Windows.ScriptPropertyBagProbe member module to the data source&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture5.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture5.jpg"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=544 alt=Capture5 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture5_thumb.jpg" width=724 border=0 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture5_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=left&gt;Step 6 - Configure the member module to accept parameters for the script name, arguments, and script body.&amp;nbsp; In my example I hard code the script timeout to 30 seconds but you can also make this configurable via a parameter.&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture6.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture6.jpg"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=544 alt=Capture6 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture6_thumb.jpg" width=724 border=0 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture6_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=left&gt;Step 7 - Set the order of the member modules so the EventProvider runs first, the ScriptProvider runs second, and the Module Output is last.&amp;nbsp; &lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture7.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture7.jpg"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=544 alt=Capture7 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture7_thumb.jpg" width=724 border=0 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture7_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=left&gt;Step 8 - Add all of the parameters that need to be passed into this data source.&amp;nbsp; Your data source is now complete.&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture8.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture8.jpg"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=544 alt=Capture8 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture8_thumb.jpg" width=724 border=0 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture8_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=left&gt;Step 9 - Create a new custom rule in the Authoring Console.&amp;nbsp; I am targeting my rule to Microsoft.Windows.Computer for example purposes.&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture9.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture9.jpg"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=544 alt=Capture9 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture9_thumb.jpg" width=724 border=0 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture9_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=left&gt;Step 10 - On the Modules tab, add our custom data source and then click "Edit" to configure the parameters we want to pass to this data source.&amp;nbsp; My ScriptBody parameter contains a very simple VBScript that returns a string that I want to have appear in the alert description ("This is the information that I collected for my alert").&amp;nbsp; In the real world this string would obviously be additional useful information that was gathered by the vbscript.&amp;nbsp; I use notepad as my XML editor so this is what my configuration looks like.&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture10.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture10.jpg"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=544 alt=Capture10 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture10_thumb.jpg" width=724 border=0 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture10_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=left&gt;Step 11 - After the data source is configured go back to the Modules tab and add a new action of type System.Health.GenerateAlert.&amp;nbsp; Once added click "Edit" and then "Configure" to pull up the Alerting User Interface.&amp;nbsp; Now fill in the appropriate fields for the alert.&amp;nbsp; Notice that the Alert description xpath is looking for the value in the property bag which is populated in the vbscript which we configured in the last step.&amp;nbsp; After this step your rule should be created.&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture11.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture11.jpg"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=544 alt=Capture11 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture11_thumb.jpg" width=724 border=0 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture11_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=left&gt;Step 12 - Import the MP and create an event of 9999 in the application event log on an agent&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture12.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture12.jpg"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=544 alt=Capture12 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture12_thumb.jpg" width=724 border=0 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture12_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P align=left&gt;Step 13 - View the alert generated to ensure it contains the string from the VBScript&lt;/P&gt;
&lt;P align=center&gt;&amp;nbsp;&lt;A href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture13.jpg" mce_href="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture13.jpg"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=544 alt=Capture13 src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture13_thumb.jpg" width=724 border=0 mce_src="http://blogs.msdn.com/blogfiles/rslaten/WindowsLiveWriter/Usingapropertybagtopopulateanalertdescri_F565/Capture13_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=left&gt;I hope this example helps explain how information from a property bag can appear in an alert description and might also be a good introduction to the authoring console for some.&amp;nbsp; I have attached the MP that was created by these steps for your reference.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9443411" width="1" height="1"&gt;</description><enclosure url="http://blogs.msdn.com/rslaten/attachment/9443411.ashx" length="11784" type="application/octet-stream" /><category domain="http://blogs.msdn.com/rslaten/archive/tags/SCOM+2007/default.aspx">SCOM 2007</category></item><item><title>Exporting and importing user roles</title><link>http://blogs.msdn.com/rslaten/archive/2008/11/03/exporting-and-importing-user-roles.aspx</link><pubDate>Tue, 04 Nov 2008 01:24:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9035449</guid><dc:creator>rslaten</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/rslaten/comments/9035449.aspx</comments><wfw:commentRss>http://blogs.msdn.com/rslaten/commentrss.aspx?PostID=9035449</wfw:commentRss><wfw:comment>http://blogs.msdn.com/rslaten/rsscomments.aspx?PostID=9035449</wfw:comment><description>&lt;P&gt;I have a customer who has many management groups and wants to synchronize the user roles between them.&amp;nbsp; There is no easy way to do this in the UI, but it can be done via PowerShell.&amp;nbsp; One of my co-workers, Jonathan Almquist, blogged about this some time ago.&amp;nbsp; His &lt;A href="http://blogs.technet.com/jonathanalmquist/archive/2008/03/23/import-user-roles-powershell.aspx" mce_href="http://blogs.technet.com/jonathanalmquist/archive/2008/03/23/import-user-roles-powershell.aspx"&gt;script&lt;/A&gt; allows one to export the user roles, along with any associated user accounts, and import them in another management group.&amp;nbsp; It, however, doesn't export any associated Group Scopes, Tasks, or Views.&amp;nbsp; The script I have created exports everything associated with the user role and is a great example of creating generic types in PowerShell.&lt;/P&gt;
&lt;P&gt;The script takes two parameters.&amp;nbsp; The first is the name of the MS you want to connect to and the second is either "export" or "import".&amp;nbsp; The export task creates a file called userroles.xml in the same directory as the PS script ran from.&amp;nbsp; To use the "import" task you must place the userroles.xml in the same directory if it isn't already there.&amp;nbsp; The script then looks for any user roles in the userroles.xml that don't exist and creates them.&amp;nbsp; If the user role does exist, but is missing certain users, group scopes, views, or tasks then it will add them.&lt;/P&gt;
&lt;P&gt;I have pasted the script below and also attached a copy to the blog.&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#c0c0c0&gt;#FileName: UserRoleExporter.ps1 &lt;BR&gt;#Created by: Russ Slaten (&lt;/FONT&gt;&lt;A href="http://blogs.msdn.com/rslaten)" mce_href="http://blogs.msdn.com/rslaten)"&gt;&lt;FONT color=#c0c0c0&gt;http://blogs.msdn.com/rslaten)&lt;/FONT&gt;&lt;/A&gt; &lt;BR&gt;&lt;FONT color=#c0c0c0&gt;#Created on: 07/24/2008 &lt;BR&gt;#Modified by: xxx &lt;BR&gt;#Modified on: xx/xx/xxxx &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#c0c0c0&gt;#===========================FUNCTIONS BEGIN=========================== &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#c0c0c0&gt;function Main &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Constants &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $MSPARAM = "MS" &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $TASKPARAM = "TASK" &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $EXPORT = "EXPORT" &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $IMPORT = "IMPORT" &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $XMLFILE = "userroles.xml" &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Get each of the command line parameters passed by the caller &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $managementServer = GetParameter $MSParam &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $task = GetParameter $TASKPARAM &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Write-Host "Task =" $task &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Write-Host "Management Server =" $managementServer &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Configure OpsMgr powershell environment &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ValidateSnapIn &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $drive = SetDrive &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!$drive){throw("Error configuring OpsMgr Environment")} &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Connect to the Management Server &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $ms = GetManagementServer $managementServer &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!$ms){throw("Error connecting to Management Server")} &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Start the applicable task &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ($task.ToString() -eq $EXPORT.ToString()) {ExportRoles $XMLFILE} #Export Roles &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; elseif ($task.ToString() -eq $IMPORT.toString()) {ImportRoles $XMLFILE} #Import Roles &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; trap [Exception]{Write-Error $_.Exception.Message;ShowHelp;exit;} &lt;BR&gt;} #Main &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#c0c0c0&gt;#Exports Roles from Management Group &lt;BR&gt;function ExportRoles([string]$s) &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Get all non-system user roles &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $userroles = get-userRole | where {$_.IsSystem -eq $False} &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Make sure some custom user roles exist &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ($userroles.count -eq 0) {Write-host "No custom user roles found";return 0;} &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Create the XML object &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $doc = New-Object "System.Xml.XmlDocument" &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $doc.LoadXml("&amp;lt;?xml version='1.0' encoding='utf-8'?&amp;gt;&amp;lt;UserRoles xmlns:xsi='&lt;/FONT&gt;&lt;A href="http://www.w3.org/2001/XMLSchema-instance'" mce_href="http://www.w3.org/2001/XMLSchema-instance'"&gt;&lt;FONT color=#c0c0c0&gt;http://www.w3.org/2001/XMLSchema-instance'&lt;/FONT&gt;&lt;/A&gt;&lt;FONT color=#c0c0c0&gt; xmlns:xsd='&lt;/FONT&gt;&lt;A href="http://www.w3.org/2001/XMLSchema'" mce_href="http://www.w3.org/2001/XMLSchema'"&gt;&lt;FONT color=#c0c0c0&gt;http://www.w3.org/2001/XMLSchema'&lt;/FONT&gt;&lt;/A&gt;&lt;FONT color=#c0c0c0&gt;&amp;gt;&amp;lt;/UserRoles&amp;gt;") &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#c0c0c0&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Loop through each user role instance &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach ($mo in $userRoles) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Add single instance data to XML &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $elem = $doc.CreateElement("UserRole") &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $elem.SetAttribute("Name",$mo.Name) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $elem.SetAttribute("DisplayName",$mo.DisplayName) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $elem.SetAttribute("Description",$mo.Description) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $elem.SetAttribute("Profile",$mo.MonitoringProfile) &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#c0c0c0&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Add users to XML if any are defined &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ($mo.Users.count -ne 0) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach ($u in $mo.Users) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $elem2 = $doc.CreateElement("User") &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $elem2.SetAttribute("UserName",$u.ToString()) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $temp = $elem.AppendChild($elem2) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Loop through the groups if the user has explicitly defined group scopes &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ($mo.scope.MonitoringObjects.count -gt 0) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach ($grp in $mo.scope.MonitoringObjects) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $elem2 = $doc.CreateElement("Group") &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $elem2.SetAttribute("GroupScope",$grp.ToString()) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $temp = $elem.AppendChild($elem2) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Loop through the views if the user has explicitly defined views &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ($mo.scope.MonitoringViews.count -gt 0) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach ($view in $mo.scope.MonitoringViews) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $elem2 = $doc.CreateElement("MonitoringView") &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $elem2.SetAttribute("View",$view.First.ToString()) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $elem2.SetAttribute("Bool",$view.Second.ToString()) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $temp = $elem.AppendChild($elem2) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Loop through the non-credential tasks if the user has explicitly defined tasks &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ($mo.scope.NonCredentialMonitoringTasks.count -gt 0) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach ($task in $mo.scope.NonCredentialMonitoringTasks) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $elem2 = $doc.CreateElement("NonCredentialMonitoringTask") &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $elem2.SetAttribute("Task",$task.First.ToString()) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $elem2.SetAttribute("Bool",$task.Second.ToString()) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $temp = $elem.AppendChild($elem2) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Loop through the credential tasks if the user has explicitly defined tasks &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ($mo.scope.CredentialMonitoringTasks.count -gt 0) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach ($task in $mo.scope.CredentialMonitoringTasks) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $elem2 = $doc.CreateElement("CredentialMonitoringTask") &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $elem2.SetAttribute("Task",$task.First.ToString()) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $elem2.SetAttribute("Bool",$task.Second.ToString()) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $temp = $elem.AppendChild($elem2) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Write this new element to the XML document&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $temp = $doc.get_ChildNodes().Item(1).AppendChild($elem) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Write-Host "---" $mo.DisplayName "-&amp;gt; exported" &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Save XML to a file &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $doc.save((Join-path $SCRIPTPATH $s)) &lt;BR&gt;} #ExportRoles &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#c0c0c0&gt;#Imports Roles from XML in Management Group &lt;BR&gt;function ImportRoles([string]$s) &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Get existing Non-System User Roles &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $existingUserRoles = get-userRole | where {$_.IsSystem -eq $False} &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Open XML file &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $doc = New-Object "System.Xml.XmlDocument" &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $doc.load((Join-Path $SCRIPTPATH $s)) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Loop through each user role &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $userRoles = $doc.SelectNodes("UserRoles/UserRole") &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach ($mo in $userRoles) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Check to see if user already exists &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $bFound = $false &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach ($u in $existingUserRoles) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ($mo.Name -eq $u.Name) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Write-Host $mo.Name ":Role already exists, adding permissions" &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $bFound = $true &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ReplicateUserRoleRights $mo &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!$bFound) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Create new role &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CreateNewUserRole $mo &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;} #ImportRoles &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#c0c0c0&gt;function ReplicateUserRoleRights([System.Object]$xml) &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Get the user &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $obj = get-userRole | where {$_.Name -eq $xml.Name} &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Write-Host $obj.Name ":Adding rights" &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #First add users &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach ($xmlConsoleUser in $xml.User) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $bFound = $false &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach ($consoleUser in $obj.Users) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ($xmlConsoleUser.UserName -eq $consoleUser) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $bFound = $true &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!$bFound) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ($xmlConsoleUser.UserName.length -gt 1) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $obj.Users.Add($xmlConsoleUser.UserName) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $obj.Update() &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Write-Host $obj.Name "-User:" $xmlConsoleUser.UserName "-&amp;gt;added" &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Write-Host $obj.Name "-User:" $xmlConsoleUser.UserName "-&amp;gt;already exists" &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#c0c0c0&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Now Add Group Scopes &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach ($xmlGroupScope in $xml.Group) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $bFound = $false &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach ($consoleScope in $obj.Scope.MonitoringObjects) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ($xmlGroupScope.GroupScope -eq $consoleScope.ToString()) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $bFound = $true &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!$bFound) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $ret = $true &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [string]$sGuid = $xmlGroupScope.GroupScope &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ($sGuid.length -ne 0) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $obj.Scope.MonitoringObjects.Add($sGuid) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $ret = $obj.Update() &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; trap [Exception]{continue} &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!$ret) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Write-Host $obj.Name "-GroupScope:" $xmlGroupScope.GroupScope "-&amp;gt;added" &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Write-Host $obj.Name "-GroupScope:" $xmlGroupScope.GroupScope "-&amp;gt;no matching group" &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Write-Host $obj.Name "-GroupScope:" $xmlGroupScope.GroupScope "-&amp;gt;already exists" &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Create generic type (used for views and tasks if there are any) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $genericType = [Type] "Microsoft.EnterpriseManagement.Common.Pair``2" &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $typeParameters = "System.Guid","System.Boolean" &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [type[]] $typedParameters = $typeParameters &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $closedType = $genericType.MakeGenericType($typedParameters) &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#c0c0c0&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Now Add Views &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach ($xmlView in $xml.MonitoringView) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $bFound = $false &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach ($consoleView in $obj.Scope.MonitoringViews) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ($xmlView.View.ToString() -eq $consoleView.First.ToString()) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $bFound = $true &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!$bFound) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $ret = $true &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ($xmlView.View.length -gt 1) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ($xmlView.bool -eq $false) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $second = $false &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $params = [guid]$xmlView.View,$second &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $pair = [Activator]::CreateInstance($closedType, $params) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $obj.Scope.MonitoringViews.Add($pair) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $ret = $obj.Update() &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; trap [Exception]{continue} &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!$ret) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Write-Host $obj.Name "-View:" $xmlView.View "-&amp;gt;added" &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Write-Host $obj.Name "-View:" $xmlView.View "-&amp;gt;no matching group" &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Write-Host $obj.Name "-View:" $xmlView.View "-&amp;gt;already exists" &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Now Add noncredentialmonitoringtasks &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach ($xmlNonCred in $xml.NonCredentialMonitoringTask) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $bFound = $false &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach ($consoleNonCred in $obj.Scope.NonCredentialMonitoringTasks) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ($xmlNonCred.Task.ToString() -eq $consoleNonCred.First.ToString()) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $bFound = $true &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!$bFound) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $ret = $true &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ($xmlNonCred.Task.length -gt 1) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ($xmlNonCred.bool -eq $false) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $second = $false &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $params = [guid]$xmlNonCred.Task,$second &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $pair = [Activator]::CreateInstance($closedType, $params) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $obj.Scope.NonCredentialMonitoringTasks.Add($pair) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $ret = $obj.Update() &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; trap [Exception]{continue} &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!$ret) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Write-Host $obj.Name "-NonCredTask:" $xmlNonCred.Task "-&amp;gt;added" &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Write-Host $obj.Name "-NonCredTask:" $xmlNonCred.Task "-&amp;gt;no matching group" &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Write-Host $obj.Name "-NonCredTask:" $xmlNonCred.Task "-&amp;gt;already exists" &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Now Add credentialmonitoringtasks &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach ($xmlCred in $xml.CredentialMonitoringTask) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $bFound = $false &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach ($consoleCred in $obj.Scope.CredentialMonitoringTasks) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ($xmlCred.Task.ToString() -eq $consoleCred.First.ToString()) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $bFound = $true &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!$bFound) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $ret = $true &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ($xmlCred.Task.length -gt 1) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ($xmlCred.bool -eq $false) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $second = $false &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $params = [guid]$xmlCred.Task,$second &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $pair = [Activator]::CreateInstance($closedType, $params) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $obj.Scope.CredentialMonitoringTasks.Add($pair) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $ret = $obj.Update() &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; trap [Exception]{continue} &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!$ret) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Write-Host $obj.Name "-CredTask:" $xmlCred.Task "-&amp;gt;added" &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Write-Host $obj.Name "-CredTask:" $xmlCred.Task "-&amp;gt;no matching group" &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Write-Host $obj.Name "-CredTask:" $xmlCred.Task "-&amp;gt;already exists" &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;} #ReplicateUserRoleRights &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#c0c0c0&gt;function CreateNewUserRole([System.Object]$xml) &lt;BR&gt;{&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Create a new User Role Object &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $obj = new-object Microsoft.EnterpriseManagement.Monitoring.Security.MonitoringUserRole &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Populate the common fields for the userrole &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $obj.Name = $xml.Name &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $obj.DisplayName = $xml.DisplayName &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $obj.Description = $xml.Description&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $profile = $mg.GetMonitoringProfiles() | where {$_.Name -eq $xml.Profile} &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $obj.MonitoringProfile = $profile &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $mg.InsertMonitoringUserRole($obj) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Now Replicate the rights associated with this role &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Write-Host $xml.Name ":New user role created" &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ReplicateUserRoleRights $xml &lt;BR&gt;} #CreateNewUserRole &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#c0c0c0&gt;#Validates the parameters passed by the caller &lt;BR&gt;#Pass either "MS" or "TASK" depending on which parameter you want &lt;BR&gt;function GetParameter([string]$s) &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #First, make sure the caller passed at least two parameters to the script &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ($cmdLineArgs.count -ne 2) {throw("Error getting command line parameters")} &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Now, validate the contents of the parameter &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ($s -eq "MS"){return $cmdLineArgs[0]} &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; elseif ($s -eq "TASK") &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ($cmdLineArgs[1] -eq "EXPORT"){return "EXPORT"} &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; elseif ($cmdLineArgs[1] -eq "IMPORT") {return "IMPORT"} &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else {throw("Error matching 2nd command line parameter")} &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else {throw("Error getting command line parameters")} &lt;BR&gt;} #GetParameters &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#c0c0c0&gt;#This function tests whether the opsmgr snap-in has been added &lt;BR&gt;function ValidateSnapIn &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $snapins = PsSnapIn | select-Object name &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $added = $false &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach ($o in $snapins) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ($o -like "*Microsoft.EnterpriseManagement.OperationsManager.Client*") &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $added = $true &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!$added) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; add-PsSnapIn "Microsoft.EnterpriseManagement.OperationsManager.Client" &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; write-Host "OpsMgr Snap-in added." &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; write-Host "OpsMgr Snap-in already added." &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;} #ValidateSnapIn &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#c0c0c0&gt;function SetDrive &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Sets location &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; set-location "OperationsManagerMonitoring::" &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#c0c0c0&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $drv = psdrive | select-Object name &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $added = $false &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach ($d in $drive) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ($d -like "*Monitoring*") &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $added = $true &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!$added) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; New-PSDrive -Name: Monitoring -PSProvider: OperationsManagerMonitoring -Root: \ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; write-Host "Monitoring Drive added." &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; write-Host "Monitoring Drive already added." &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return $psdrive &lt;BR&gt;} #SetDrive &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#c0c0c0&gt;function GetManagementServer([string]$s) &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; New-ManagementGroupConnection -ConnectionString: $s &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cd Monitoring:\$s &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $mg = (get-item .).ManagementGroup &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return $mg &lt;BR&gt;} #GetManagementServer &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#c0c0c0&gt;function ShowHelp &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Write-Host "-----UserRoleExporter.ps1 Help-----" &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Write-Host "This is an example script for exporting and importing user roles from OpsMgr" &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Write-Host "" &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Write-Host "UserRoleExporter.ps1 Usage:" &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Write-Host "Parameter 1: &amp;lt;Management Server Name&amp;gt;" &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Write-Host "Parameter 2: import or export" &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Write-Host "Example: UserRoleExporter.ps1 myRMS export" &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Write-Host "" &lt;BR&gt;} #ShowHelp &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#c0c0c0&gt;#===========================FUNCTIONS END=========================== &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#c0c0c0&gt;#Get CmdLine Args and set global &lt;BR&gt;$CmdLineArgs = $Args &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#c0c0c0&gt;#Get path script was called from and set global &lt;BR&gt;$SCRIPTPATH = $MyInvocation.Mycommand.Path | Split-Path -Parent &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#c0c0c0&gt;#Get Management Group Connection &lt;BR&gt;$mg = (get-item .).ManagementGroup &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#c0c0c0&gt;#Calls the main program &lt;BR&gt;Main &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#c0c0c0&gt;# End of Script&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9035449" width="1" height="1"&gt;</description><enclosure url="http://blogs.msdn.com/rslaten/attachment/9035449.ashx" length="13198" type="text/plain" /><category domain="http://blogs.msdn.com/rslaten/archive/tags/SCOM+2007/default.aspx">SCOM 2007</category></item><item><title>The Mystery of the stuck alerts</title><link>http://blogs.msdn.com/rslaten/archive/2008/10/17/the-mystery-of-the-stuck-alerts.aspx</link><pubDate>Fri, 17 Oct 2008 22:13:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9003547</guid><dc:creator>rslaten</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/rslaten/comments/9003547.aspx</comments><wfw:commentRss>http://blogs.msdn.com/rslaten/commentrss.aspx?PostID=9003547</wfw:commentRss><wfw:comment>http://blogs.msdn.com/rslaten/rsscomments.aspx?PostID=9003547</wfw:comment><description>&lt;P&gt;Occasionally I run across an issue that requires immediate action be taken to resolve the problem while any root cause analysis is an afterthought.&amp;nbsp; Last week I handled such an issue.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;My customer has a connector that was continually sending around 20 alerts from OpsMgr to an event correlation product.&amp;nbsp; There are many different monitoring solutions that send data to this product and the connector was flooding the event correlation product with the same 20 alerts which resulted in plugging up their alert ticketing system.&amp;nbsp; We consulted with the 3rd party connector vendor for a few hours but progress was a bit slow so I tried to think of a way, from an OpsMgr perspective, to make this stop occurring.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;I consulted a co-worked, Tim "god of everything connector" Helton, and he came up with an idea.&amp;nbsp; His idea involved installing a bogus connector, changing the ConnectorId property on the "stuck" alerts to the bogus connector, and uninstalling the bogus connector.&amp;nbsp; Since you can't change the ConnectorId to NULL through the SDK you have to install the bogus connector first.&amp;nbsp; Once the bogus connector is uninstalled the ConnectorId will then change to NULL.&lt;/P&gt;
&lt;P&gt;I started by getting a bogus connector.&amp;nbsp; I used a simple connector from a class that Tim taught but you can easily create your own.&amp;nbsp; Ambrose Wong wrote a good &lt;A href="http://blogs.msdn.com/jakuboleksy/archive/2008/01/09/scom-connector-quickstart-guide.aspx" mce_href="http://blogs.msdn.com/jakuboleksy/archive/2008/01/09/scom-connector-quickstart-guide.aspx"&gt;connector guide&lt;/A&gt; which contains some sample code for creating a connector.&lt;/P&gt;
&lt;P&gt;I then installed the connector in my lab and obtained the GUID of the connector.&amp;nbsp; Next I created a PS script to change the ConnectorId on all those pesky alerts.&amp;nbsp; Here is my script:&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#c0c0c0&gt;##The alertID’s were ID’s of stuck alerts &lt;BR&gt;##The Connector ID is Tim's demo connector&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#c0c0c0&gt;##This function does the set &lt;BR&gt;function SetAlertDestination([string]$s) &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp; $alert = get-alert | where {$_.ID -eq $s} &lt;BR&gt;&amp;nbsp;&amp;nbsp; Set-AlertDestination -Alert $alert -Connector $connector &lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#c0c0c0&gt;##Get the bogus connector using its GUID &lt;BR&gt;$connector = get-connector | where {$_.ID -eq 'aaaaaaaa-1111-2222-3333-0305e82c3301'}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#c0c0c0&gt;##Set it to the bogus connector &lt;BR&gt;SetAlertDestination "5ce5fd8f-790e-4e87-aabc-c0aae3f935a6" &lt;BR&gt;SetAlertDestination "20087c39-6669-4791-910d-14e9d89d5650" &lt;BR&gt;SetAlertDestination "1e6362a8-cb06-4f2a-a4ec-90e2a1b6fa24" &lt;BR&gt;SetAlertDestination "c5a748e8-d299-4743-b77d-75279716c6ea" &lt;BR&gt;SetAlertDestination "a33c0582-f1b9-42de-9639-60057641a261" &lt;BR&gt;SetAlertDestination "6ee1f643-5589-4481-a38e-b8d36b57b5cc" &lt;BR&gt;SetAlertDestination "e93e0bf5-0563-4edc-b8df-fa0bc4f96e0a" &lt;BR&gt;SetAlertDestination "339510ea-7dee-482c-9388-398f7982c72d" &lt;BR&gt;SetAlertDestination "2703c193-3712-4eb4-9d16-5754a4b4d646" &lt;BR&gt;SetAlertDestination "f1474a98-1383-4173-89b4-3f98dfa7a58b" &lt;BR&gt;SetAlertDestination "6c70a0bf-0ca3-4039-9195-a4640d2edc01" &lt;BR&gt;SetAlertDestination "97331f49-b535-4edb-ba83-722ed0c36f4d" &lt;BR&gt;SetAlertDestination "203ff402-a3fd-4fe4-b672-2ff30449011a" &lt;BR&gt;SetAlertDestination "4855f316-9bcf-447f-8888-5bd19106abd5" &lt;BR&gt;SetAlertDestination "a0716409-3d8e-42a4-b70f-ecbf9dbfec92" &lt;BR&gt;SetAlertDestination "3edc53e6-2d43-4a4d-98ce-b50261fe63e5" &lt;BR&gt;SetAlertDestination "7b6dfd88-1d59-46d6-bbc9-351bd04e1349" &lt;BR&gt;SetAlertDestination "56fea496-f4fe-4563-9b6e-2e614d75b601" &lt;BR&gt;SetAlertDestination "3a71c969-7eb8-49fb-904f-6b9673d52396" &lt;BR&gt;SetAlertDestination "fb51278a-8b01-4484-9470-d2bd1a1c9316"&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;After doing some testing in my lab I had my customer install the demo connector and run the script.&amp;nbsp; The script ran and did end up changing the ConnectorId of the stuck alerts and the connector stopped trying to forward them.&amp;nbsp; The connector was then uninstalled and the ConnectorId property went to NULL on all the bad alerts.&amp;nbsp; We don't know the root cause here, but at least all is now well in ticketing system.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9003547" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/rslaten/archive/tags/SCOM+2007/default.aspx">SCOM 2007</category></item><item><title>Get all alerts within a certain time period</title><link>http://blogs.msdn.com/rslaten/archive/2008/09/02/get-all-alerts-within-a-certain-time-period.aspx</link><pubDate>Tue, 02 Sep 2008 17:59:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8920092</guid><dc:creator>rslaten</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/rslaten/comments/8920092.aspx</comments><wfw:commentRss>http://blogs.msdn.com/rslaten/commentrss.aspx?PostID=8920092</wfw:commentRss><wfw:comment>http://blogs.msdn.com/rslaten/rsscomments.aspx?PostID=8920092</wfw:comment><description>&lt;P&gt;A co-worker of mine ran into an alert flood scenario and needed to resolve a large number of alerts.&amp;nbsp; He tried the following PowerShell command:&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#c0c0c0&gt;Get-Alert | where {$_.ResolutionState -eq "New"} | Resolve-Alert&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;This eventually ended up throwing an out of memory exception.&amp;nbsp; This command is obviously attempting to resolve all of the alerts from the flood at once.&amp;nbsp; Another alternative would be to resolve them in chunks.&amp;nbsp; I provided a script that retrieves all alerts that were raised within the last 30 minutes.&amp;nbsp; This can be modified to get only new alerts, set the resolution state of each alert, and also get the alerts from the past hour, day, month, etc...&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&lt;FONT color=#c0c0c0&gt;#rslaten 08/29/2008&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#c0c0c0&gt;#get current time &lt;BR&gt;$now = &lt;B&gt;Get-Date&lt;/B&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#c0c0c0&gt;#subtract 30 minutes &lt;BR&gt;$newTime = $now.AddMinutes(-30)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#c0c0c0&gt;#format time correctly &lt;BR&gt;$timeFormat = $newTime.ToShortDateString() + " " + $newTime.ToLongTimeString()&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#c0c0c0&gt;#set criteria &lt;BR&gt;$criteria = "TimeRaised &amp;gt;= '" + $timeFormat + "'"&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#c0c0c0&gt;#query OpsMgr &lt;BR&gt;$alerts = &lt;B&gt;Get-Alert&lt;/B&gt; &lt;I&gt;-Criteria&lt;/I&gt; $criteria&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#c0c0c0&gt;#print to console &lt;BR&gt;&lt;B&gt;Write-Host&lt;/B&gt; "Command = Get-Alert - Criteria" + $criteria &lt;BR&gt;foreach ($alert in $alerts) {$alert.name + ":" + $alert.TimeRaised}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Check out the &lt;A href="http://blogs.msdn.com/powershell/archive/2006/09/17/The-Wonders-of-Date-Math-using-Windows-PowerShell.aspx" mce_href="http://blogs.msdn.com/powershell/archive/2006/09/17/The-Wonders-of-Date-Math-using-Windows-PowerShell.aspx"&gt;PowerShell Team Blog&lt;/A&gt; for more commands that you can use on the DateTime object.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8920092" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/rslaten/archive/tags/SCOM+2007/default.aspx">SCOM 2007</category></item><item><title>Adding Run AS accounts using powershell</title><link>http://blogs.msdn.com/rslaten/archive/2008/08/27/adding-run-as-accounts-using-powershell.aspx</link><pubDate>Wed, 27 Aug 2008 19:51:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8900756</guid><dc:creator>rslaten</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/rslaten/comments/8900756.aspx</comments><wfw:commentRss>http://blogs.msdn.com/rslaten/commentrss.aspx?PostID=8900756</wfw:commentRss><wfw:comment>http://blogs.msdn.com/rslaten/rsscomments.aspx?PostID=8900756</wfw:comment><description>&lt;P&gt;A customer of mine ran across a situation where they had to add a significant number of runas accounts to OpsMgr and didn't want to do it through the UI.&amp;nbsp; The customer happened to have the account information handy and wanted to know how to script this.&amp;nbsp; I provided the following example:&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#c0c0c0&gt;#Rslaten 08/26/2008&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#c0c0c0&gt;#Connect to MG &lt;BR&gt;$mg = (Get-Item .).ManagementGroup&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#c0c0c0&gt;#Create new account object &lt;BR&gt;$oAccount = New-Object Microsoft.EnterpriseManagement.Monitoring.Security.MonitoringWindowsCredentialSecureData&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#c0c0c0&gt;#Input basic account details &lt;BR&gt;$oAccount.Domain = "MyDomain" &lt;BR&gt;$oAccount.UserName = "testaccount" &lt;BR&gt;$oAccount.Name = "Test Account" &lt;BR&gt;$sPassword = "MyPassword"&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#c0c0c0&gt;#Set Password (more complicated than the previous settings) &lt;BR&gt;$oPassword = New-Object System.Security.SecureString &lt;BR&gt;foreach($char in $sPassword.ToCharArray()) &lt;BR&gt;{ &lt;BR&gt;$oPassword.AppendChar($char) &lt;BR&gt;} &lt;BR&gt;$oAccount.SecureData = $oPassword&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#c0c0c0&gt;#Finally add the account &lt;BR&gt;$mg.InsertMonitoringSecureData($oAccount)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Obviously you could modify this to read the account information from a txt file.&amp;nbsp; Another way (probably a more secure way) is to gather the account information via command line.&amp;nbsp; Check out the Get-Credential command if you want to do this.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8900756" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/rslaten/archive/tags/SCOM+2007/default.aspx">SCOM 2007</category></item><item><title>Event 5206</title><link>http://blogs.msdn.com/rslaten/archive/2008/08/27/event-5206.aspx</link><pubDate>Wed, 27 Aug 2008 19:42:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8900691</guid><dc:creator>rslaten</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/rslaten/comments/8900691.aspx</comments><wfw:commentRss>http://blogs.msdn.com/rslaten/commentrss.aspx?PostID=8900691</wfw:commentRss><wfw:comment>http://blogs.msdn.com/rslaten/rsscomments.aspx?PostID=8900691</wfw:comment><description>&lt;P&gt;I was doing a health check for a customer and ran across the following warning event which occurred almost daily:&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Event ID:&lt;/STRONG&gt; 5206 &lt;BR&gt;&lt;STRONG&gt;Event Description:&lt;/STRONG&gt; In memory container (hash table System.Health.EntityStateChangeData) had to drop data because it reached max limit. Possible data loss.&lt;/P&gt;
&lt;P&gt;I did some research and found that the default for this container is 1024.&amp;nbsp; This can be configured through the following DWORD value: &lt;/P&gt;
&lt;P&gt;HKLM\System\CurrentControlSet\Services\HealthService\Parameters:”State Queue Items”&lt;/P&gt;
&lt;P&gt;I recommended that my customer set this to 2048 and if the errors continue to recur then try doubling it again.&amp;nbsp; There my be some other underlying issues that cause this queue to fill up so this my need to be troubleshot further if errors continue after this value has been raised significantly.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8900691" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/rslaten/archive/tags/SCOM+2007/default.aspx">SCOM 2007</category></item><item><title>New Role at Microsoft</title><link>http://blogs.msdn.com/rslaten/archive/2008/08/27/new-role-at-microsoft.aspx</link><pubDate>Wed, 27 Aug 2008 19:33:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8900669</guid><dc:creator>rslaten</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/rslaten/comments/8900669.aspx</comments><wfw:commentRss>http://blogs.msdn.com/rslaten/commentrss.aspx?PostID=8900669</wfw:commentRss><wfw:comment>http://blogs.msdn.com/rslaten/rsscomments.aspx?PostID=8900669</wfw:comment><description>&lt;P&gt;This is my first post in 2008 and definitely won't be my last.&amp;nbsp; In April I transitioned to a new role here at Microsoft.&amp;nbsp; I was previously in Escalation Engineer for most of the System Center product line.&amp;nbsp; I am now a dedicated support engineer focused exclusively on System Center Operations Manager 2007.&amp;nbsp; I provide support, training, and consulting to customers with the some of the largest and most complex OpsMgr deployments in the world.&amp;nbsp; This means that most of my upcoming posts will be focused on OpsMgr.&amp;nbsp; Many of my peers do the same thing for SMS and SCCM and I work with them from time to time so I will still continue to try and post some SMS/SCCM goodness.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8900669" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/rslaten/archive/tags/About+Me/default.aspx">About Me</category></item><item><title>MOM 2005 MCF throws an exception when UpdateAlerts() is called</title><link>http://blogs.msdn.com/rslaten/archive/2007/11/08/mom-2005-mcf-throws-an-exception-when-updatealerts-is-called.aspx</link><pubDate>Thu, 08 Nov 2007 19:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:5989673</guid><dc:creator>rslaten</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/rslaten/comments/5989673.aspx</comments><wfw:commentRss>http://blogs.msdn.com/rslaten/commentrss.aspx?PostID=5989673</wfw:commentRss><wfw:comment>http://blogs.msdn.com/rslaten/rsscomments.aspx?PostID=5989673</wfw:comment><description>&lt;P&gt;After calling UpdateAlerts() an exception is returned: "Value does not fall within the expected range". DBGView will show the following output: &lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE: 7pt; FONT-FAMILY: Arial"&gt;[4680] [E] 04680.01796, (cdasmomconnectorframework.cpp::2114) Could not decode unknown vartype 36 ! &lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 7pt; FONT-FAMILY: Arial"&gt;[4680] [E] 04680.01796, (cdasmomconnectorframework.cpp::2045) Could not decode unknown vartype 36 ! &lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 7pt; FONT-FAMILY: Arial"&gt;[4680] [E] 04680.01796, (cdasmomconnectorframework.cpp::1991) Could not determine ADO type or typeLength for [0][0] Param Name is @AlertId and VARTYPE is 36 [hr=0x80070057]! &lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 7pt; FONT-FAMILY: Arial"&gt;[4680] [E] 04680.01796, (cdasmomconnectorframework.cpp::1342) AppendParamsFromSafeArray() failed for AlertHistory # 0 [hr=0x80070057] ! &lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;This error occurred for a customer after compiling their custom application in Visual Studio 2005. This did not happen when it was compiled with Visual Studio 2003. It turns out that the MCF isn't designed to work with the .NET 2.0 runtime. The solution here is to compile the application in VS 2003 or us MSBee (&lt;A href="http://www.codeplex.com/MSBee" mce_href="http://www.codeplex.com/MSBee"&gt;http://www.codeplex.com/MSBee&lt;/A&gt;) to force the use of the .NET 1.1 runtime.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=5989673" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/rslaten/archive/tags/MOM+2005/default.aspx">MOM 2005</category></item><item><title>SNMPVarBinds and the Alert Description Field in OpsMgr 2007</title><link>http://blogs.msdn.com/rslaten/archive/2007/10/31/snmpvarbinds-and-the-alert-description-field-in-opsmgr-2007.aspx</link><pubDate>Wed, 31 Oct 2007 20:49:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:5801863</guid><dc:creator>rslaten</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/rslaten/comments/5801863.aspx</comments><wfw:commentRss>http://blogs.msdn.com/rslaten/commentrss.aspx?PostID=5801863</wfw:commentRss><wfw:comment>http://blogs.msdn.com/rslaten/rsscomments.aspx?PostID=5801863</wfw:comment><description>&lt;P&gt;I recently had the opportunity to learn a lot about SNMPVarBind values and populating those values in the Alert description Field from a monitor and rule. A customer was having difficulty determining the proper syntax to use for this and with the help of some folks in the OpsMgr product group I've documented it below: &lt;/P&gt;
&lt;P&gt;For a Rule: &lt;/P&gt;
&lt;P style="MARGIN-LEFT: 36pt"&gt;Added "Simple Network Management Protocol" through Add/Remove programs on the OpsMgr server&lt;BR&gt;Configured the community name as "public" and to accept packets from any host&lt;BR&gt;In the OpsMgr console, ran the Network Devices Discovery Wizard&lt;BR&gt;It discovered my SNMP device and I selected it to manage&lt;BR&gt;Created a new SNMP Trap (Alert) rule and tested generating alerts using trapgen&lt;BR&gt;Used the following syntax for the Alert description: &lt;SPAN style="COLOR: #ffc000"&gt;$Data/EventData/DataItem/SnmpVarBinds/SnmpVarBind[1]/Value$&lt;/SPAN&gt;&lt;BR&gt;Tested by creating an SNMP Trap using trapgen.exe&lt;BR&gt;Alert appeared and the alert description contained the value specified &lt;/P&gt;
&lt;P&gt;For a Monitor: &lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;Use the following syntax for the Alert description: &lt;SPAN style="COLOR: #ffc000"&gt;$Data/Context/SnmpVarBinds/SnmpVarBind[1]/Value$&lt;/SPAN&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;SPAN style="COLOR: #ffc000"&gt;&lt;/SPAN&gt;To figure out the proper value we used a collection rule and viewed the raw event data from the collection rule. Also, we found that if you enter more than 10 parameters for Alert description they won't get reported properly. This is currently a limitation in OpsMgr 07.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=5801863" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/rslaten/archive/tags/SCOM+2007/default.aspx">SCOM 2007</category></item><item><title>New System Center Product Group Blog</title><link>http://blogs.msdn.com/rslaten/archive/2007/10/31/new-system-center-product-group-blog.aspx</link><pubDate>Wed, 31 Oct 2007 18:07:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:5799607</guid><dc:creator>rslaten</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/rslaten/comments/5799607.aspx</comments><wfw:commentRss>http://blogs.msdn.com/rslaten/commentrss.aspx?PostID=5799607</wfw:commentRss><wfw:comment>http://blogs.msdn.com/rslaten/rsscomments.aspx?PostID=5799607</wfw:comment><description>&lt;P&gt;The System Center Product Group has started a new &lt;A href="http://blogs.technet.com/systemcenter" mce_href="http://blogs.technet.com/systemcenter"&gt;blog&lt;/A&gt; that will contain some useful high level information about the System Center product line. The first &lt;A href="http://blogs.technet.com/systemcenter/archive/2007/10/24/welcome-to-the-official-system-center-blog-from-brad-anderson.aspx" mce_href="http://blogs.technet.com/systemcenter/archive/2007/10/24/welcome-to-the-official-system-center-blog-from-brad-anderson.aspx"&gt;post&lt;/A&gt; is by Brad Anderson who is "the man" when it comes to the System Center branded products. I expect to see more posts like this from management within the product team so if you're interested I would suggest subscribing to the feed. &lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.technet.com/systemcenter" mce_href="http://blogs.technet.com/systemcenter"&gt;http://blogs.technet.com/systemcenter&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;-Russ&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=5799607" width="1" height="1"&gt;</description></item></channel></rss>