= SRM Script: Start All Windows Services =
**Summary**: How to create a script to check if all services came up correctly after a failover with VMware Site Recovery Manager 5.1. \\
**Date**: 8 April 2013 \\
**Refactor**: 29 April 2025: Checked links and formatting. \\
{{tag>vmware srm powershell windows}}
This script tests if all automatic Windows Services have been started as they should have. Note that this script does not work for a test environment. The SRM server executing this script lives in production network (of course) so it will only connect to production machines. In a recovery the recovered VMs are production, so in that case it will not be a problem. For checking up on Windows services in a test, please check [[srmguestscript]].
= The Script =
# Script Details
# Author: Sjoerd Hooft
# Creation Date: 2013-04-08
# Script functionality
# 1. If this is a recovery plan run as test, exit. This script only works for a real recovery.
# 2. Get all Windows VMs that are started for a SRM Test / Recovery
# 3. Check automatic services on these VMs
# 4. Restart services if required
# 5. Email the log to the SRM administrator
# Note: This scrip can be run each time a RDM or a host is added.
# Script variables
$timestamp = Get-Date -format "yyyyMMdd-HH.mm"
$startdir = "G:\scripts"
$logfile = "$startdir\SRM-winservices-$timestamp.txt"
# Start Logging
# Note that you can suppress output from commands using | Out-Null
Function Add-LogEntry
{
param
(
[String]$data = ""
)
# Sent to output so it shows up in the recovery plan results.
$data
# Log to file with timestamped data
"{0} {1}" -f (Get-Date -format "yyyyMMdd-HH.mm"), $data | Out-File $logFile -Append
}
# Add VMware snapin
if(-not (Get-PSSnapin VMware.VimAutomation.Core)){
Add-PSSnapin VMware.VimAutomation.Core}
# Determine Site Recovery Manager Mode
$recoverymode = $env:VMware_RecoveryMode
# Determine other SRM information
$recoveryplan = $env:VMware_RecoveryName
Add-LogEntry "$recoveryplan is run in $recoverymode mode"
# Setting email functionality
# Set this variable to $false if you don't want to receive emails regarding this script
$SendEmail = $true
# Set the SMTP Server address
$MailServer = "10.10.10.25"
# Set the email addresses
$toemail = "it@getshifting_com"
$fromemail = "srm@getshifting_com"
# Email functions
Function Send-Email ($subject, $info){if ($SendEmail){Send-MailMessage -To $toemail -From $fromemail -SmtpServer $mailserver -Subject $subject -Body $info -Attachments "$logfile"}}
# This script is not for test mode. In Test mode this script will query the live production VMs.
if ($recoverymode -eq "test")
{
Add-LogEntry "This script is designed to run only when doing a recovery of VMs and will not run in a DR Test."
Add-LogEntry "This script will exit now"
exit 1
}
# VMware Settings
$cluster = "DR Cluster"
$vcenter = $env:VMware_VC_Host
# Connect to vCenter
Connect-VIServer $vcenter
# Get all Production VMs that are Powered On
$vms = Get-Cluster "$cluster" | Get-VM | where {$_.Name -like "???prd*" -and $_.Powerstate -eq "PoweredOn"}
Add-LogEntry "Found VMs: $vms"
# Check and Restart Automatic Services
ForEach ($vm in $vms){
$vmview = Get-VM $VM | Get-View
$vmhostname = $vmview.Guest.HostName
Add-LogEntry "Checking services for $vmhostname"
$svcs = Get-wmiobject win32_service -Filter "startmode = 'auto' AND state != 'running' AND name != 'Ati Hotkey Poller' AND name != 'NetBackup SAN Client Fibre Transport Service' AND name != 'BMR Boot Service' AND name != 'clr_optimization_v4.0.30319_32' AND name != 'clr_optimization_v4.0.30319_64' AND name != 'sppsvc' AND name != 'SysmonLog'" -ComputerName $vmhostname
foreach ($service in $svcs){
Add-Logentry "Starting the $service.DisplayName service on $vmhostname"
$service.StartService()
}
}
# Disconnect from vCenter
Disconnect-VIServer * -Confirm:$false
# Preparing info for email
# It would be preferred to list the recovery plan name in the subject and the VMs in the body. This is yet not possible with powershell/powerCLI.
$subject = "$timestamp $recoveryplan $recoverymode Result"
$info = "Results final recovery script"
Send-Email $subject $info
//This wiki has been made possible by://