Repetição de uma assinatura do Coletor de Eventos
Se ocorrer um problema com uma origem do evento associada a uma assinatura do Coletor de Eventos, você poderá repetir a assinatura depois que o problema tiver sido resolvido.
Observação
Você pode usar este exemplo para repetir uma assinatura ou digitar o seguinte comando no prompt de comando:
wecutil rs SubscriptionName
Você precisará do nome de uma assinatura para repeti-la. 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
Este exemplo mostra como repetir individualmente cada fonte de evento de uma assinatura iniciada pelo coletor e como repetir uma assinatura iniciada pela origem.
O exemplo de código a seguir segue um procedimento para repetir todas as fontes de evento de uma assinatura do Coletor de Eventos.
Para repetir uma assinatura do Coletor de Eventos
- 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.
- Repita a origem do evento chamando a função EcRetrySubscription .
- Feche a assinatura chamando a função EcClose.
O exemplo de código C++ a seguir mostra como repetir 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 GetProperty(EC_HANDLE hSubscription,
EC_SUBSCRIPTION_PROPERTY_ID propID,
DWORD flags,
std::vector<BYTE>& buffer,
PEC_VARIANT& vProperty);
DWORD GetStatus(LPCWSTR subscriptionName,
LPCWSTR eventSource,
EC_SUBSCRIPTION_RUNTIME_STATUS_INFO_ID statusInfoID,
DWORD flags,
std::vector<BYTE>& buffer,
PEC_VARIANT& vStatus);
void __cdecl wmain()
{
LPVOID lpwszBuffer;
DWORD dwRetVal, dwEventSourceCount;
EC_HANDLE hSubscription;
PEC_VARIANT vProperty, vEventSources;
std::vector<BYTE> buffer, eventSourceBuffer;
LPCWSTR lpSubname = L"SourceInit";
// Step 1: Open the Event Collector subscription.
hSubscription = EcOpenSubscription(lpSubname,
EC_READ_ACCESS,
EC_OPEN_EXISTING);
if (!hSubscription)
{
dwRetVal = GetLastError();
goto Cleanup;
}
// Determine if the subscription is source initiated or
// collector initiated.
dwRetVal = GetProperty(hSubscription,
EcSubscriptionType,
0,
buffer,
vProperty);
if (ERROR_SUCCESS != dwRetVal){
goto Cleanup;
}
if( vProperty->Type != EcVarTypeNull && vProperty->Type != EcVarTypeUInt32)
{
dwRetVal = ERROR_INVALID_DATA;
goto Cleanup;
}
if( vProperty->UInt32Val == EcSubscriptionTypeSourceInitiated)
{
// Retry the subscription (event source parameter is NULL,
// so the entire subscription is retried).
if (!EcRetrySubscription(lpSubname, NULL, 0))
{
dwRetVal = GetLastError();
goto Cleanup;
}
wprintf(L"\nThe subscription was retried.\n");
}
else if ( vProperty->UInt32Val == EcSubscriptionTypeCollectorInitiated)
{
// Get the event sources array to retry each event source.
dwRetVal = GetStatus(lpSubname, NULL,
EcSubscriptionRunTimeStatusEventSources,
0,
eventSourceBuffer,
vEventSources);
if (ERROR_SUCCESS != dwRetVal){
goto Cleanup;
}
// Ensure that a handle to the event sources array has been obtained.
if (vEventSources->Type != EcVarTypeNull &&
vEventSources->Type != (EcVarTypeString | EC_VARIANT_TYPE_ARRAY) )
{
dwRetVal = ERROR_INVALID_DATA;
goto Cleanup;
}
dwEventSourceCount = vEventSources->Count;
for (DWORD I = 0; I < dwEventSourceCount ; I++)
{
LPCWSTR eventSource = vEventSources->StringArr[I];
if (!eventSource)
continue;
// Retry the event source.
if (!EcRetrySubscription(lpSubname, eventSource, 0))
{
dwRetVal = GetLastError();
goto Cleanup;
}
}
wprintf(L"\nEach event source was retried.\n");
}
Cleanup:
// Step 5: Close the subscription.
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 GetProperty(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;
}
// Get the information for the specified EC_SUBSCRIPTION_RUNTIME_STATUS_INFO_ID
DWORD GetStatus(LPCWSTR subscriptionName,
LPCWSTR eventSource,
EC_SUBSCRIPTION_RUNTIME_STATUS_INFO_ID statusInfoID,
DWORD flags,
std::vector<BYTE>& buffer,
PEC_VARIANT& vStatus)
{
DWORD dwBufferSize, dwRetVal = ERROR_SUCCESS;
buffer.clear();
buffer.resize(sizeof(EC_VARIANT));
if ( !EcGetSubscriptionRunTimeStatus( subscriptionName,
statusInfoID,
eventSource,
flags,
(DWORD) buffer.size(),
(PEC_VARIANT) &buffer[0],
&dwBufferSize))
{
dwRetVal = GetLastError();
if( ERROR_INSUFFICIENT_BUFFER == dwRetVal)
{
dwRetVal = ERROR_SUCCESS;
buffer.resize(dwBufferSize);
if(!EcGetSubscriptionRunTimeStatus( subscriptionName,
statusInfoID,
eventSource,
flags,
(DWORD) buffer.size(),
(PEC_VARIANT) &buffer[0],
&dwBufferSize))
{
dwRetVal = GetLastError();
}
}
}
if ( ERROR_SUCCESS == dwRetVal)
{
vStatus = (PEC_VARIANT) &buffer[0];
}
else
{
vStatus = NULL;
}
return dwRetVal;
}
Tópicos relacionados