There's a module for that!
Import-Module MSMQ
See the page on MSDN.
Sunday, July 24, 2016
Creating an MSMQ queue administratively through the Windows Control Panel
To create a message queue
- In the Control Panel, double-click Administrative Tools, and then double-click Computer Management.
- Expand Services and Applications, and then expand Message Queuing. ...
- Right-click Private Queues, and then click New.
- Enter a name for the private queue, and then click OK.
See the link here on MSDN.
Enabling MSMQ in Windows via PowerShell
First, let's start off by seeing which Windows features for MSMQ are available in your installation:
If you see a message like "Failed to load program with incorrect format", double check that you're running a 64-bit version of PowerShell if your machine is running a 64-bit version of Windows.
Then, let's enable the ones we actually need:
if ($packagesRequiringRestart.Count -gt 0)
{
Restart-Computer
}
This script takes the packages with MSMQ in the name, enables them along with any requisite parent features and prevents restart during installation. Once complete, we check the results to see if any installations require a restart. If there are any that require a restart, we restart the computer. As with anything else in PowerShell, and IT in general, use judgement and critical thinking.
IMPORTANT: The Get-WindowsOptionalFeature cmdlet and associated module are part of the DISM module. This module is available built-in with Windows Server 2012 and up. In Windows 7 / Windows Server 2008, it's available as part of the Windows Assessment and Deployment Kit available here. Even though the page says the installer is for Windows 8.1, it works on Windows 7 / Server 2008
Get-WindowsOptionalFeature -Online | ? { $_.FeatureName -like '*msmq*' }
If you see a message like "Failed to load program with incorrect format", double check that you're running a 64-bit version of PowerShell if your machine is running a 64-bit version of Windows.
Then, let's enable the ones we actually need:
$packageResults = @(Get-WindowsOptionalFeature -Online | ? { $_.FeatureName -like '*msmq*' -and $_.State -ne 'Enabled' } | Enable-WindowsOptionalFeature -Online -All -NoRestart)
$packagesRequiringRestart = @($packageResults | ? { $_.RestartNeeded })if ($packagesRequiringRestart.Count -gt 0)
{
Restart-Computer
}
This script takes the packages with MSMQ in the name, enables them along with any requisite parent features and prevents restart during installation. Once complete, we check the results to see if any installations require a restart. If there are any that require a restart, we restart the computer. As with anything else in PowerShell, and IT in general, use judgement and critical thinking.
IMPORTANT: The Get-WindowsOptionalFeature cmdlet and associated module are part of the DISM module. This module is available built-in with Windows Server 2012 and up. In Windows 7 / Windows Server 2008, it's available as part of the Windows Assessment and Deployment Kit available here. Even though the page says the installer is for Windows 8.1, it works on Windows 7 / Server 2008
Thursday, July 14, 2016
Configuration a web application for Application Warmup in IIS
Further to one of my previous blog posts about how to configure an ASP.NET web application for Application Initialization (warmup), here's the follow up: a powershell script for configuring the corresponding IIS application for warmup:
<#
.SYNOPSIS
Sets the required settings in the applicationHost.config file for an application to be able to automatically
initialize.
.PARAMETER WebSitePath
The name of the web application that's to have it's settings configured for application warmup.
.PARAMETER RestartService
A switch to indicate that the W3SVC (IIS) service should be restarted after the change.
#>
function Set-WebApplicationInitialization
{
[CmdletBinding(SupportsShouldProcess = $true)]
Param(
[Parameter(Mandatory = $true)][ValidateNotNullOrEmpty()][string] $WebSitePath,
[Parameter(Mandatory = $false)][switch] $RestartService
)
$pathElements = $WebSitePath.Split('/')
$site = $pathElements[0]
$appSubPath = @($pathElements | select -Skip 1) -join '/'
$webApp = Get-WebApplication -Site $site -Name $appSubPath
if ($webApp -eq $null)
{
throw "Failed to find application '$appSubPath' under web site '$site'"
}
if ($PSCmdlet.ShouldProcess($WebSitePath, "Update application to use Application Initialization settings"))
{
$appPoolPath = "IIS:\AppPools\$($webApp.applicationPool)"
Set-ItemProperty -Path $appPoolPath -Name 'autoStart' -Value 'true'
Set-ItemProperty -Path $appPoolPath -Name 'startMode' -Value 'AlwaysRunning'
Set-ItemProperty -Path $appPoolPath -Name 'processModel.idleTimeout' -Value '00:00:00'
$applicationPath = "IIS:\Sites\$($WebSitePath)"
Set-ItemProperty -Path $applicationPath -Name 'preloadEnabled' -Value $true
Write-Verbose "Updated properties for web application '$appSubPath' running on pool '$($webApp.applicationPool)'"
if ($RestartService.ToBool())
{
if ($PSCmdlet.ShouldProcess("W3SVC", "Restart web service"))
{
Restart-Service W3SVC
}
}
}
}