Suppression d'une source d'événement d'un abonnement initié par un collecteur
Vous pouvez supprimer une source d'événement d'un abonnement initié par un collecteur sans supprimer l'ensemble de l'abonnement. Vous devez connaître l'adresse de la source d'événements que vous souhaitez supprimer Vous pouvez trouver l'adresse d'une source d'événements associée à un abonnement en utilisant l'exemple C++ présenté dans Affichage des propriétés d'un abonnement à un collecteur d'événements, ou vous pouvez taper la commande suivante à l'invite de commande :
wecutil gs SubscriptionName
Pour répertorier les abonnements en cours sur un ordinateur local, vous pouvez utiliser l'exemple de code C++ présenté dans la section Liste des abonnements au collecteur d'événements ou taper la commande suivante à l'invite de commande :
wecutil es
Remarque
Vous pouvez utiliser cet exemple pour supprimer une source d'événement d'un abonnement lancé par un collecteur ou vous pouvez taper la commande suivante à l'invite de commande :
wecutil ss SubscriptionName **/esa:**EventSourceAddress /res
EventSourceAddress peut être soit localhost pour l'ordinateur local, soit un nom de domaine entièrement qualifié pour un ordinateur distant.
Cet exemple suit une série d'étapes pour supprimer une source d'événement d'un abonnement initié par un collecteur
Pour supprimer une source d'événement d'un abonnement initié par un collecteur
- Ouvrez l'abonnement existant en fournissant le nom de l'abonnement et les droits d'accès en tant que paramètres de la fonction EcOpenSubscription. Pour plus d'informations sur les droits d'accès, reportez-vous à la section Constantes du collecteur d'événements Windows.
- Obtenez le tableau des sources d'événements de l'abonnement en appelant la fonction EcGetSubscriptionProperty. Pour plus d'informations sur les propriétés d'abonnement pouvant être récupérées, reportez-vous à l'énumération EC_SUBSCRIPTION_PROPERTY_ID.
- Recherchez la source d'événement spécifiée dans le tableau des sources d'événements de l'abonnement en appelant la fonction EcGetObjectArrayProperty. La valeur de la propriété EcSubscriptionEventSourceAddress sera soit Localhost pour l'ordinateur local, soit un nom de domaine complet pour un ordinateur distant. Pour plus d'informations sur les propriétés de la source d'événement qui peuvent être récupérées, voir l'énumération EC_SUBSCRIPTION_PROPERTY_ID.
- Supprimez la source d'événement de l'abonnement en appelant la fonction EcRemoveObjectArrayElement.
- Enregistrez l'abonnement en appelant la fonction EcSaveSubscription.
- Fermez l'abonnement en appelant la fonction EcClose.
L'exemple de code C++ suivant montre comment supprimer une source d'événements d'un abonnement à Event Collector.
#include <windows.h>
#include <EvColl.h>
#include <vector>
#include <string>
#include <strsafe.h>
#pragma comment(lib, "wecapi.lib")
// Subscription Information
DWORD GetSubscriptionProperty(EC_HANDLE hSubscription,
EC_SUBSCRIPTION_PROPERTY_ID propID,
DWORD flags,
std::vector<BYTE>& buffer,
PEC_VARIANT& vProperty);
DWORD GetEventSourceProperty(EC_OBJECT_ARRAY_PROPERTY_HANDLE hArray,
EC_SUBSCRIPTION_PROPERTY_ID propID,
DWORD arrayIndex,
DWORD flags,
std::vector<BYTE>& buffer,
PEC_VARIANT& vProper);
void __cdecl wmain()
{
EC_HANDLE hSubscription;
std::wstring eventSource = L"localhost";
BOOL foundEventSource = false;
LPCWSTR lpSubname = L"TestSubscription-CollectorInitiated";
DWORD dwEventSourceCount;
DWORD deleteEvent = 0;
DWORD dwRetVal = ERROR_SUCCESS;
PEC_VARIANT vProperty = NULL;
std::vector<BYTE> buffer;
LPVOID lpwszBuffer;
EC_OBJECT_ARRAY_PROPERTY_HANDLE hArray = NULL;
// Step 1: Open an existing subscription.
hSubscription = EcOpenSubscription(lpSubname,
EC_READ_ACCESS | EC_WRITE_ACCESS,
EC_OPEN_EXISTING);
if (!hSubscription)
{
dwRetVal = GetLastError();
goto Cleanup;
}
// Step 2: Get the event sources array to remove an event
// source from the subscription.
dwRetVal = GetSubscriptionProperty(hSubscription,
EcSubscriptionEventSources,
0,
buffer,
vProperty);
if (ERROR_SUCCESS != dwRetVal)
{
goto Cleanup;
}
// Ensure that a handle to the event sources array has been obtained.
if (vProperty->Type != EcVarTypeNull &&
vProperty->Type != EcVarObjectArrayPropertyHandle)
{
dwRetVal = ERROR_INVALID_DATA;
goto Cleanup;
}
hArray = (vProperty->Type == EcVarTypeNull)? NULL:
vProperty->PropertyHandleVal;
if (!hArray)
{
dwRetVal = ERROR_INVALID_DATA;
goto Cleanup;
}
if (!EcGetObjectArraySize(hArray, &dwEventSourceCount))
{
dwRetVal = GetLastError();
goto Cleanup;
}
// Step 3: Search for the specified event source in the event source array.
for (DWORD I = 0; I < dwEventSourceCount; I++)
{
dwRetVal = GetEventSourceProperty(hArray,
EcSubscriptionEventSourceAddress,
I,
0,
buffer,
vProperty);
if (ERROR_SUCCESS != dwRetVal)
{
goto Cleanup;
}
if (vProperty->StringVal == eventSource)
{
foundEventSource = true;
deleteEvent = I;
break;
}
}
// Step 4: If the event source was found in the array, remove it.
if (foundEventSource)
{
if (!EcRemoveObjectArrayElement(hArray, deleteEvent))
{
dwRetVal = GetLastError();
goto Cleanup;
}
}
else
{
wprintf(L"Could not remove the event source from the subscription.\n");
goto Cleanup;
}
// Step 5: Save the subscription to finalize the removal of the event source.
if( !EcSaveSubscription(hSubscription, NULL) )
{
dwRetVal = GetLastError();
goto Cleanup;
}
// Step 6: Close the subscription.
Cleanup:
if (hArray)
EcClose(hArray);
if (hSubscription)
EcClose(hSubscription);
if (dwRetVal != ERROR_SUCCESS)
{
FormatMessageW( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
dwRetVal,
0,
(LPWSTR) &lpwszBuffer,
0,
NULL);
if (!lpwszBuffer)
{
wprintf(L"Failed to FormatMessage. Operation Error Code: %u." \
L"Error Code from FormatMessage: %u\n", dwRetVal, GetLastError());
return;
}
wprintf(L"\nFailed to Perform Operation.\nError Code: %u\n" \
L"Error Message: %s\n", dwRetVal, lpwszBuffer);
LocalFree(lpwszBuffer);
}
}
DWORD GetSubscriptionProperty(EC_HANDLE hSubscription,
EC_SUBSCRIPTION_PROPERTY_ID propID,
DWORD flags,
std::vector<BYTE>& buffer,
PEC_VARIANT& vProperty)
{
DWORD dwBufferSize, dwRetVal = ERROR_SUCCESS;
buffer.resize(sizeof(EC_VARIANT));
if (!hSubscription)
return ERROR_INVALID_PARAMETER;
// Get the value for the specified property.
if (!EcGetSubscriptionProperty(hSubscription,
propID,
flags,
(DWORD) buffer.size(),
(PEC_VARIANT)&buffer[0],
&dwBufferSize))
{
dwRetVal = GetLastError();
if (ERROR_INSUFFICIENT_BUFFER == dwRetVal)
{
dwRetVal = ERROR_SUCCESS;
buffer.resize(dwBufferSize);
if (!EcGetSubscriptionProperty(hSubscription,
propID,
flags,
(DWORD) buffer.size(),
(PEC_VARIANT)&buffer[0],
&dwBufferSize))
{
dwRetVal = GetLastError();
}
}
}
if (dwRetVal == ERROR_SUCCESS)
{
vProperty = (PEC_VARIANT) &buffer[0];
}
else
{
vProperty = NULL;
}
return dwRetVal;
}
DWORD GetEventSourceProperty(EC_OBJECT_ARRAY_PROPERTY_HANDLE hArray,
EC_SUBSCRIPTION_PROPERTY_ID propID,
DWORD arrayIndex,
DWORD flags,
std::vector<BYTE>& buffer,
PEC_VARIANT& vProperty)
{
UNREFERENCED_PARAMETER(flags);
UNREFERENCED_PARAMETER(propID);
DWORD dwBufferSize, dwRetVal = ERROR_SUCCESS;
buffer.resize(sizeof(EC_VARIANT));
if (!hArray)
return ERROR_INVALID_PARAMETER;
// Obtain the value for the specified property.
if (!EcGetObjectArrayProperty(hArray,
EcSubscriptionEventSourceAddress,
arrayIndex,
0,
(DWORD) buffer.size(),
(PEC_VARIANT)&buffer[0],
&dwBufferSize))
{
dwRetVal = GetLastError();
if (ERROR_INSUFFICIENT_BUFFER == dwRetVal)
{
dwRetVal = ERROR_SUCCESS;
buffer.resize(dwBufferSize);
if (!EcGetObjectArrayProperty(hArray,
EcSubscriptionEventSourceAddress,
arrayIndex,
0,
(DWORD) buffer.size(),
(PEC_VARIANT)&buffer[0],
&dwBufferSize))
{
dwRetVal = GetLastError();
}
}
}
if (dwRetVal == ERROR_SUCCESS)
{
vProperty = (PEC_VARIANT) &buffer[0];
}
else
{
vProperty = NULL;
}
return dwRetVal;
}
Rubriques connexes