Remoção de uma origem do evento de uma assinatura iniciada pelo coletor
Você pode remover uma origem do evento de uma assinatura iniciada pelo coletor sem excluir a assinatura inteira. Você deve saber o endereço da origem do evento que deseja excluir. Você pode encontrar o endereço de uma fonte de evento associada a uma assinatura usando o exemplo de C++ mostrado em Exibindo as propriedades de uma assinatura do Coletor de Eventos ou pode digitar o seguinte comando no prompt de comando:
wecutil gs SubscriptionName
Para listar os nomes das assinaturas atuais em um computador local, você pode usar o exemplo de código C++ mostrado em Listando assinaturas do Coletor de Eventos ou digitar o seguinte comando no prompt de comando:
wecutil es
Observação
Você pode usar este exemplo para remover uma origem do evento de uma assinatura iniciada pelo coletor ou pode digitar o seguinte comando no prompt de comando:
wecutil ss SubscriptionName **/esa:**EventSourceAddress /res
EventSourceAddress pode ser localhost para o computador local ou um nome de domínio totalmente qualificado para um computador remoto.
Este exemplo segue uma série de etapas para remover uma origem do evento de uma assinatura iniciada pelo coletor.
Para remover uma origem do evento de uma assinatura iniciada pelo coletor
- Abra a assinatura existente fornecendo o nome da assinatura e os direitos de acesso como parâmetros para a função EcOpenSubscription. Para obter mais informações sobre direitos de acesso, consulte Constantes do Coletor de Eventos do Windows.
- Obtenha a matriz de fontes de eventos da assinatura chamando a função EcGetSubscriptionProperty. Para obter mais informações sobre as propriedades de origem do evento que podem ser recuperadas, consulte a enumeração EC_SUBSCRIPTION_PROPERTY_ID.
- Pesquise a fonte de evento especificada na matriz de fontes de eventos da assinatura chamando a função EcGetObjectArrayProperty. O valor da propriedade EcSubscriptionEventSourceAddress será Localhost para o computador local ou será um nome de domínio totalmente qualificado para um computador remoto. Para obter mais informações sobre as propriedades de origem do evento que podem ser recuperadas, consulte a enumeração EC_SUBSCRIPTION_PROPERTY_ID.
- Exclua a fonte do evento da assinatura chamando a função EcRemoveObjectArrayElement.
- Salve a assinatura chamando a função EcSaveSubscription.
- Feche a assinatura chamando a função EcClose.
O exemplo de código C++ a seguir mostra como remover uma origem do evento de uma assinatura do Coletor de Eventos.
#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;
}
Tópicos relacionados