イベント コレクター サブスクリプションの再試行
イベント コレクター サブスクリプションに関連付けられているイベント ソースで問題が発生した場合は、問題の解決後にサブスクリプションを再試行できます。
Note
この例を使用してサブスクリプションを再試行することも、コマンド プロンプトで次のコマンドを入力することもできます。
wecutil rs SubscriptionName
再試行するにはサブスクリプションの名前が必要です。 ローカル コンピューター上の現在のサブスクリプションの名前を一覧表示するには、「イベント コレクター サブスクリプションの一覧表示」に記載されている C++ コード サンプルを使用するか、コマンド プロンプトで次のコマンドを入力します。
wecutil es
Note
この例では、コレクターによって開始されるサブスクリプションの各イベント ソースを個別に再試行する方法と、ソースによって開始されるサブスクリプションを再試行する方法を示します。
次のコード サンプルでは、イベント コレクター サブスクリプションのすべてのイベント ソースを再試行する手順に従います。
イベント コレクター サブスクリプションを再試行するには
- EcOpenSubscription 関数のパラメーターとしてサブスクリプション名とアクセス権を指定して、サブスクリプションを開きます。 アクセス権の詳細については、「Windows イベント コレクター定数」を参照してください。
- EcRetrySubscription 関数を呼び出してイベント ソースを再試行します。
- EcClose 関数を呼び出してサブスクリプションを閉じます。
次の C++ コード サンプルは、イベント コレクター サブスクリプションを再試行する方法を示しています。
#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;
}
関連トピック