ARM – Visual Studio Deployment With Oct 2015 Azure PowerShell Preview

With the release of the updated Azure PowerShell 1.0 Preview (October 2015), I was curious to see how much of a change would be required for me to continue to use Visual Studio 2015 to provision dev/test environments into my Azure account.  When VS pushes an ARM template, it executes an auto generated PowerShell script named Deploy-AzureResourceGroup.ps1.


Here are the changes I made in order to get the script to execute successfully.

Change 1 – Module Check

The old code checked for the existence of the AzureResourceManager module.  I updated the code to check for the new module named AzureRM

if (-NOT (Get-Module -ListAvailable | Where-Object {($_.Name -eq ‘AzureRM’) })) {
Throw “The version of the Azure PowerShell cmdlets installed on this machine are not compatible with this script.”

Change 2 – Import the module.  Because the script still needs access to the Azure Service Management cmdlets, both the Azure and AzureRM modules need to be imported

Import-Module AzureRM -ErrorAction SilentlyContinue
Import-Module Azure -ErrorAction SilentlyContinue

Change 3 – Get the storage account key.  The old code switches between AzureResourceManager and AzureServiceManagement depending on how the storage account was provisioned.  The switching is no longer needed since now both the ASM and ARM cmdlets can be loaded and accessed at the same time.  The code below will now retrieve the key in either case

    if ($StorageAccountResourceGroupName) {
$StorageAccountKey = (Get-AzureRMStorageAccountKey -ResourceGroupName $StorageAccountResourceGroupName -Name $StorageAccountName).Key1
else {
$StorageAccountKey = (Get-AzureStorageKey -StorageAccountName $StorageAccountName).Primary

Change 4 – Create a connection for ARM.  VS stores connection information for the old cmdlets and for ASM.  For the new AzureRM cmdlets, a new connection needs to be established.  In order to do this, I added in the new Login-AzureRMAccount cmdlet but only call it if there does not already exist a connection to ARM

$AzureRMContext = Get-AzureRMContext
} catch {

Note – If you connect to more than one subscription or need to authenticate with more than one set of credentials, this cmdlet will have to be wrapped in additional logic

Change 5 – Deploy the resources.  In the prior version of the code, the deployment is done directly through the New-AzureResourceGroup cmdlet.  This cmdlet would update an existing resource group and force the replacement of resources, or deploy the RG from scratch if it did not exist.  In the new version, we need to use the Get-AzureRMResourceGroup cmdlet to see if the RG is already there.  If not, create it.  Then, we need to use the New-AzureRMResourceGroupDeployment cmdlet to actually land the resources in the RG

$ResourceGroup = Get-AzureRMResourceGroup | where{$_.ResourceGroupName -eq $ResourceGroupName}
if($ResourceGroup -eq $null) {
Write-Host “Provisioning Resource Group: $ResourceGroupName in Location: $ResourceGroupLocation”
New-AzureRMResourceGroup -Name $ResourceGroupName -Location $ResourceGroupLocation
} else {
Write-Host “Resource Group: $ResourceGroupName Exists”

New-AzureRMResourceGroupDeployment -Name $ResourceGroupName `
-ResourceGroupName $ResourceGroupName `
-TemplateFile $TemplateFile `
-TemplateParameterFile $TemplateParametersFile `
@OptionalParameters `
-Force -Verbose

That’s the gist of the changes.  The only difference in the actual deployment through VS is that I now get prompted for the AzureRM credentials in order to connect if a connection does not already exist.


Happy cloud deploying!

Example Script

ARM, Azure, Infrastructure as Code

SCOM 2012 R2 – Create Task Pane Dashboard Manually

A recent customer requirement was to add additional dashboards to the Navigation pane in the SCOM console.  There is this tool to assist with the creation on the MOM Team blog, however, it was not working in this particular case.  Rather than spending a ton of time attempting to troubleshoot, I took a more manual approach which ultimately yields similar results.

Tested version – SCOM 2012 R2 UR7


Step 1 – Create a new management pack to contain your dashboard


Step 2 – Under the Monitoring pane, locate the folder for your MP and create a new dashboard


Step 3 – Choose a layout.  In this case, I am just going to create Grid Layout dashboard with a single cell in order to look at CPU utilization on a chosen Windows Computer

A.  Choose Grid Layout


B.  Give it a name


C.  Choose a single cell for simple demo purposes


D.  Create

Step 4 – Export the management pack.  It is easier to move the dashboard under the Navigation pane and add the widgets after the fact


Step 5 – Open the XML in your favorite editor.  There are a few pieces we need to tweak.

A. Add a reference to the Windows Library


B. Modify the <ComponentType> to include a Target


Note: the reference is correct.  You do not use the typical alias when dealing with the mpinstance notation.

C. Modify the Parent for the <ComponentReference> to point at the Navigation pane rather than the default folder that was created within the MP


D. Modify the <ComponentImplementation> to point at the same Target as the <ComponentType>


E. Save your management pack.  Optional – increment the version number

Step 6 – Import your new management pack


Step 7 – Locate your dashboard.  If it still shows under the default folder in the monitoring pane, close and reopen your console.


Step 8 – Open your dashboard and click “Click to add widget…”

A. Select Performance Widget


B. Give it a name


C. Find an object of the specific type you are targeting.  It is key that select a specific item, not a group or an object of a different class.  In this case, Windows Computer


D. Select the desired performance counter and add


E. Choose a Time range


F. Choose whether or not to show the legend and then the desired fields if you choose to show


G. Create

Note – at this point you probably notice that the dashboard doesn’t work.  This is expected behavior as the code for the widget is not correct since it was authored through the console but not for specific use in the Navigation pane

Step 9 – Export your management pack

Step 10 – Open the XML in your favorite editor

Step 11 – Find the <ComponentImplementation> for the widget and modify the <Base /> tag


Step 12 – Locate the <Bindings> section under the <ComponentOverride> for the Widget


Step 13 – Highlight and cut all of the <Binding> tags


Step 14 – Paste the <Binding> section between the <Base> tags within the <ComponentImplementation> for the widget


Step 15 – Under the PerformanceObjectCounters binding, locate the ManagedEntityIds binding


Step 16 – Modify binding to accept the id of the targeted object in the console rather than a specific instance


Step 17 – Delete the rest of the <ComponentOverride> code for the widget


Step 18 – Locate the <DisplayString> for the widget component override and delete that as well


Step 19 – Save and import your management pack.  Post import, close and reopen your console

Step 20 – Test your dashboard.  Enjoy




Management Packs, MP Authoring, SC Operations Manager

MS OMS – Performance Data Collection Now Live

Microsoft Operations Management Suite (OMS) is now able to collect performance data at a rate of up to every 10 seconds.


Configuration is super simple.


Simply add or remove the counters you wish to have collected and the data will start pouring in for review.  The only challenge I see here is how to collect SQL related data since the SQL instance name comprises part of he object name.  In order to test how this is going to be handled, I added the following counters just taking a guess (and hoping something was done to simplify the process) as to how OMS might handle this situation:


I found a bunch of these events for MSSQL and MSSQL$ in the event log shortly after attaching the SQL machine to OMS:


A few minutes afterwards, I found the performance data with the object name MSSQL$OMDB inside Search within the OMS Portal:


This means the SQL data will have to be treated a little bit differently from a collection perspective, but it is manageable.  Next steps would be to explore if there is a way to programmatically interface with OMS in order to configure these counters.  For now, most performance counters are very easily configured and collected for analysis in OMS!


SCOM 2012 R2 – PowerShell Based Console Task

From time to time, it is nice to take advantage of the agent and console tasks exposed in the SCOM console to more easily accomplish some sort of remediation or to retrieve some information.  I have authored agent tasks before, and they are pretty straight forward.  I do not believe I have ever authored a console task, however, when I received the request from one of my peers, I figured it would be a snap.  The ask was to be able to execute a PowerShell script against the SDK straight out of the console and display the results back to the user.  It ends up this is not too bad, but you do have to do some digging in order to see how these tasks are actually constructed.

Step one for me is to always try and find an example that I can reference.  A quick Bing search did not turn up much, so I exported all of the MPs from my SCOM environment via PS and then scanned them for console tasks.  I found an interesting one in the Microsoft.Windows.Server.Library management pack.

<ConsoleTask ID=”Microsoft.Windows.Server.Computer.OpenPowerShell” Accessibility=”Public” Enabled=”true” Target=”Windows!Microsoft.Windows.Server.Computer” RequireOutput=”false”>
<Argument Name=”WorkingDirectory” />
<Argument Name=”Application”>powershell.exe </Argument>
<Argument> -noexit -command “Enter-PSSession -computer $Target/Property[Type=”Windows!Microsoft.Windows.Computer”]/PrincipalName$”</Argument>

A straight forward task that simply opens PowerShell and creates a remote session on the targeted Windows Server Computer.  This is essentially what I want to do, except I want to execute code against the SDK and display results rather than simply opening a remote session.


This is great.  I did notice the <Assembly> line (highlighted in yellow above) that seems to basically define the type of task you are trying to execute.  Searching the code further for this particular assembly, I find a resource at the very bottom of the management pack:


<Assembly ID=”Res.Microsoft.Windows.Server.Computer.OpenPowerShell” Accessibility=”Public” FileName=”Microsoft.Windows.Server.Computer.OpenPowerShell” HasNullStream=”true” QualifiedName=”Microsoft.Windows.Server.Computer.OpenPowerShell” />

I scoured my workstation, my MS servers, and the installation media for this file and I was not able to find it.  I really want to track this down since this will potentially expose other types of console task types.  My best guess is that this code has been relocated into some other DLL but I do not know for sure.  If I find the code, I will post an update.

With that, I felt I had most of the necessary pieces in order to get an example running.  For this example, I just wanted to do something simple like list all of the properties for a selected Windows Computer.  Here is the script to do the work:

$key = ‘HKCU:Software\Microsoft\Microsoft Operations Manager\3.0\User Settings’
$SDK = (Get-ItemProperty -Path $key -Name SDKServiceMachine).SdkServiceMachine

Import-Module OperationsManager
New-SCOMManagementGroupConnection $SDK

## Get Windows Computer class
$computerClass = Get-SCOMClass -Name “Microsoft.Windows.Computer”

## Get SCOM object
$computer = Get-SCOMClassInstance -Class $computerClass | Where-Object {($_.FullName -eq $computerFQDN) -or ($_.Name -eq $computerFQDN)}
$computer | fl *

This code connects to the SDK using whatever SDK service the machine upon which the script is being executed last connected.  If multiple consoles are open and connected to multiple management groups, this approach will only work for Computer objects in the last console opened.  However, this is fine for demo purposes and my lab since I only have a single environment.

Since the OpenPowershell module opens PowerShell and executes a scriptblock, I need to wrap the code above in a scriptblock and pass in the $computerFQDN value using a $Target variable:

<Argument Name=”WorkingDirectory” />
<Argument Name=”Application”>powershell.exe </Argument>
<Argument><![CDATA[ -noexit -command “& {Param([String]$computerFQDN)

}” ]]></Argument>

Dropping this into a <ConsoleTask> and adding the exact code chunk to add the Assembly from the bottom of the Microsoft.Windows.Server.Library management pack yields the following:


When I click on my “Console Task – Get Computer Info” task, it launches the script which returns the following:


There are all of the properties for the selected Windows Computer.  Results!

Management Packs, MP Authoring, PowerShell, SC Operations Manager

Datazen – Dashboard Initial Configuration

Now that we have the product installed, the next step is to determine what data needs to be displayed.  Since I am going to be consuming SCOM data, I am going to create a simple dashboard that contains information that is pertinent to the health of the SCOM environment itself.  In order to accomplish this, the next steps are to grant access to the appropriate users, create a hub, create a data source and then use that data source to create views into the data.  It sounds like a lot, but it is really not bad at all.

For my DZ install, I created a new user named DZAuthor.  This is the account I am going to use to do the bulk of the authoring work.  I already had a SCOMUser account in my lab, so I am going to grant that user access to the dashboard I am creating in order to simulate my end user experience.


The DZ install has a couple of URLs you need to access.

http://<servername> and http://<servername>/cp.  The first is the end user page (where the dashboards and KPIs will be displayed) and the second one is the control panel (cp for short).  The control panel is where we need to go to get started.  I open the CP URL and then enter the admin account and password (specified during install) in order to get logged in the first time.

Once I get logged in, the first step is to grant access to my DZAuthor account.  This is the account that I am going to use for creating the dashboards and all of the supporting components.  On the home tab in the CP portal I hit create user.  As you can see here, there is also a batch import process here that allows you to create users in bulk as well.


After I hit Create User, I fill in the details for the DZAuthor account.  Since I specified Active Directory settings during the install, the necessary information is pretty minimal.


Now that I have created my authoring user, I now need to create a hub.  A hub is basically a container for dashboards.  Users are assigned permissions at the hub level.  Once I have my dashboard created, I should be able to grant access to the hub SCOMUser account and that user should be able to then view the contents of the hub.


I hit Create BI Hub and then create a hub named SCOM Health Hub.  This is where the dashboards pertaining to the health of the SCOM infrastructure itself are going to be stored.


I give it a max of 10 users.  For lab, this should be fine.  For prod, you would need to make sure and check scaling for the IIS servers you have hosting these sites.  Once the hub is created, I logoff the Admin account and login with my DZAuthor account.

Once I am logged back in as DZAuthor, I need to make sure the SCOM Health Hub is selected in my navigation pane.  Since this is the first and only hub in the environment, this is the case:


The next step is to create a User Group for this hub.  I hit User Groups in the navigation pane and then hit the “Create New User Group” button at the top


and then:


I create a new group for the SCOM Health Hub


By default, DZAuthor is automatically dropped into this group since DZAuthor is the hub owner.  We will come back later and add in the SCOMUser account in order to grant permissions to the published dashboards.

Speaking of dashboards (the reason we are here), the next step is to create a group for the dashboards.


I navigate to Dashboards and then hit “Create a New Group” at the top.


I’m going to create a group for the core infrastructure.  Later on, I will circle back and create a group that specifically pertains to agent health.  In step 2, I select “Allow Access” for the recently created hub user group:


That’s more or less the framework.  Now comes the work that pertains directly to what we want to display on the screen.  In order to get at any data, we need to create a Data Source.  I navigate to Data Sources:


and then hit “New Folder” at the top:


I give it a generic name for holding all of my SCOM information.  I click on the folder that gets created in order to drop in a level, and then I hit “New Data Connection” button at the top:


At this time, there are 13 different types of data providers available.  These range all the way from Azure SQL Databases to Excel spreadsheets.  For connecting to SCOM, we’re going to be querying the SQL databases.  For what I want to accomplish, I am going to be querying the OperationsManager database directly and going around the SDK.  Is this supported?  Nope.  Do I care?  Nope.  Should you care?  Great question.  The database layout for the bulk of the data we would want to dashboard from the OpsDB hasn’t really changed that much (or at all) from the first days of SCOM 2007 through the most recent UR for SCOM 2012 R2.  Is this supported?  Nope.  Does it work?  Yep.

The next step is to grant access to the data source:


At this point, the screen should look something like this:


Now, we click into OperationsManager in order to start mining some data.  Once inside, we hit “New Data View” button:


Since we are under the OperationsManager data source we created, these views are all going to be query based and will be driven off the OperationsManager database.  Now, we need to figure out how to get at the data we need.  A great place to always start is Kevin Holman’s “Useful Operations Manager 2007 SQL queries” blog post when querying either the OperationsManager of OperationsManagerDW databases.  Another option is to actually find the data you want in the SCOM console and use SQL Profiler to see what query SCOM is executing in order to retrieve the data for the SDK.

View #1:

Number of Alerts per day

SELECT Convert(DateTime,CONVERT(VARCHAR(20), TimeAdded, 102)) AS DayAdded, COUNT(*) AS NumAlertsPerDay
WHERE TimeRaised is not NULL
Having Convert(DateTime,CONVERT(VARCHAR(20), TimeAdded, 102)) > DATEADD(d,-7,GetUTCDate())

I stole this one from Kevin’s blog and then tweaked it a bit for the dashboard.  First, note the datetime column returned from the query needs to contain an actual datatime value from SQL or Datazen will not treat it as a datetime.  I got stuck here for a bit since the data looks good.  In Kevin’s query, the datetime had actually been converted to a varchar so DZ was just treating that column as a normal string. In order to deal with this and keep it simple, I just wrapped the varchar field with an additional Convert() function and set it back to a datetime.

Additionally, I removed the row with the total and only returned the previous 7 days.  I am happy with the results from the query in SQL Management Studio, so I move back to the Control Panel and fill in the rest of the data for the Alerts/Day view:


Notice I set the Refresh Frequency to every 30 minutes.  You may want to set this more or less frequent depending on your environment and business needs.  There are a couple of other interesting things on this screen such as parameterizing filters and personalizing the query by adding in the username to the query.  I don’t need these for this dashboard, but they are options to explore later.

I repeat the steps 3 more times:

View #2 – Events Per Day

SELECT Convert(DateTime,CONVERT(VARCHAR(20), TimeAdded, 102)) AS DayAdded,
COUNT(*) AS EventsPerDay
FROM EventAllView
Having Convert(DateTime,CONVERT(VARCHAR(20), TimeAdded, 102)) > DATEADD(d,-7,GetUTCDate())

View #3 – Performance Samples Per Day

SELECT Convert(DateTime,CONVERT(VARCHAR(20), TimeSampled, 102)) AS DaySampled, COUNT(*) AS PerfInsertPerDay
FROM PerformanceDataAllView with (NOLOCK)
Having Convert(DateTime,CONVERT(VARCHAR(20), TimeSampled, 102)) > DATEADD(d,-7,GetUTCDate())

View #4 – State Changes Per Day

SELECT Convert(DateTime,CONVERT(VARCHAR(20), TimeGenerated, 102)) AS DayGenerated, COUNT(*) AS StateChangesPerDay
FROM StateChangeEvent WITH (NOLOCK)
Having Convert(DateTime,CONVERT(VARCHAR(20), TimeGenerated, 102)) > DATEADD(d,-7,GetUTCDate())
ORDER BY DayGenerated DESC

After following the same logic for each of the views, my Control Panel now shows the 4 views I created:


At this point, I am ready to create an actual dashboard and publish it!

The next post will focus on utilizing these views in a simple dashboard using the Datazen Publisher app available from the Windows Store.

Presentation, SC Operations Manager