Recherche…


Vérifier si un service est installé

Cet exemple montre comment vérifier si un service existe déjà ( c'est -à- dire s'il est installé sur la machine). Ce code ne nécessite que les privilèges les plus bas nécessaires, de sorte que chaque processus puisse effectuer la vérification, quel que soit le niveau de sécurité sur lequel il s'exécute.

#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;
}

Référence API:



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow