Summary

The Service Control Task in adTempus allows you to start or stop a service running on the same computer as adTempus, but does not allow you to control a service on a remote computer.

Using a script it is possible to control a service on a remote computer.

Note

Beginning with version 4, the Script Control Task supports control of remote services.

Procedure

You will first create a Script Library that contains supporting code.You will then create jobs that runs the script code.

Create the Script Library

1. In the adTempus Console, expand the Scripts folder, then right-click Script Libraries and choose New Script Library....

2. In the Script Library Properties window:

a. Name the library "ServiceControl"

b. Select "VB.NET" for the Language

c. In the Referenced Assemblies section, click the Add... button. In the Add Assembly Reference window select "System.ServiceProcess.dll" and click OK.

d. Erase the default script code and paste in the following code:

Imports System.Collections.Generic 
Imports System 
Imports ArcanaDevelopment.adTempus.Server
Imports System.ServiceProcess

'Contains methods for controlling Windows services. See www.arcanadev.com/support/kb/K00000381.aspx for more information

Public Module ServiceControl
    Public Function StartService(serviceName As String,Optional computerName As String="") As Boolean 
		Try
			Dim controller As ServiceController
			
			controller=GetService(serviceName,computerName)
			If ServiceControllerStatus.Running=controller.Status Then
				adTempus.LogMessage(MessageTypeEnum.Informational,0,"Service " & ServiceDescription(serviceName,computerName) & " was already running")
			Else
				controller.Start()
				adTempus.LogMessage(MessageTypeEnum.Informational,0,"Started service " & ServiceDescription(serviceName,computerName))
			End If
			Return True
		Catch ex As Exception
			adTempus.LogMessage(MessageTypeEnum.Error,0,"An error occurred while starting service " & ServiceDescription(serviceName,computerName) & ": " & ex.Message)
			Return False
		End Try
    End Function

    Public Function StopService(serviceName As String,Optional computerName As String="") As Boolean 
		Try
			Dim controller As ServiceController
			
			controller=GetService(serviceName,computerName)
			If ServiceControllerStatus.Stopped=controller.Status Then
				adTempus.LogMessage(MessageTypeEnum.Informational,0,"Service " & ServiceDescription(serviceName,computerName) & " was already stopped")
			Else
				controller.Stop()
				adTempus.LogMessage(MessageTypeEnum.Informational,0,"Stopped service " & ServiceDescription(serviceName,computerName))
			End If
			Return True
		Catch ex As Exception
			adTempus.LogMessage(MessageTypeEnum.Error,0,"An error occurred while stopping service " & ServiceDescription(serviceName,computerName) & ": " & ex.Message)
			Return False
		End Try
    End Function

	Private Function GetService(serviceName As String,computerName As String) As ServiceController
		Dim controller As New ServiceController(serviceName)
		If Not String.IsNullOrEmpty(computerName) Then
			controller.MachineName=computerName
		End If
		Return controller
	End Function

	Private Function ServiceDescription(serviceName As String,computerName As String) As String
		If String.IsNullOrEmpty(computerName) Then
			Return """" & serviceName & """"
		Else
			Return """" & serviceName & """ on computer """ & computerName & """"
		End If
	End Function

End Module

e. Click OK to save the Script Library.

Start a Service from a Script

Once the Script Library has been created you can call the StartService method from an adTempus script to start a service.

To use the code defined in the Script Library:

1. Create a new job, or edit an existing job.

2. On the Steps page of the Job Properties, add a new step, selecting the "Execute a script" option in the Select Task window.

3. In the Script Execution Task Properties window, select the "Execute a script stored in adTempus" option, then click the Select... button.

4. In the Select Script window, click New... to create a new script.

5. In the Script Properties window, select "VB.NET" as the script Language.

6. Under Included Script Libraries, check the "ServiceControl" library.

7. To start service serviceName on remote computer computerName, use the following code:

Imports System
Imports System.Collections
Imports ArcanaDevelopment.adTempus.Server

Public Class UserScript
    Inherits ArcanaDevelopment.adTempus.ScriptEngine.UserScriptBase

    Public Overrides Function Run() As Object
        If StartService("serviceName","computerName") Then
                Return 0
        Else
                Return 8
        End If
    End Function
End Class

Stop a Service from a Script

Once the Script Library has been created you can call the StopService method from an adTempus script to stop a service.

To use the code defined in the Script Library:

1. Create a new job, or edit an existing job.

2. On the Steps page of the Job Properties, add a new step, selecting the "Execute a script" option in the Select Task window.

3. In the Script Execution Task Properties window, select the "Execute a script stored in adTempus" option, then click the Select... button.

4. In the Select Script window, click New... to create a new script.

5. In the Script Properties window, select "VB.NET" as the script Language.

6. Under Included Script Libraries, check the "ServiceControl" library.

7. To stop service serviceName on remote computer computerName, use the following code:

Imports System
Imports System.Collections
Imports ArcanaDevelopment.adTempus.Server

Public Class UserScript
    Inherits ArcanaDevelopment.adTempus.ScriptEngine.UserScriptBase

    Public Overrides Function Run() As Object
        If StopService("serviceName","computerName") Then
                Return 0
        Else
                Return 8
        End If
    End Function
End Class

Notes

The adTempus job must be run under the User Account of a user who has permission to control the specified service.

The script will not try to start a service that is already running, or stop a service that is already stopped.

The script will log an informational message in the job log if the service is successfully started or stopped, or an error message if an error occurs. If an error occurs, the script will also cause the step to fail.

The serviceName required by the scripts above is the internal service name for the service, which is not always the same as the display name shown in the Services tool in Windows. To find the internal name, run the Registry Editor and go to key HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services. Under this key, locate the key for the service you want to control. The serviceName is the key name. For example, the "Automatic Updates" service can be found under key "wuauserv". If you were controlling this service, you would use "wuauserv" as the serviceName in the script.