There are lots of ways to adjust reg keys in bulk. SCCM, Group Policy, Remote PowerShell to name a few.
Occasionally I find that SCOM customers like to have the ability to modify a registry setting via a Task in the SCOM console. This gives them the ability to modify the regkey for a single server, a group of servers, all servers, whatever they want in a matter of seconds without having to rely on outside tools.
Recently I have had a few customers need to adjust the MaxQueueSize reg key for their agents:
This is actually a fairly good simple MP Authoring exercise so I will quick walkthrough the process.
The end design in Visual Studio will look like this:
Easy enough, two Tasks, and two Scripts, standard out-of-box references – which then generate two tasks in the console:
Usually for something like this I like to start with the PowerShell before I break open Visual Studio. It is easier for me to get the script working in the PowerShell ISE and then start a new MP once I know I have the PowerShell working.
For the most part the PowerShell is pretty straight forward. The only complication I ran into in testing was that since some of my customer’s agents are multi-homed and some aren’t I needed a way to handle either scenario without erroring out. Handling multiple management groups adds three lines of code to my original script, but still not too bad:
$GetParentKey = Get-Item -Path ‘HKLM:\SYSTEM\CurrentControlSet\services\HealthService\Parameters\Management Groups’
$MGName = $GetParentKey.getsubkeynames()
Foreach ($Name in $MGName)
{
Set-ItemProperty -Path “HKLM:\SYSTEM\CurrentControlSet\services\HealthService\Parameters\Management Groups\$Name” -Name ‘maximumQueueSizeKb’ -Value 76800 -Force
}
To make things as simple as possible in this example I am using hardcoded QueueSize Values. One Task to increase the queue size to 75 MB, and one to set it back to the default of 15 MB.
$GetParentKey = Get-Item -Path ‘HKLM:\SYSTEM\CurrentControlSet\services\HealthService\Parameters\Management Groups’
$MGName = $GetParentKey.getsubkeynames()
Foreach($Name in $MGName){
Set-ItemProperty-Path “HKLM:\SYSTEM\CurrentControlSet\services\HealthService\Parameters\Management Groups\$Name” -Name ‘maximumQueueSizeKb’ -Value 15360 -Force
}
Now that we have the scripts we can open up our copy of Visual Studio with the Visual Studio Authoring Extensions:
File – New Project
Management Pack – Operations Manager 2012 R2
We are going to create two folders. These aren’t required, I just like adding a little bit of organization rather than dealing with one large .mpx file. Ultimately how you divide things up is somewhat arbitrary and more a matter of personal preference rather than any specifc rules.
To create a folder. Right-click MaxQueueSize – Add – New Folder
Do this two times. We will create one folder called Scripts and one called Tasks:
Now we need to populate our Scripts folders with the two PowerShell scripts we wrote in the ISE earlier.
Right-Click the Scripts folder – Add – New Item
PowerShell script file – Name file – Add
Now you can paste in the code we wrote in the PowerShell ISE
This takes care of the Increase Max Queue Size PowerShell. Now repeat the steps above for the reset max queue size script:
Now we need to populate our Tasks folder
Right-Click Tasks Folder – Add – New Item
Empty Management Pack Fragment – IncreaseMaxQueueSize.mpx – Add
The code for a task that kicks off a PowerShell script is pretty easy:
<ManagementPackFragment><SchemaVersion>=”2.0” xmlns:xsd=”http://www.w3.org/2001/XMLSchema“>
<Monitoring>
<Tasks>
<Task ID=”Sample.RegKey.IncreaseMaxQueueSize.AgentTask” Accessibility=”Internal” Target=”SC!Microsoft.SystemCenter.ManagedComputer” Enabled=”true” Timeout=”300” Remotable=”true“>
<Category>Custom</Category>
<ProbeAction ID=”Probe” TypeID=”Windows!Microsoft.Windows.PowerShellProbe“>
<ScriptName>IncreaseMaxQueueSize.ps1</ScriptName>
<ScriptBody>$IncludeFileContent/Scripts/IncreaseMaxQueueSize.ps1$ </ScriptBody>
<SnapIns />
<Parameters />
<TimeoutSeconds>300</TimeoutSeconds>
<StrictErrorHandling>true</StrictErrorHandling>
</ProbeAction>
</Task>
</Tasks>
</Monitoring>
<LanguagePacks>
<LanguagePack ID=”ENU” IsDefault=”true“>
<DisplayStrings>
<DisplayString ElementID=”Sample.RegKey.IncreaseMaxQueueSize.AgentTask“>
<Name>Max Queue Size Increase</Name>
<Description>Increase Max Queue Size Regkey to 75 MB</Description>
</DisplayString>
</DisplayStrings>
</LanguagePack>
</LanguagePacks>
</ManagementPackFragment>
You do this for both tasks and associate each with the appropriate PowerShell file.
So Visual Studio will look like this:
And once you build and import the pack you will have two tasks that will show up as options when you are in the Windows Computer State view:
If anyone wants these instructions in video form, just post a comment below and I will record a step-by-step video walkthrough.
If the source files or finished MP are helpful again don’t hesitate to ask. Just post a comment and I will zip up the files and upload to TechNet or GitHub.