Mega Code Archive

 
Categories / Delphi / Examples
 

Windows services - getting a list of installed services

Want to get a list of active, inactive or all Windows services? Following function can help you to do this, but be sure to read other Windows services related tips for details. const // // Service Types // SERVICE_KERNEL_DRIVER = $00000001; SERVICE_FILE_SYSTEM_DRIVER = $00000002; SERVICE_ADAPTER = $00000004; SERVICE_RECOGNIZER_DRIVER = $00000008; SERVICE_DRIVER = (SERVICE_KERNEL_DRIVER or SERVICE_FILE_SYSTEM_DRIVER or SERVICE_RECOGNIZER_DRIVER); SERVICE_WIN32_OWN_PROCESS = $00000010; SERVICE_WIN32_SHARE_PROCESS = $00000020; SERVICE_WIN32 = (SERVICE_WIN32_OWN_PROCESS or SERVICE_WIN32_SHARE_PROCESS); SERVICE_INTERACTIVE_PROCESS = $00000100; SERVICE_TYPE_ALL = (SERVICE_WIN32 or SERVICE_ADAPTER or SERVICE_DRIVER or SERVICE_INTERACTIVE_PROCESS); uses WinSvc; //------------------------------------- // Get a list of services // // return TRUE if successful // // sMachine: // machine name, ie: \SERVER // empty = local machine // // dwServiceType // SERVICE_WIN32, // SERVICE_DRIVER or // SERVICE_TYPE_ALL // // dwServiceState // SERVICE_ACTIVE, // SERVICE_INACTIVE or // SERVICE_STATE_ALL // // slServicesList // TStrings variable to storage // function ServiceGetList( sMachine : string; dwServiceType, dwServiceState : DWord; slServicesList : TStrings ) : boolean; const // // assume that the total number of // services is less than 4096. // increase if necessary cnMaxServices = 4096; type TSvcA = array[0..cnMaxServices] of TEnumServiceStatus; PSvcA = ^TSvcA; var // // temp. use j : integer; // // service control // manager handle schm : SC_Handle; // // bytes needed for the // next buffer, if any nBytesNeeded, // // number of services nServices, // // pointer to the // next unread service entry nResumeHandle : DWord; // // service status array ssa : PSvcA; begin Result := false; // connect to the service // control manager schm := OpenSCManager( PChar(sMachine), Nil, SC_MANAGER_ALL_ACCESS); // if successful... if(schm > 0)then begin nResumeHandle := 0; New(ssa); EnumServicesStatus( schm, dwServiceType, dwServiceState, ssa^[0], SizeOf(ssa^), nBytesNeeded, nServices, nResumeHandle ); // // assume that our initial array // was large enough to hold all // entries. add code to enumerate // if necessary. // for j := 0 to nServices-1 do begin slServicesList. Add( StrPas( ssa^[j].lpDisplayName ) ); end; Result := true; Dispose(ssa); // close service control // manager handle CloseServiceHandle(schm); end; end; Listing #1 : Delphi code. Download getlist (1.15 KB). To get a list of all Windows services into a listbox named ListBox1: ServiceGetList( '', SERVICE_WIN32, SERVICE_STATE_ALL, ListBox1.Items ); Listing #2 : Delphi code. Download demo (0.19 KB). Applicable Keywords : Delphi, Delphi 3.x, Functions, Win32