7.13 Manipulating Windows Services


Credit: Andy McKay

7.13.1 Problem

You need to control Windows services on any local machine.

7.13.2 Solution

The win32all package includes a win32serviceutil module that is specifically designed to handle Windows services:

# needs win32all, or ActiveState's ActivePython distribution import win32serviceutil def service_running(service, machine):     return win32serviceutil.QueryServiceStatus(service, machine)[1] == 4 def service_info(action, machine, service):     running = service_running(service, machine)     servnam = 'service (%s) on machine(%s)'%(service, machine)     action = action.lower(  )     if action == 'stop':         if not running:             print "Can't stop, %s not running"%servnam             return 0         win32serviceutil.StopService(service, machine)         running = service_running(service, machine)         if running:             print "Can't stop %s (???)"%servnam             return 0         print '%s stopped successfully' % servnam     elif action == 'start':         if running:             print "Can't start, %s already running"%servnam             return 0         win32serviceutil.StartService(service, machine)         running = service_running(service, machine)         if not running:             print "Can't start %s (???)"%servnam             return 0         print '%s started successfully' % servnam     elif action == 'restart':         if not running:             print "Can't restart, %s not running"%servnam             return 0         win32serviceutil.RestartService(service, machine)         running = service_running(service, machine)         if not running:             print "Can't restart %s (???)"%servnam             return 0         print '%s restarted successfully' % servnam     elif action == 'status':         if running:             print "%s is running" % servnam         else:             print "%s is not running" % servnam     else:         print "Unknown action (%s) requested on %s"%(action, servnam) if _ _name_ _ == '_ _main_ _':     # Just some test code; change at will!     machine = 'cr582427-a'     service = 'Zope23'     action = 'start'     service_info(action, machine, service)

7.13.3 Discussion

Mark Hammond's win32all package makes it child's play to code Python scripts for a huge variety of Windows system-administration tasks. For example, controlling Windows services becomes a snap. In addition to the few features exemplified in this recipe, which are similar to those provided by Windows' own net command, win32all also gives you options such as installing and removing services.

The functions this recipe uses from the win32serviceutil module are StartService, StopService, RestartService, and QueryServiceStatus. Each takes two arguments: the name of the service and the name of the machine. The first three perform the start, stop, and restart as requested. The fourth returns a structured code describing whether and how the given service is running on the given machine, but in this recipe we exploit only the fact, encapsulated in the recipe's service_running function, that the second item of the return value is the integer 4 if and only if the service is running successfully.

7.13.4 See Also

Documentation for win32serviceutil in win32all (http://starship.python.net/crew/mhammond/win32/Downloads.html) or ActivePython (http://www.activestate.com/ActivePython/); Windows API documentation available from Microsoft (http://msdn.microsoft.com); Python Programming on Win32, by Mark Hammond and Andy Robinson (O'Reilly).



Python Cookbook
Python Cookbook
ISBN: 0596007973
EAN: 2147483647
Year: 2005
Pages: 346

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net