Udostępnij przez


Implementowanie aplikacji SceSvcAttachmentAnalyze

Funkcja SceSvcAttachmentAnalyze musi pobrać informacje o konfiguracji z bazy danych zabezpieczeń i usługi, porównać dwa zestawy informacji, a następnie zaktualizować sekcję analizy bazy danych zabezpieczeń z wszelkimi różnicami. Można to zapewnić przy użyciu następującego algorytmu.

Aby wdrożyć SceSvcAttachmentAnalyze

  1. Zdefiniuj zmienne potrzebne do pobrania i ustawienia informacji zabezpieczających i kodów zwracanych.
  2. Wywołaj funkcję wywołania zwrotnego pfQueryInfo w strukturze wywołania zwrotnego, aby pobrać informacje o konfiguracji z bazy danych zabezpieczeń.
  3. Pobierz odpowiednie informacje z usługi.
  4. Porównaj dane konfiguracji pobrane z usługi z bazą danych zabezpieczeń.
  5. Jeśli informacje nie są takie same, wywołaj funkcję wywołania zwrotnego pfSetInfo w strukturze wywołania zwrotnego, aby zaktualizować bazę danych.
  6. Zwolnij wszystkie bufory używane do pobierania informacji. Wywołaj funkcję wywołania zwrotnego pfFreeInfo w strukturze wywołania zwrotnego, aby zwolnić pamięć używaną do zwracanych informacji o bazie danych.
  7. Jeśli istnieje jakikolwiek komunikat, który rozszerzenie chce dodać do pliku dziennika analizy, wywołaj funkcję wywołania zwrotnego pfLogInfo w strukturze wywołania zwrotnego.
  8. Zwróć odpowiednie kody SCESTATUS.

Poniższy przykład przedstawia jedną z możliwych implementacji SceSvcAttachmentAnalyze. Należy pamiętać, że w tym przykładzie funkcje QueryConfigurationLine i CompareValue odpowiednio wysyłają informacje o zapytaniach z usługi i porównują te wartości z wartościami pobranymi z bazy danych zabezpieczeń. Implementacja tych funkcji nie jest wyświetlana.

#include <windows.h>

SCESTATUS WINAPI SceSvcAttachmentAnalyze (
    IN PSCESVC_CALLBACK_INFO pSceCbInfo
)
{
  
    ////////////////////////////////////////////////////
    // Define variables.
    ////////////////////////////////////////////////////
    PSCESVC_CONFIGURATION_INFO     pConfigInfo = NULL;
    SCESTATUS                      retCode;
    SCE_ENUMERATION_CONTEXT        EnumContext = 0;
  
  

    if ( pSceCbInfo == NULL ||
         pSceCbInfo->sceHandle == NULL ||
         pSceCbInfo->pfQueryInfo == NULL ||
         pSceCbInfo->pfSetInfo == NULL ||
         pSceCbInfo->pfFreeInfo == NULL ) 
    {
        return(SCESTATUS_INVALID_PARAMETER);
    }


  ////////////////////////////////////////////////////
  // Retrieve information from security database.
  ///////////////////////////////////////////////////
    do
    {
        retCode =  (*(pSceCbInfo->pfQueryInfo))(
                              pSceCbInfo->sceHandle,
                              SceSvcConfigurationInfo,
                              NULL,
                              FALSE,
                              &pConfigInfo,
                              &EnumContext
                              );
        if(retCode == SCESTATUS_SUCCESS && pConfigInfo != NULL)
        {
          ULONG i;
          for(i = 0;i < pConfigInfo->Count; i++)
          {
            if(pConfigInfo->Line[I].Key == NULL) 
                continue;
        
        //////////////////////////////////////////////
        // Query service for corresponding key.
        //////////////////////////////////////////////
            QueryConfigurationLine(
                               pConfigInfo->Line[i].Key,
                               &SystemValue);
        
        //////////////////////////////////////////////
        // Compare values.
        //////////////////////////////////////////////
            CompareValue(
                     pConfigInfo->Line[i].Key,
                     SystemValue,
                     pConfigInfo->Line[i].Value,
                     &Result);
        
        //////////////////////////////////////////////
        // Write to security database if values are 
        // not equal.
        //////////////////////////////////////////////
            if(Result != NULL)
            {
              retCode =  (*(pSceCbInfo->pfSetInfo))(pSceCbInfo->sceHandle,
                                      SceSvcAnalysisInfo,
                                      pConfigInfo->Line[i].Key,
                                      TRUE,
                                      Result);
              if(retCode != SCESTATUS_SUCCESS)
              {
                //////////////////////////////////////////
                // Add code to handle other return codes.
                //////////////////////////////////////////
              }
            }
        }
      
          //////////////////////////////////////////////
          // Free all buffers used to retrieve 
          // SceSvcFree frees memory allocated by call 
          // to SceSvcQueryQueryInfo. 
          /////////////////////////////////////////
        (*(pSceCbInfo->pfFreeInfo)) (PVOID)pConfigInfo);
          pConfigInfo = NULL;
    }
  } while (retCode == SCESTATUS_SUCCESS && pConfigInfo != NULL);
  
  
  //////////////////////////////////////////////////
  // If the return code is not SCESTATUS_SUCCESS, add code to 
  // set error message appropriately.
  //////////////////////////////////////////////////
  return retCode;
}