Windows Services

Other topics

Check if a service is installed

This example show how you can check if a service already exists (i.e., is installed on the machine) or not. This code requires only the lowest privileges necessary, so each process can perform the check, no matter what level of security it is running at.

#define UNICODE
#define _UNICODE
#include <Windows.h>
#include <string>
#include <iostream>

enum Result
{
   unknown,
   serviceManager_AccessDenied,
   serviceManager_DatabaseDoesNotExist,
   service_AccessDenied,
   service_InvalidServiceManagerHandle,
   service_InvalidServiceName,
   service_DoesNotExist,
   service_Exist
};

Result ServiceExists(const std::wstring &serviceName)
{
   Result r = unknown;

   // Get a handle to the SCM database
   SC_HANDLE manager = OpenSCManager(NULL, SERVICES_ACTIVE_DATABASE, GENERIC_READ);
   
   if (manager == NULL)
   {
      DWORD lastError = GetLastError();
      
      // At this point, we can return directly because no handles need to be closed.
      if (lastError == ERROR_ACCESS_DENIED)
         return serviceManager_AccessDenied;
      else if (lastError == ERROR_DATABASE_DOES_NOT_EXIST)
         return serviceManager_DatabaseDoesNotExist;
      else
         return unknown;
   }

   SC_HANDLE service = OpenService(manager, serviceName.c_str(), GENERIC_READ);
   
   if (service == NULL)
   {
      DWORD error = GetLastError();
      
      if (error == ERROR_ACCESS_DENIED)
         r = service_AccessDenied;
      else if (error == ERROR_INVALID_HANDLE)
         r = service_InvalidServiceManagerHandle;
      else if (error == ERROR_INVALID_NAME)
         r = service_InvalidServiceName;
      else if (error == ERROR_SERVICE_DOES_NOT_EXIST)
         r = service_DoesNotExist;
      else
         r = unknown;
   }
   else
      r = service_Exist;

   if (service != NULL)
      CloseServiceHandle(service);

   if (manager != NULL)
      CloseServiceHandle(manager);
   
   return r;
}

int main()
{
   std::wstring serviceName = L"MSSQL$SQLEXPRESS";  // name of the service to check
   Result result = ServiceExists(serviceName);
   if (result == service_Exist)
      std::wcout << L"The service '" << serviceName << "' exists." << std::endl;
   else if (result == service_DoesNotExist)
      std::wcout << L"The service '" << serviceName << "' does not exist." << std::endl;
   else
      std::wcout << L"An error has occurred, and it could not be determined whether the service '" << serviceName << "' exists or not." << std::endl;
}

API Reference:

Contributors

Topic Id: 2256

Example Ids: 7403

This site is not affiliated with any of the contributors.