Wiederholen eines Ereignissammlungsabonnements
Wenn ein Problem mit einer Ereignisquelle auftritt, die einem Ereignissammlungsabonnement zugeordnet ist, können Sie das Abonnement wiederholen, nachdem das Problem behoben wurde.
Hinweis
Sie können dieses Beispiel verwenden, um ein Abonnement zu wiederholen, oder Sie können den folgenden Befehl an der Eingabeaufforderung eingeben:
wecutil rs SubscriptionName
Sie benötigen den Namen eines Abonnements, um es erneut zu versuchen. Wenn Sie die Namen der aktuellen Abonnements auf einem lokalen Computer auflisten möchten, können Sie das C++-Codebeispiel in Auflisten von Ereignissammlungsabonnements verwenden, oder Sie können den folgenden Befehl an der Eingabeaufforderung eingeben:
wecutil es
Hinweis
Dieses Beispiel zeigt, wie jede Ereignisquelle eines vom Collector initiierten Abonnements einzeln wiederholt wird und wie ein vom Quellcode initiiertes Abonnement wiederholt wird.
Das folgende Codebeispiel folgt einer Prozedur, um alle Ereignisquellen eines Ereignissammlungsabonnements zu wiederholen.
So wiederholen Sie ein Ereignissammlungsabonnement
- Öffnen Sie das Abonnement, indem Sie den Abonnementnamen und Zugriffsrechte als Parameter für die EcOpenSubscription-Funktion angeben. Weitere Informationen zu Zugriffsrechten finden Sie unter Windows Event Collector-Konstanten.
- Wiederholen Sie die Ereignisquelle, indem Sie die EcRetrySubscription-Funktion aufrufen.
- Schließen Sie das Abonnement, indem Sie die EcClose-Funktion aufrufen.
Das folgende C++-Codebeispiel zeigt, wie Sie ein Ereignissammlungsabonnement wiederholen.
#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;
}
Zugehörige Themen