수집기 시작 구독에 이벤트 원본 추가
이벤트 구독에서 전달된 이벤트를 받으려면 로컬 컴퓨터에서 수집기 시작 구독을 만들 수 있습니다. 수집기 시작 구독을 만드는 방법에 대한 자세한 내용은 이벤트 수집기 구독 만들기에 표시된 C++ 코드 예제를 참조하세요.
수집기 시작 구독을 만든 후 구독에 이벤트 원본을 추가할 수 있습니다. 이벤트를 수집하려면 구독에 이벤트 원본을 하나 이상 추가해야 합니다.
참고 항목
이 코드 예제를 사용하여 구독에 이벤트 원본을 추가하거나 명령 프롬프트에서 다음 명령을 입력할 수 있습니다.
wecutil ss SubscriptionName **/esa:**EventSourceAddress /aes /ese
EventSourceAddress 는 로컬 컴퓨터의 localhost이거나 원격 컴퓨터의 정규화된 도메인 이름일 수 있습니다.
원본 시작 구독에 이벤트 원본을 추가하는 방법에 대한 자세한 내용은 원본 시작 구독 설정을 참조 하세요.
이 예제에서는 수집기 시작 구독에 이벤트 원본을 추가하는 일련의 단계를 따릅니다.
수집기 시작 구독에 이벤트 원본을 추가하려면
- EcOpenSubscription 함수에 대한 매개 변수로 구독 이름 및 액세스 권한을 제공하여 기존 구독을 엽니다. 액세스 권한에 대한 자세한 내용은 Windows 이벤트 수집기 상수를 참조 하세요.
- EcGetSubscriptionProperty 함수를 호출하여 구독의 이벤트 원본 배열을 가져옵니다. 검색할 수 있는 구독 속성에 대한 자세한 내용은 EC_SUBSCRIPTION_PROPERTY_ID 열거형을 참조하세요.
- EcInsertObjectArrayElement 함수를 호출하여 구독의 이벤트 원본 배열에 새 이벤트 원본을 추가합니다.
- EcSetObjectArrayProperty 함수를 호출하여 이벤트 원본 속성을 설정합니다. EcSubscriptionEventSourceAddress 속성은 로컬 컴퓨터(Localhost)의 주소 또는 원격 컴퓨터의 정규화된 도메인 이름으로 설정됩니다. 설정할 수 있는 이벤트 원본 속성에 대한 자세한 내용은 EC_SUBSCRIPTION_PROPERTY_ID 열거형을 참조하세요.
- EcSaveSubscription 함수를 호출하여 구독을 저장합니다.
- EcClose 함수를 호출하여 구독을 닫습니다.
다음 C++ 코드 예제에서는 수집기 시작 구독에 이벤트 원본을 추가하는 방법을 보여줍니다.
#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;
}
관련 항목