Getting a list of installed services (Views: 29)
Problem/Question/Abstract: Want to get a list of active, inactive or all Windows services? Answer: 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; To get a list of all Windows services into a listbox named ListBox1: ServiceGetList('', SERVICE_WIN32, SERVICE_STATE_ALL, ListBox1.Items); |