3939
4040
4141class ServiceManager (utils .AutoHandle ):
42+ """An object to query, list and explore services"""
4243 def _get_handle (self ):
4344 return windows .winproxy .OpenSCManagerA (dwDesiredAccess = gdef .MAXIMUM_ALLOWED )
4445
4546 def open_service (self , name , access = gdef .MAXIMUM_ALLOWED ):
4647 return windows .winproxy .OpenServiceA (self .handle , name , access ) # Check service exists :)
4748
4849 def get_service (self , key , access = gdef .MAXIMUM_ALLOWED ):
50+ """Get a service by its name/index or a list of services via a slice
51+
52+ :return: :class:`Service` or [:class:`Service`] -- A :class:`Service` or list of :class:`Service`
53+ """
4954 if isinstance (key , int_types ):
5055 return self .enumerate_services ()[key ]
5156 if isinstance (key , slice ):
@@ -59,6 +64,10 @@ def get_service(self, key, access=gdef.MAXIMUM_ALLOWED):
5964 return Service (name = key , handle = handle )
6065
6166 __getitem__ = get_service
67+ """Get a service by its name/index or a list of services via a slice
68+
69+ :return: :class:`Service` or [:class:`Service`] -- A :class:`Service` or list of :class:`Service`
70+ """
6271
6372 def get_service_display_name (self , name ):
6473 # This API is strange..
@@ -70,6 +79,9 @@ def get_service_display_name(self, name):
7079 return result .value
7180
7281 def _enumerate_services_generator (self ):
82+ """The generator code behind __iter__.
83+ Allow to iter over the services on the system
84+ """
7385 size_needed = gdef .DWORD ()
7486 nb_services = gdef .DWORD ()
7587 counter = gdef .DWORD ()
@@ -93,12 +105,17 @@ def _enumerate_services_generator(self):
93105 return
94106
95107 __iter__ = _enumerate_services_generator
108+ """Iter over the services on the system
109+
110+ :yield: :class:`Service`
111+ """
96112
97113 def enumerate_services (self ):
98114 return list (self ._enumerate_services_generator ())
99115
100116
101117class Service (gdef .SC_HANDLE ):
118+ """Represent a service on the system"""
102119 def __init__ (self , handle , name , description = None ):
103120 super (Service , self ).__init__ (handle )
104121 self .name = name
@@ -149,6 +166,10 @@ def security_descriptor(self):
149166 return security .SecurityDescriptor .from_service (self .name )
150167
151168 def start (self , args = None ):
169+ """Start the service
170+
171+ :param args: a list of :class:`str`
172+ """
152173 nbelt = 0
153174 if args is not None :
154175 if isinstance (args , windows .pycompat .anybuff ):
@@ -158,6 +179,7 @@ def start(self, args=None):
158179 return windows .winproxy .StartServiceA (self , nbelt , args )
159180
160181 def stop (self ):
182+ """Stop the service"""
161183 status = SERVICE_STATUS ()
162184 windows .winproxy .ControlService (self , gdef .SERVICE_CONTROL_STOP , status )
163185 return status
0 commit comments