Agregar un origen de eventos a una suscripción iniciada por el recopilador
Para recibir un evento reenviado de una suscripción de eventos, puede crear una suscripción iniciada por el recopilador en el equipo local. Para obtener más información sobre cómo crear una suscripción iniciada por el recopilador, vea el ejemplo de código de C++ que aparece en Creación de una suscripción del recopilador de eventos.
Una vez creada la suscripción iniciada por el recopilador, puede agregar los orígenes de eventos a la suscripción. Debe agregar al menos un origen de eventos a una suscripción para recopilar eventos.
Nota:
Puede usar este ejemplo de código para agregar un origen de eventos a una suscripción o puede escribir el siguiente comando en el símbolo del sistema:
wecutil ss SubscriptionName **/esa:**EventSourceAddress /aes /ese
EventSourceAddress puede ser el host local del equipo local o un nombre de dominio completo en un equipo remoto.
Para obtener más información sobre cómo agregar orígenes de eventos a una suscripción iniciada por el origen, consulte Configuración de una suscripción iniciada por el origen.
En este ejemplo se sigue una serie de pasos para agregar un origen de eventos a una suscripción iniciada por el recopilador.
Cómo agregar un origen de eventos a una suscripción iniciada por el recopilador
- Abra la suscripción existente facilitando el nombre de la suscripción y los derechos de acceso como parámetros a la función EcOpenSubscription. Para obtener más información sobre los derechos de acceso, consulte Constantes del recopilador de eventos de Windows.
- Obtenga el grupo de orígenes de eventos de la suscripción llamando a la función EcGetSubscriptionProperty. Para obtener más información sobre las propiedades de suscripción que se pueden recuperar, consulte la enumeración EC_SUBSCRIPTION_PROPERTY_ID.
- Agregue un nuevo origen de eventos al grupo de orígenes de eventos de la suscripción llamando a la función EcInsertObjectArrayElement.
- Cree las propiedades de origen del evento llamando a la función EcSetObjectArrayProperty. La propiedad EcSubscriptionEventSourceAddress se establece en una dirección del equipo local (Localhost) o en un nombre de dominio completo en un equipo remoto. Para obtener más información sobre las propiedades de orígenes de eventos que se pueden crear, consulte la enumeración EC_SUBSCRIPTION_PROPERTY_ID.
- Guarde la suscripción llamando a la función EcSaveSubscription.
- Cierre la suscripción llamando a la función EcClose.
En el ejemplo de código de C++ siguiente se refleja cómo agregar un origen de eventos a una suscripción iniciada por el recopilador:
#include <windows.h>
#include <iostream>
using namespace std;
#include <EvColl.h>
#include <vector>
#include <string>
#include <strsafe.h>
#pragma comment(lib, "wecapi.lib")
DWORD GetProperty(EC_HANDLE hSubscription,
EC_SUBSCRIPTION_PROPERTY_ID propID,
DWORD flags,
std::vector<BYTE>& buffer,
PEC_VARIANT& vProperty);
void __cdecl wmain()
{
EC_HANDLE hSubscription;
std::wstring eventSource = L"localhost";
BOOL status = true;
std::wstring eventSourceUserName;
std::wstring eventSourcePassword;
LPCWSTR lpSubname = L"TestSubscription-CollectorInitiated";
DWORD dwEventSourceCount;
DWORD dwRetVal = ERROR_SUCCESS;
PEC_VARIANT vEventSource = NULL;
std::vector<BYTE> buffer;
LPVOID lpwszBuffer;
EC_VARIANT vProperty;
// Create a handle to access the event sources array.
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 add a new event
// source to the subscription.
dwRetVal = GetProperty(hSubscription,
EcSubscriptionEventSources,
0,
buffer,
vEventSource);
if (ERROR_SUCCESS != dwRetVal)
{
goto Cleanup;
}
// Ensure that a handle to the event sources array has been obtained.
if (vEventSource->Type != EcVarTypeNull &&
vEventSource->Type != EcVarObjectArrayPropertyHandle)
{
dwRetVal = ERROR_INVALID_DATA;
goto Cleanup;
}
hArray = (vEventSource->Type == EcVarTypeNull)? NULL:
vEventSource->PropertyHandleVal;
if(!hArray)
{
dwRetVal = ERROR_INVALID_DATA;
goto Cleanup;
}
if (!EcGetObjectArraySize(hArray, &dwEventSourceCount))
{
dwRetVal = GetLastError();
goto Cleanup;
}
// Step 3: Add a new event source to the event source array.
if (!EcInsertObjectArrayElement(hArray,
dwEventSourceCount))
{
dwRetVal = GetLastError();
goto Cleanup;
}
// Step 4: Set the properties of the event source
// Set the EventSourceAddress property that specifies the address
// of the event forwarding computer, this property can be localhost
// or a fully-qualified domain name.
vProperty.Type = EcVarTypeString;
vProperty.StringVal = eventSource.c_str();
if (!EcSetObjectArrayProperty( hArray,
EcSubscriptionEventSourceAddress,
dwEventSourceCount,
0,
&vProperty))
{
dwRetVal = GetLastError();
goto Cleanup;
}
// Get the credentials.
wcout << "Enter credentials used to connect to the event source " <<
eventSource << ". " << endl <<
"Enter user name: " << endl;
wcin >> eventSourceUserName;
cout << "Enter password: " << endl;
wchar_t c;
while( (c = _getwch()) && c != '\n' && c != '\r' && eventSourcePassword.length() < 512)
{eventSourcePassword.append(1, c);}
// Set the EventSourceUserName property that specifies the user
// that can retrieve events from the event source.
if (eventSourceUserName.length() > 0)
{
vProperty.Type = EcVarTypeString;
vProperty.StringVal = eventSourceUserName.c_str();
if (!EcSetObjectArrayProperty(hArray,
EcSubscriptionEventSourceUserName,
dwEventSourceCount,
0,
&vProperty))
{
dwRetVal = GetLastError();
goto Cleanup;
}
// Set the EventSourcePassword property that defines the password
// for the previously-defined user.
vProperty.StringVal = (eventSourcePassword.length() > 0) ?
eventSourcePassword.c_str() : L"";
if (!EcSetObjectArrayProperty(hArray,
EcSubscriptionEventSourcePassword,
dwEventSourceCount,
0,
&vProperty))
{
dwRetVal = GetLastError();
goto Cleanup;
}
}
// When you have finished using the credentials,
// erase them.
eventSourceUserName.erase();
eventSourcePassword.erase();
// Set the EventSourceEnabled property that enables the event source
// to forward events.
vProperty.Type = EcVarTypeBoolean;
vProperty.BooleanVal = status;
if (!EcSetObjectArrayProperty(hArray,
EcSubscriptionEventSourceEnabled,
dwEventSourceCount,
0,
&vProperty))
{
dwRetVal = GetLastError();
goto Cleanup;
}
// Step 5: Save the subscription to enable 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\n Error Code from FormatMessage: %u\n", dwRetVal, GetLastError());
return;
}
wprintf(L"\nFailed to Perform Operation. Error Code: %u\n 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;
}
Temas relacionados