Jeu d'outils de configuration de sécurité (3)

Sur cette page

Jeu d'outils de configuration de sécurité (3ème partie) Jeu d'outils de configuration de sécurité (3ème partie)
Valeurs retournées Valeurs retournées
Syntaxe Syntaxe
Paramètres Paramètres
Valeurs retournées Valeurs retournées
Syntaxe Syntaxe
Paramètres Paramètres
Valeurs retournées Valeurs retournées

Jeu d'outils de configuration de sécurité (3ème partie)

Valeurs retournées

  • SCESTATUS_SUCCESS indique que l'opération a réussi.

  • Toute autre valeur retournée définie ci-dessus.

Exemple de code

SCESTATUS
WINAPI
SceSvcAttachmentConfig(
IN PSCESVC_CALLBACK_INFO pSceCbInfo
)
{
//
//définition des 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);
}

//
// lire maintenant les informations et configurer le système à l'aide de celles-ci.
//
// REMARQUE : Vous pouvez décider de lire toutes les informations d'abord
// et d'effectuer ensuite la configuration ; ce choix incombe à la personne assurant la mise en œuvre.
//

do {

__try {
retCode = (*(pSceCbInfo->pfQueryInfo))(
pSceCbInfo->sceHandle,
SceSvcConfigurationInfo,
NULL,
FALSE,
(PVOID *)&pConfigInfo,
&EnumContext
);

} __except (EXCEPTION_EXECUTE_HANDLER) {
retCode = SCESTATUS_SERVICE_NOT_SUPPORT;
}

if(retCode == SCESTATUS_SUCCESS &&
pConfigInfo != NULL)
{
ULONG i;
//
// Nous avons quelques informations, passons à la configuration.
//
for(i = 0;i < pConfigInfo->Count; i++)
{
if(pConfigInfo->Line[i].Key == NULL)
continue;

//
// Nous avons une clé que nous devons traiter.
// Cela constitue la partie principale de la configuration.
//
ProcessConfigurationLine(pConfigInfo->Line[i]);
}

//
// libérer les données que nous avons récupérées.
//

__try {

(*(pSceCbInfo->pfFreeInfo))((PVOID)pConfigInfo);

} __except (EXCEPTION_EXECUTE_HANDLER) {
//rien
}
PConfigInfo = NULL;
}
//
// traiter d'autres codes de retour, si nécessaire.
//
} while ( retCode == SCESTATUS_SUCCESS && CountReturned > 0);

//
// si le code de retour n'indique pas la réussite, nous devons définir
// un message d'erreur de façon appropriée.
//

//
// renvoie le retCode.
//
return retCode;

}

SceSvcAttachmentAnalyze

Syntaxe

typedef
SCESTATUS
(*PF_ConfigAnalyzeService)(
IN PSCESVC_CALLBACK_INFO pSceCbInfo
);

Paramètres

PsceCbInfo — Structure transmise au moteur de l'attachement par le Jeu d'outils de configuration de sécurité lorsqu'il faut invoquer cette interface. Elle fournit un descripteur de contexte qui est utilisé par les différentes fonctions de rappel. Elle fournit également les pointeurs vers les fonctions de rappel.

Cette interface doit effectuer les opérations suivantes :

  • Demander les informations de configuration du service directement.

  • Utiliser PFSCE_QUERY_INFO pour demander les informations de configuration.

  • Calculer les différences des paramètres basées sur le type et la syntaxe.

  • Utiliser PFSCE_SET_INFO pour écrire les informations différentielles dans la base de données.

Valeurs retournées

  • SCESTATUS_SUCCESS indique que l'opération a réussi.

  • Toutes les autres valeurs d'erreur SCESTATUS sont acceptées.

Exemple de code

SCESTATUS
WINAPI
SceSvcAttachmentAnalyze(
IN SCE_HANDLE sceHandle,
OUT PWSTR *ppszErrMessage,
OUT PDWORD pdErrLength
);
{
//
// définir diverses variables locales.
//

if ( pSceCbInfo == NULL ||
pSceCbInfo->sceHandle == NULL ||
pSceCbInfo->pfQueryInfo == NULL ||
pSceCbInfo->pfSetInfo == NULL ||
pSceCbInfo->pfFreeInfo == NULL ) {

return(SCESTATUS_INVALID_PARAMETER);
}

//
// lire maintenant les informations de configuration de base, interroger
// le paramètre système correspondant, les comparer
// et écrire dans la base de données.
//
//

do {

__try {
retCode = (*(pSceCbInfo->pfQueryInfo))(
pSceCbInfo->sceHandle,
SceSvcConfigurationInfo,
NULL,
FALSE,
(PVOID *)&pConfigInfo,
&EnumContext
);

} __except (EXCEPTION_EXECUTE_HANDLER) {
retCode = SCESTATUS_SERVICE_NOT_SUPPORT;
}

if(retCode == SCESTATUS_SUCCESS &&
pConfigInfo != NULL)
{
ULONG i;
//
// Nous avons quelques informations, passons à la configuration.
//
for(i = 0;i < pConfigInfo->Count; i++)
{
if(pConfigInfo->Line[i].Key == NULL)
continue;

//
// Nous avons une clé que nous devons interroger.
// Cette fonction est supposée interroger
// la configuration système correspondant
// à la valeur de la clé.
//
QueryConfigurationLine(pConfigInfo->Line[i].Key,
&SystemValue);

//
// comparer maintenant les valeurs.
//
CompareValue(pConfigInfo->Line[i].Key,
SystemValue,
pConfigInfo->Line[i].Value,
&Result
);

//
// Vérifier s'il y a quelque chose à
// écrire dans la partie analyse de la // base de données.
if(Result != NULL)
{
//
// remplacera exactement une // valeur.
// Une méthode plus efficace pour effectuer cette opération
// consisterait à cumuler un
// ensemble de valeurs et à valider.
//

__try {
retCode = (*(pSceCbInfo->pfSetInfo))(
pSceCbInfo->sceHandle,
SceSvcAnalysisInfo,
pConfigInfo->Line[I].Key,
TRUE,
(PVOID)&Result
);
} __except (EXCEPTION_EXECUTE_HANDLER) {
retCode = SCESTATUS_SERVICE_NOT_SUPPORT;
}
if(retCode != SCESTATUS_SUCCESS)
{
// S'il ne devient pas défini, nous
// devons effectuer un nettoyage
// ici.
}
}
}

//
// libérer les données que nous avons récupérées.
//
SceSvcFree((PVOID)pConfigInfo);
__try {
(*(pSceCbInfo->pfFreeInfo))((PVOID)pConfigInfo);
} __except (EXCEPTION_EXECUTE_HANDLER) {
}
PConfigInfo = NULL;

//
// libérerait également les mémoires-tampons SystemValue et
// Result, jusqu'à chaque attachement
//

}
//
// traiter d'autres codes de retour, si nécessaire.
//
} while ( retCode == SCESTATUS_SUCCESS && pConfigInfo != NULL);

//
// si le code de retour n'indique pas la réussite, nous devons définir
// un message d'erreur de façon appropriée, si la mémoire tampon d'erreur n'est pas NULL
//

//
// renvoie le retCode.
//
return retCode;

}

SceSvcAttachmentUpdate

Le Jeu d'outils de configuration de sécurité (ou le Gestionnaire) appelle cette interface lorsque le composant logiciel enfichable de l'Éditeur (ou du Gestionnaire) de configuration de sécurité transmet des modifications spécifiques du service aux paramètres de configuration stockés dans la base de données.

Syntaxe

typedef
SCESTATUS
(*PF_UpdateService)(
IN PSCESVC_CALLBACK_INFO pSceCbInfo,
IN PSCESVC_CONFIGURATION_INFO ServiceInfo
);

Paramètres

  • PsceCbInfo — Structure transmise au moteur de l'attachement par le Jeu d'outils de configuration de sécurité lorsque cette interface est invoquée. Elle fournit un descripteur de contexte qui devra être utilisé par les différentes fonctions de rappel. Elle fournit également les pointeurs vers les fonctions de rappel.

  • ServiceInfo — Spécifie les informations de configuration mises à jour qui sont basées sur les modifications de l'utilisateur et fournies par le composant logiciel enfichable d'extension de l'attachement. Voir l'explication de la structure de données SCESVC_CONFIGURATION_INFO dans la section des structures de données.

Cette interface d'attachement doit effectuer les opérations suivantes :

  • Utiliser PFSCE_QUERY_INFO pour demander les informations de base (informations de configuration) stockées dans la base de données.

  • Utiliser PFSCE_SET_INFO pour demander la dernière série de différences (informations d'analyse) stockée dans la base de données.

  • Utiliser le ServiceInfo fourni pour calculer les nouvelles informations de configuration de base.

  • Utiliser le ServiceInfo fourni et les dernières différences stockées pour calculer les nouvelles informations différentielles.

  • Utiliser PFSCE_SET_INFO pour écrire les nouvelles informations de base dans la base de données.

  • Utiliser PFSCE_SET_INFO pour écrire les nouvelles informations différentielles dans la base de données.

Valeurs retournées

¿

  • SCESTATUS_SUCCESS indique que l'opération a réussi.

  • Toutes les autres valeurs d'erreur SCESTATUS sont acceptées.

Exemple de code

SCESTATUS
WINAPI
SceSvcAttachmentUpdate(
IN SCE_HANDLE sceHandle,
IN SCESVC_CONFIGURATION_INFO *ServiceInfo
);
{

if ( pSceCbInfo == NULL ||
pSceCbInfo->sceHandle == NULL ||
pSceCbInfo->pfQueryInfo == NULL ||
pSceCbInfo->pfSetInfo == NULL ||
pSceCbInfo->pfFreeInfo == NULL ||
ServiceInfo == NULL ) {

return(SCESTATUS_INVALID_PARAMETER);
}
//
// traiter chaque ligne des informations transmises.
//
for(i=0; i < ServiceInfo->Count; i++)
{
EnumContext = 0;

__try {
retCode = (*(pSceCbInfo->pfQueryInfo))(
pSceCbInfo->sceHandle,
SceSvcConfigurationInfo,
ServiceInfo->Lines[i].Key,
TRUE,
(PVOID *)&pConfigInfo,
&EnumContext
);
} __except (EXCEPTION_EXECUTE_HANDLER) {
retCode = SCESTATUS_SERVICE_NOT_SUPPORT;
}
if(retCode != SCESTATUS_SUCCESS &&
retCode != SCESTATUS_RECORD_NOT_FOUND)
{
//
// traiter l'erreur ici.
//
break;
}

//
// si la valeur spécifiée est NULL, la suppression
// de la clé est demandée.
//
if(ServiceInfo->Line[i].Value == NULL)
{
if(retCode == SCESTATUS_SUCCESS)
{
//
// Vérifions que l'analyse est ok.
//
EnumContext = 0;

__try {
retCode = (*(pSceCbInfo->pfQueryInfo))(
pSceCbInfo->sceHandle,
SceSvcAnalysisInfo,
ServiceInfo->Lines[i].Key,
TRUE,
(PVOID *)&pAnalInfo,
&EnumContext
);
} __except (EXCEPTION_EXECUTE_HANDLER) {
retCode = SCESTATUS_SERVICE_NOT_SUPPORT;
}
if(retCode == SCESTATUS_RECORD_NOT_FOUND)
{
//
// Des informations d'analyse n'ont pas été trouvées,
// cela signifie qu'il y a eu correspondance pendant
// l'analyse réelle. Maintenant, nous
// supprimons les informations de configuration,
// la configuration actuelle correspond donc
// à ce que l'analyse pourrait enregistrer.
//
UpdateInfo->Count = 1
UpdateInfo->Line = &UpdateLine;
UpdateLine.Key = pConfigInfo->Line[0].Key;
UpdateLine.Value =
(PBYTE)pConfigInfo->Line[0].Value;

__try {
retCode = (*(pSceCbInfo->pfSetInfo))(
pSceCbInfo->sceHandle,
SceSvcAnalysisInfo,
NULL,
TRUE,
(PVOID)&UpdateInfo
);

} __except (EXCEPTION_EXECUTE_HANDLER) {
retCode = SCESTATUS_SERVICE_NOT_SUPPORT;
}
if(retCode != SCESTATUS_SUCCESS)
{
//
// nettoyage, quelque chose
// a échoué.
//
}
}
elseif (retCode == SCESTATUS_SUCCESS)
{
//
// supprimer simplement la configuration.
// nous avons déjà des informations d'analyse
// en place.
}
else
{
//
// traiter les autres codes d'erreur.
//
}

//
// supprimer la clé
//

__try {
retCode = (*(pSceCbInfo->pfSetInfo))(
pSceCbInfo->sceHandle,
SceSvcConfigurationInfo,
ServiceInfo->Lines[i].Key,
TRUE,
NULL
);
} __except (EXCEPTION_EXECUTE_HANDLER) {
retCode = SCESTATUS_SERVICE_NOT_SUPPORT;
}
if(retCode != SCESTATUS_SUCCESS)
{
//
// nettoyage d'erreur.
//
}

}
//
// SCESTATUS_RECORD_NOT_FOUND ne signifie rien d'autre.
// puisque la clé n'existe même pas.
//
}
else
{
//
// La valeur à définir est non-NULL,
// par conséquent, nous devons comparer avec l'analyse actuelle
// si c'est identique, supprimer l'analyse actuelle
// en cas de différence, ne pas toucher à l'analyse.
// Mettre simplement à jour les informations de configuration.
//
// Laisser comme exercice pour le responsable de la mise en œuvre.
//
}

if ( pConfigInfo != NULL ) {

__try {
(*(pSceCbInfo->pfFreeInfo))((PVOID)pConfigInfo);
} __except (EXCEPTION_EXECUTE_HANDLER) {
}
}
pConfigInfo = NULL;

if ( pAnaInfo != NULL ) {

__try {
(*(pSceCbInfo->pfFreeInfo))((PVOID)pAnaInfo);

} __except (EXCEPTION_EXECUTE_HANDLER) {
}
}
PAnalInfo = NULL;

}
//
// nettoyage d'erreur
// définir des messages d'erreur détaillés de façon appropriée si le tampon
// n'est pas NULL
//
return retCode;

}

<< 1 2 3 4 >>

Dernière mise à jour le lundi 20 mars 2000