コレクターによって開始されるサブスクリプションへのイベント ソースの追加
イベント サブスクリプションから転送されたイベントを受信するには、ローカル コンピューターでコレクターによって開始されるサブスクリプションを作成します。 コレクターによって開始されるサブスクリプションを作成する方法の詳細については、「イベント コレクター サブスクリプションの作成」に記載されている C++ コード サンプルを参照してください。
コレクターによって開始されるサブスクリプションが作成されたら、イベント ソースをサブスクリプションに追加できます。 イベントを収集するには、少なくとも 1 つのイベント ソースをサブスクリプションに追加する必要があります。
Note
このコード サンプルを使用して、サブスクリプションにイベント ソースを追加することも、コマンド プロンプトで次のコマンドを入力することもできます。
wecutil ss SubscriptionName **/esa:**EventSourceAddress /aes /ese
EventSourceAddress には、ローカル コンピューターのローカルホストかリモート コンピューターの完全修飾ドメイン名を指定できます。
ソースによって開始されるサブスクリプションにイベント ソースを追加する方法の詳細については、「ソースによって開始されるサブスクリプションの設定」を参照してください。
この例では、コレクターによって開始されるサブスクリプションにイベント ソースを追加する一連の手順に従います。
コレクターによって開始されるサブスクリプションにイベント ソースを追加するには
- EcOpenSubscription 関数のパラメーターとしてサブスクリプション名とアクセス権を指定して、既存のサブスクリプションを開きます。 アクセス権の詳細については、「Windows イベント コレクター定数」を参照してください。
- EcGetSubscriptionProperty 関数を呼び出して、サブスクリプションのイベント ソース配列を取得します。 取得できるサブスクリプション プロパティの詳細については、EC_SUBSCRIPTION_PROPERTY_ID リストを参照してください。
- EcInsertObjectArrayElement 関数を呼び出して、サブスクリプションのイベント ソース配列に新しいイベント ソースを追加します。
- イベント ソースのプロパティを設定するには、EcSetObjectArrayProperty 関数を呼び出します。 EcSubscriptionEventSourceAddress プロパティは、ローカル コンピューター (ローカルホスト) のアドレスまたはリモート コンピューターの完全修飾ドメイン名に設定されます。 設定できるイベント ソース プロパティの詳細については、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;
}
関連トピック