Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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
- Zdefiniuj zmienne potrzebne do pobrania i ustawienia informacji zabezpieczających i kodów zwracanych.
- Wywołaj funkcję wywołania zwrotnego pfQueryInfo w strukturze wywołania zwrotnego, aby pobrać informacje o konfiguracji z bazy danych zabezpieczeń.
- Pobierz odpowiednie informacje z usługi.
- Porównaj dane konfiguracji pobrane z usługi z bazą danych zabezpieczeń.
- Jeśli informacje nie są takie same, wywołaj funkcję wywołania zwrotnego pfSetInfo w strukturze wywołania zwrotnego, aby zaktualizować bazę danych.
- 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.
- 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.
- 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;
}