重試事件收集器訂用帳戶
如果與事件收集器訂用帳戶相關聯的事件來源發生問題,您可以在問題解決之後重試訂閱。
注意
您可以使用此範例重試訂用帳戶,或在命令提示字元中輸入下列命令:
wecutil rs SubscriptionName
您需要訂用帳戶的名稱才能重試。 若要列出本機電腦上的目前訂閱名稱,您可以使用列出事件收集器訂閱中顯示的C++程式代碼範例,或在命令提示字元中輸入下列命令:
wecutil es
注意
此範例示範如何個別重試收集器起始訂閱的每個事件來源,以及如何重試來源起始的訂用帳戶。
下列程式代碼範例會遵循程式,以重試事件收集器訂用帳戶的所有事件來源。
重試事件收集器訂用帳戶
- 提供訂用帳戶名稱和訪問許可權作為 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;
}
相關主題