Table of Contents
SRM Script in Recovered VM: Check And Start Automatic Services
Summary: How to check for all WIndows Services after a VMware Site Recovery Manager 5.1 test.
Date: Around 2010
Refactor: 21 April 2025: Checked links and formatting.
Because the script in SRM Script: Start All Windows Services only works in case of a recovery and not in tests, I decided to have the Windows Services checked from within the VM itself. Because the script needs to be run from the VM itself it had to be a script that every Windows version we use would understand and be able to execute. So that means that powershell is out of the question because that is not installed on each server.
Luckily, a collegue created a vbs script (the horror!) which can be executed by both Windows Server 2003 and Windows Server 2008. So, the process to get this script running in SRM recovered VMs is like this:
- Use a powershell script, run from the SRM server, for each VM, to copy a vbs script and a start script to the VM
- Start the vbs script using the option to start a script inside the VM
So this requires quite a lot configuration:
- A powershell script which has to be started for each VM
- A vbs script that has to be copied to the VM
- A start script that has to be copied to the VM
The Scripts
Powershell Script to Copy Other Scripts
# Script Details # Author: Sjoerd Hooft # Creation Date: 2013-04-16 # Note: this is a light script to reduce overhead and execution time for these powershells command. The only thing logged is the errors. # Script functionality # 1. Copy scripts to recovered VM # 3. Email the errors to the SRM administrator # Variables $scriptname = $myinvocation.mycommand.name $scriptlocation = Split-Path $myinvocation.mycommand.path $vcenter = $env:VMware_VC_Host $vm = $env:VMware_VM_Name $vbsscript = "CheckServices.vbs" $cmdscript = "startCheckServices.bat" $MailServer = "10.10.10.25" $toemail = "it@getshifting_com" $fromemail = "vcenter$getshifting_com" $guestdir = "C:\SRM" # Add VMware snapin if(-not (Get-PSSnapin VMware.VimAutomation.Core -ErrorAction SilentlyContinue)){ Add-PSSnapin VMware.VimAutomation.Core} # Email functions Function Send-Email ($subject, $info){ Send-MailMessage -To $toemail -From $fromemail -SmtpServer $mailserver -Subject $subject -Body $info} # Connect to vCenter Connect-VIServer $vcenter # Copy scripts to VM Copy-VMGuestFile -Source $scriptlocation\$vbsscript -Destination $guestdir -Force -VM $vm -LocalToGuest -HostUser root -HostPassword XXXXXXXXXXXX -GuestUser Administrator -GuestPassword XXXXXXXXXXXXXXXXXXXX Copy-VMGuestFile -Source $scriptlocation\$cmdscript -Destination $guestdir -Force -VM $vm -LocalToGuest -HostUser root -HostPassword XXXXXXXXXXXX -GuestUser Administrator -GuestPassword XXXXXXXXXXXXXXXXXXXX # Disconnect from vCenter Disconnect-VIServer * -Confirm:$false # Send last 10 errors to logfile $allerrors = $error[0..9] # 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 = "Result: $scriptname : $VM" $info = "These are the last 10 errors: $allerrors" Send-Email $subject $info
VBS Script to Check And Start Services
The name of the VBS script should be “CheckServices.vbs”:
' Name : Checkservices.vbs ' Description : This script will check if Automatic Services are running, if not it wil start the service. ' After 5 minutes is will run the check again. ' At the end it will make a log file of the action taken place. If the second check gives not started ' automatic services, it will also change the file name to easily sort the problems in a filelist ' Author : Mark Rinket ' Version : 1.00 ' Date : 10-04-2013 'Create output Array Set OutputText = CreateObject("System.Collections.ArrayList") OutputText.add "Services check" OutputText.add "==============" ' Create an Array of services which will not be checked Set ListNonCheck = CreateObject("System.Collections.ArrayList") ListNonCheck.add "TBS" ListNonCheck.add "Ati Hotkey Poller" ListNonCheck.add "NetBackup SAN Client Fibre Transport Service" ListNonCheck.add "BMR Boot Service" ListNonCheck.add "clr_optimization_v4.0.30319_32" ListNonCheck.add "clr_optimization_v4.0.30319_64" ListNonCheck.add "sppsvc" ListNonCheck.add "SysmonLog" ListNonCheck.add "ShellHWDetection" 'Create FileObject Set objFSO=CreateObject("Scripting.FileSystemObject") 'Create log file outFile="c:\srm\log.txt" Set objFile = objFSO.CreateTextFile(outFile,True) 'output to logfile objFile.Write "Start script" & vbCrLf objFile.Write "Waiting 5 minutes" & vbCrLf 'wait 5 minutes '5 minutes is 300000 (5 min * 60 sec * 1000 milliseconds) OutputText.add "Waiting 5 minutes.." wscript.sleep 300000 OutputText.add "" 'set to local computer strComputer = "." 'Make an WMI object Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") OutputText.add "First Check" OutputText.add "===========" 'Retrieve list of services Set objListOfServices = objWMIService.ExecQuery("Select * from Win32_Service") 'Reset counters CountStopped=0 CountRunning=0 'walk trough all services For Each objService in objListOfServices 'Reset Checker Check=True 'service need te be CHECKED For each NonChecked in ListNonCheck if NonChecked = objService.name then check=False next 'if check is needed find out if it is in Automatic mode if Check=True and objService.StartMode = "Auto" then 'Output to logfile objFile.Write "Checking : " & objService.name & " ; " & objService.DisplayName & vbCrLf 'Is it running if objService.State <> "Running" then 'Service is not running; at entry to file OutputText.add "Starting : " & objService.name & " ; " & objService.DisplayName 'Start service errReturn = objService.StartService() OutputText.add "Return Status :" & errReturn OutputText.add "" CountStopped=CountStopped+1 else CountRunning=CountRunning+1 end if end if Next 'If services were restarted wait and check again if CountStopped>0 then 'wait 5 minutes '5 minutes is 300000 (5 min * 60 sec * 1000 milliseconds) OutputText.add "" OutputText.add "Waiting 5 minutes.." wscript.sleep 300000 OutputText.add "" OutputText.add "Second Check" OutputText.add "============" 'Reset counters CountStopped=0 CountRunning=0 'walk through all services Set objListOfServices = objWMIService.ExecQuery("Select * from Win32_Service") For Each objService in objListOfServices 'Reset Checker Check=True 'service need te be CHECKED For each NonChecked in ListNonCheck if NonChecked = objService.name then check=False next 'if check is needed find out if it is in Automatic mode if Check=True and objService.StartMode = "Auto" then 'Is it running if objService.State <> "Running" then 'Service is not running; at entry to file OutputText.add objService.name & " ; " & objService.DisplayName CountStopped=CountStopped+1 else CountRunning=CountRunning+1 end if end if Next end if 'Close Log file objFile.Close 'add info about all Automatic Services OutputText.add "" OutputText.add "TOTAL: Services Running: " & CountRunning & "; Stopped Serives: " & CountStopped 'Get Computername Set objNetwork = CreateObject("Wscript.Network") strComputer = objNetwork.ComputerName 'Check if second run still has not running services. if CountStopped > 0 then 'Create failed text file outFile="c:\srm\Failed-" & strComputer & "-services.txt" Set objFile = objFSO.CreateTextFile(outFile,True) else 'Create normal text file outFile="c:\srm\" & strComputer & "-services.txt" Set objFile = objFSO.CreateTextFile(outFile,True) end if 'Write all outputText entries to the file For each OutputLine in OutputText objFile.Write OutputLine & vbCrLf next 'Close file objFile.Close
Start Script
The name of this batfile should be “startcheckservices.bat”:
c:\windows\system32\cscript.exe c:\srm\CheckServices.vbs //NoLogo //B
Configure Protected VM
With all the script in place the VMs can be configure. In SRM, go to the recovery plan of the VMs and navigate to the VMs tab:
- Select the VM and click “Configure Recovery”
- Select the “Post Power On Steps” and click on Add
- Select “Command on SRM Server”, and configure like this:
- Name: Copy Services Script To VM
- Content: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -File G:\scripts\srmguestservices.ps1
- Timeout: 10 minutes
- Click OK and click on Add again
- Select “Command on Recovered VM”, and configure like this:
- Name: Check Services
- Content: C:\Windows\System32\cmd.exe /C C:\srm\startcheckservices.bat
- Timeout: 2 minutes
- Click OK
Now the VM is configured to run the scripts as required. Note the following points:
- If the VMware Tools timeout the post power on commands will not be executed. You'll have to test what is an acceptable timeout for your VMware Tools
- The check services script will take at least 5 minutes, and will therefor always timeout in the recovery plan. The script will however continue to run, and so will your recovery plan, minimizing the recovery time.