Script to stop or start IIS and Biztalk services on local computer
Must be run with elevated rigths to stop services
# ------------------------------------------------------------------
# ------------------------------------------------------------------
# Author: Peter Lykkegaard
# Created 9 sep 2017
# Filename: SwitchHostsInstanceState.ps1
#
# Changelog
# ------------------------------------------------------------------
# Author Date Changes
# Peter Lykkegaard 14 sep 2017 Added stop/start/status of IIS
#
# References
# http://ittybizzy.blogspot.dk/2013/10/powershell-scripts-to-stopstart-biztalk.html
# https://social.technet.microsoft.com/wiki/contents/articles/32946.biztalk-server-health-check-powershell-script.aspx
#
# ------------------------------------------------------------------
param(
[parameter(ValueFromPipeline)]
[ValidateNotNullOrEmpty()]
[string]$handle
)
# Main routine
function Switch-HostInstanceState
{
Clear-Host
if (Test-Arguments)
{
switch ($handle)
{
{$_ -in "Stop", "Start", "Status"}
{
# Disable or Enable all host instances
# If already disabled receive* hosts will not be enabled
Invoke-ServiceState $handle
if ($handle -ne 'Status')
{
# Write current status
Invoke-ServiceState "Status"
}
break
}
default {
Show-HelpArguments
break
}
}
}
}
function Test-Arguments
{
Write-Host "`n**********************************************************"
Write-Host ("Handle = '{0}'" -f $handle)
if (
$handle.length -eq 0
)
{
Write-Host "`nOne or more arguments are missing`n"
Show-HelpArguments
return $False
}
else
{
return $True
}
}
function Show-HelpArguments
{
Write-Host "**********************************************************"
Write-Host "Use the SwitchHostsInstanceState.ps1 to `n"
Write-Host " Needed parameters:"
Write-Host " 0 : -Handle`tStop|Start|Status"
Write-Host "`n"
Write-Host "Usages: SwitchHostsInstanceState.ps1 -Handle [Switch]"
Write-Host "Sample: SwitchHostsInstanceState.ps1 -Handle ""Start"""
Write-Host "`n**********************************************************`n`n"
}
Function Invoke-ServiceState([string] $handle)
{
# Get all In-process BizTalk hostinstances (HostType=1)
$inProcessHosts = "HostType=1" # Exclude IsolatedHosts which does have a corresponding service
$nsBTS = "root/MicrosoftBizTalkServer" # Biztalk Namesspace in WMI
$receiving = "Receiving*" # All Receiving Hostinstances
$filter = "($inProcessHosts)" # Filter for WMI lookup
$hostInstances = Get-WmiObject MSBTS_HostInstance -Namespace $nsBTS -Filter $filter
$instances = $hostInstances
switch ($handle)
{
"Stop"
{
# Disable or Enable all host instances
# If already disabled receive* hosts will not be enabled
# Gracefully stop IIS services
$iis = Get-WmiObject Win32_Service -Filter "Name = 'W3SVC'"
if ($iis.State -eq 'Running')
{
Write-Host "Stopping IIS Services /noforce..."
& {iisreset /stop /noforce}
}
# Handle all selected host instances
Write-Host "`nDisable and Stop BizTalk Host Instances "
Write-Host "**********************************************************"
break
}
"Start"
{
Write-Host "`nEnable and Start BizTalk Host Instances "
Write-Host "**********************************************************"
# Check for disabled hosts other than receiving, if any found loop through the collection
$instances = $hostInstances | Where-Object {$_.hostname -notlike $receiving -and $_.IsDisabled -eq $True}
if (!$instances)
{
$instances = $hostInstances
}
break
}
"Status"
{
# Handle all selected host instances
Write-Host "`nStatus of IIS "
Write-Host "**********************************************************"
$iis = Get-WmiObject Win32_Service -Filter "Name = 'W3SVC'"
Write-Host ("Web server - {0}" -f $iis.State)
Write-Host "`nStatus of BizTalk Host Instances "
Write-Host "**********************************************************"
break
}
default {
# Handle undefined or wrong value
Show-HelpArguments
break
}
}
foreach ($hostInstance in $instances)
{
switch ($handle)
{
"Stop" { # Disable all but stop only receiving hostinstances
if (!$hostInstance.IsDisabled)
{
$hostInstance.IsDisabled = $true
$hostInstance.Put() > $null
Write-Host $hostInstance.hostname 'is disabled'
}
if ($hostInstance.hostname -like $receiving)
{
# if service is running
if ($hostInstance.servicestate -eq 4)
{
Write-Host ('Stopping service: {0} ...' -f $hostInstance.hostname)
try {
$windowsService = ('BTSSvc${0}' -f $hostInstance.HostName)
Get-Service -Name $windowsService | Stop-Service
#Stop-Service -DisplayName $windowsService
}
catch {
Write-Host ('Error stopping host {0}, please check eventlog for details' -f $hostInstance.hostname), -ForegroundColor "red"
}
if ($hostInstance.servicestate -ne 4)
{
Write-Host ('{0} is stopped' -f $hostInstance.hostname)
}
}
}
break
}
"Start" { # Ensable all but do not start receiving hostinstances
if ($hostInstance.IsDisabled)
{
$hostInstance.IsDisabled = $False
$hostInstance.Put() > $null
Write-Host $hostInstance.hostname 'is reenabled'
}
if ($hostInstance.hostname -notlike $receiving)
{
# if service is not running try to start it
if ($hostInstance.servicestate -ne 4)
{
Write-Host ('Starting service: {0} ...' -f $hostInstance.hostname)
try {
$windowsService = ('BTSSvc${0}' -f $hostInstance.HostName)
Get-Service -Name $windowsService | Start-Service
#Start-Service -DisplayName $hostInstance.HostName
}
catch {
Write-Host ('Error starting host {0}, please check eventlog for details' -f $hostInstance.hostname), -ForegroundColor "red"
}
# Notify is started
if ($hostInstance.servicestate -eq 4)
{
Write-Host ('{0} is started' -f $hostInstance.hostname)
}
}
}
break
}
"Status" { # Status for BizTalk Services
switch ($hostInstance.servicestate) {
1 { $hostInstanceState = "Stopped" }
2 { $hostInstanceState = "Start pending" }
3 { $hostInstanceState = "Stop pending" }
4 { $hostInstanceState = "Running" }
5 { $hostInstanceState = "Continue pending" }
6 { $hostInstanceState = "Pause pending" }
7 { $hostInstanceState = "Paused" }
8 { $hostInstanceState = "Unknown" }
}
Write-Host $hostInstance.hostname '-' $hostInstanceState
break
}
}
}
if ($handle -eq 'Start')
{
$iis = Get-WmiObject Win32_Service -Filter "Name = 'W3SVC'"
if ($iis.State -ne 'Running')
{
# Start IIS services
Write-Host "`nAttempting to start IIS Services ..."
& {iisreset /start }
}
}
}
# Entry point
Switch-HostInstanceState