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:
So this requires quite a lot configuration:
# 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
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
The name of this batfile should be “startcheckservices.bat”:
c:\windows\system32\cscript.exe c:\srm\CheckServices.vbs //NoLogo //B
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:
Now the VM is configured to run the scripts as required. Note the following points: