[ Team LiB ] |
26.5 Manipulating ServicesQuerying services is simple to do with WMI. The Win32_Service class is the WMI representation of a service. The Win32_Service class contains a lot of property methods that provide information about the service; the most useful ones have been listed in Table 26-2.
The following script retrieves all the running services on a machine. All we need to do is use a WQL query that finds all Win32_Service objects that have a state of "Running": strComputer = "." Set objWMI = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set objServices = objWMI.ExecQuery _ ("SELECT * FROM Win32_Service WHERE State = 'Running'") For Each objService in objServices Wscript.Echo objService.DisplayName Wscript.Echo " Name: " & objService.Name Wscript.Echo " PathName: " & objService.PathName Wscript.Echo " Started: " & objService.Started Wscript.Echo " StartMode: " & objService.StartMode Wscript.Echo " StartName: " & objService.StartName Wscript.Echo " State: " & objService.State Wscript.Echo "" next Before you can start to manipulate the status of a service, you have to be able to find any dependent services. A dependent service requires the parent service to be running while it is running. If you try to stop the parent service without first stopping all dependent services, you will get an error. The following example shows how to find all dependent services for the IIS Admin service: strService = "IISADMIN" strComputer = "." Set objWMI = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set objServiceList = objWMI.ExecQuery( _ "Associators of {Win32_Service.Name='" & strService & "'} " & _ "Where AssocClass=Win32_DependentServiceRole=Antecedent" ) WScript.Echo "List of dependent services for " & strService & ":" For each objService in objServiceList WScript.Echo " " & objService.DisplayName Next You may have noticed the WQL query in this example is a little different than the ones we've used so far. We used something called the Associators for a class. One of the fundamental concepts within WMI is class association, which allows you to perform queries to retrieve objects that have dependencies or associations to a given object. Associators come into play in lot of situations, but a great example of them is with service dependencies. Some services are dependent on others in order to run. Using the Associators of clause within a WQL query allows you to find each dependent service. Now that we can get a list of a service's dependent services, we can write scripts to stop, start, and restart a service. Table 26-3 lists the useful methods available to the Win32_Service class.
Example 26-1 shows how to restart a service. Since there is no RestartService method available in WMI, you have to simulate a restart by stopping all dependent services, stopping the target service, then starting the target service and any dependent services. Example 26-1. Using Win32_Service methods to simulate a RestartService methodstrService = "IISADMIN" strComputer = "." WScript.Echo "Restarting " & strService & "..." ' Stop dependent services Set objWMI = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set objServiceList = objWMI.ExecQuery("Associators of " _ & "{Win32_Service.Name='" & strService & "'} Where " _ & "AssocClass=Win32_DependentService " & "Role=Antecedent" ) for each objService in objServiceList WScript.Echo " Stopping " & objService.Name objService.StopService( ) next Wscript.Sleep 10000 ' Stop target service Set objService = objWMI.Get("Win32_Service.Name='" & strService & "'") WScript.Echo " Stopping " & objService.Name objService.StopService( ) Wscript.Sleep 10000 ' Start target service Set objService = objWMI.Get("Win32_Service.Name='" & strService & "'") WScript.Echo " Starting " & objService.Name objService.StartService( ) Wscript.Sleep 10000 ' Start dependent services Set objServiceList = objWMI.ExecQuery("Associators of " _ & "{Win32_Service.Name='" & strService & "'} Where " _ & "AssocClass=Win32_DependentService " & "Role=Antecedent" ) for each objService in objServiceList WScript.Echo " Starting " & objService.Name objService.StartService( ) next |
[ Team LiB ] |