顯示事件收集器訂閱的狀態
您可以顯示事件收集器訂用帳戶的狀態。 狀態包括訂用帳戶的可用性、訂閱發生的最後一個錯誤、上次錯誤的時間,以及下次重試訂閱的時間。
注意
您可以使用此範例來顯示訂用帳戶的狀態,或在命令提示字元中輸入下列命令:
wecutil gr SubscriptionName
您需要訂用帳戶的名稱才能顯示其狀態。 若要列出本機電腦上的目前訂用帳戶名稱,您可以使用清單事件收集器訂閱中顯示的C++範例,或在命令提示字元中輸入下列命令:
wecutil es
下列範例會遵循程式來顯示事件收集器訂用帳戶的狀態:
顯示事件收集器訂用帳戶的狀態
- 提供訂用帳戶名稱和訪問許可權作為 EcOpenSubscription 函式的參數,以開啟訂用帳戶。 如需訪問許可權的詳細資訊,請參閱 Windows 事件收集器常數。
- 呼叫 EcGetSubscriptionRunTimeStatus 函式來取得訂用帳戶的狀態(呼叫函式時不要指定事件來源)。
- 呼叫 EcGetSubscriptionRunTimeStatus 函式並傳入 EcSubscriptionRunTimeStatusEventSources 旗標,以取得訂用帳戶的事件來源數位。
- 呼叫 EcGetSubscriptionRunTimeStatus 函式並傳入事件來源名稱,以取得每個事件來源的狀態資訊。 如需可擷取之狀態資訊的詳細資訊,請參閱 EC_SUBSCRIPTION_RUNTIME_STATUS_INFO_ID 列舉。
- 列印訂閱的狀態資訊。
- 呼叫 EcClose 函式以關閉訂用帳戶。
下列C++程式代碼範例示範如何顯示事件收集器訂用帳戶的狀態。
#include <iostream>
using namespace std;
#include <windows.h>
#include <EvColl.h>
#include <vector>
#include <string>
#include <strsafe.h>
#pragma comment(lib, "wecapi.lib")
// Track Runtime Status
typedef struct _RUNTIME_STATUS
{
std::wstring ActiveStatus;
DWORD LastError;
std::wstring LastErrorMessage;
std::wstring NextRetryTime;
} RUNTIME_STATUS;
// Subscription Information
DWORD GetStatus(LPCWSTR subscriptionName,
LPCWSTR eventSource,
EC_SUBSCRIPTION_RUNTIME_STATUS_INFO_ID statusInfoID,
DWORD flags,
std::vector<BYTE>& buffer,
PEC_VARIANT& vStatus);
std::wstring ConvertEcDateTime( ULONGLONG code );
void __cdecl wmain()
{
LPVOID lpwszBuffer;
DWORD dwEventSourceCount, dwRetVal = ERROR_SUCCESS;
std::vector<BYTE> buffer;
std::vector<BYTE> eventSourceBuffer;
std::vector<BYTE>::iterator sourceNameIterator;
PEC_VARIANT vStatus, vEventSources;
EC_HANDLE hSubscription;
LPCWSTR lpSubname = L"TestSubscription";
RUNTIME_STATUS runtimeStatus;
std::wstring eventSource;
// Step 1: Open the Event Collector subscription.
hSubscription = EcOpenSubscription(lpSubname,
EC_READ_ACCESS,
EC_OPEN_EXISTING);
if (!hSubscription)
{
dwRetVal = GetLastError();
goto Cleanup;
}
// Get the status values for the entire subscription.
dwRetVal = GetStatus(lpSubname, NULL,
EcSubscriptionRunTimeStatusActive,
0,
buffer,
vStatus);
if (ERROR_SUCCESS != dwRetVal) {
goto Cleanup;
}
wprintf(L"\nEvent Subscription: %s\n", lpSubname);
// Convert the status value to text.
switch (vStatus->UInt32Val)
{
case EcRuntimeStatusActiveStatusActive:
runtimeStatus.ActiveStatus = L"Active";
break;
case EcRuntimeStatusActiveStatusDisabled:
runtimeStatus.ActiveStatus = L"Disabled";
break;
case EcRuntimeStatusActiveStatusInactive:
runtimeStatus.ActiveStatus = L"Inactive";
break;
case EcRuntimeStatusActiveStatusTrying:
runtimeStatus.ActiveStatus = L"Trying";
break;
default:
runtimeStatus.ActiveStatus = L"Unknown Status";
break;
}
wprintf(L"Runtime Status: %s\n", runtimeStatus.ActiveStatus.c_str());
dwRetVal = GetStatus(lpSubname, NULL,
EcSubscriptionRunTimeStatusLastError,
0,
buffer,
vStatus);
if (ERROR_SUCCESS != dwRetVal) {
goto Cleanup;
}
wprintf(L"Last Error: %u\n", vStatus->UInt32Val);
// Step 2: Get the event sources array to query for event source status.
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;
// Step 3: Get the status of each event source.
for (DWORD I = 0; I < dwEventSourceCount ; I++)
{
eventSource = vEventSources->StringArr[I];
// Get the status of the subscription event source.
dwRetVal = GetStatus(lpSubname,
eventSource.c_str(),
EcSubscriptionRunTimeStatusActive,
0,
buffer,
vStatus);
if (ERROR_SUCCESS != dwRetVal)
{
goto Cleanup;
}
if (vStatus->Type != EcVarTypeUInt32)
{
dwRetVal = ERROR_INVALID_DATA;
goto Cleanup;
}
// Convert the status value to text.
switch (vStatus->UInt32Val)
{
case EcRuntimeStatusActiveStatusActive:
runtimeStatus.ActiveStatus = L"Active";
break;
case EcRuntimeStatusActiveStatusDisabled:
runtimeStatus.ActiveStatus = L"Disabled";
break;
case EcRuntimeStatusActiveStatusInactive:
runtimeStatus.ActiveStatus = L"Inactive";
break;
case EcRuntimeStatusActiveStatusTrying:
runtimeStatus.ActiveStatus = L"Trying";
break;
default:
runtimeStatus.ActiveStatus = L"Unknown Status";
break;
}
// Get the last error that occurred for the subscription.
dwRetVal = GetStatus(lpSubname,
eventSource.c_str(),
EcSubscriptionRunTimeStatusLastError,
0,
buffer,
vStatus);
if(ERROR_SUCCESS != dwRetVal)
{
goto Cleanup;
}
if (vStatus->Type != EcVarTypeUInt32)
{
dwRetVal = ERROR_INVALID_DATA;
goto Cleanup;
}
runtimeStatus.LastError = vStatus->UInt32Val;
// Get the error message for the last error.
dwRetVal = GetStatus(lpSubname,
eventSource.c_str(),
EcSubscriptionRunTimeStatusLastErrorMessage,
0,
buffer,
vStatus);
if (ERROR_SUCCESS != dwRetVal)
{
goto Cleanup;
}
if (vStatus->Type != EcVarTypeNull && vStatus->Type != EcVarTypeString)
{
dwRetVal = ERROR_INVALID_DATA;
goto Cleanup;
}
if (vStatus->Type != EcVarTypeNull)
{
runtimeStatus.LastErrorMessage = vStatus->StringVal;
}
else
{
runtimeStatus.LastErrorMessage = L"";
}
// Get the time when the subscription will be retried.
dwRetVal = GetStatus( lpSubname,
eventSource.c_str(),
EcSubscriptionRunTimeStatusNextRetryTime,
0,
buffer,
vStatus);
if( ERROR_SUCCESS != dwRetVal)
{
goto Cleanup;
}
if (vStatus->Type != EcVarTypeNull && vStatus->Type != EcVarTypeDateTime)
{
dwRetVal = ERROR_INVALID_DATA;
goto Cleanup;
}
if( vStatus->Type != EcVarTypeNull)
{
runtimeStatus.NextRetryTime = ConvertEcDateTime(vStatus->DateTimeVal);
}
else
{
runtimeStatus.NextRetryTime = L"";
}
// Step 4: Print the status information.
wprintf(L"\nEventSource[%u]\n", I);
wprintf(L" Address: %s\n", eventSource.c_str());
wprintf(L" Runtime Status: %s\n", runtimeStatus.ActiveStatus.c_str());
wprintf(L" Last Error: %u\n", runtimeStatus.LastError);
if( 0 != runtimeStatus.LastError )
{
wprintf(L" Last Error Message: %s\n", runtimeStatus.LastErrorMessage.c_str());
}
else
{
wprintf(L" Last Error Message: No Error\n");
}
wprintf(L" Next Retry Time: %s\n", runtimeStatus.NextRetryTime.c_str());
}
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);
}
}
// 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;
}
std::wstring ConvertEcDateTime( ULONGLONG code )
{
FILETIME ft;
SYSTEMTIME utcTime;
SYSTEMTIME localTime;
std::wstring timeString;
std::vector<WCHAR> buffer(30);
timeString = L"Error- Failed to Convert Date Time to String";
ft.dwHighDateTime = (DWORD)((code >> 32) & 0xFFFFFFFF);
ft.dwLowDateTime = (DWORD)(code & 0xFFFFFFFF);
if( !FileTimeToSystemTime( &ft, &utcTime) )
{
return timeString;
}
if(!SystemTimeToTzSpecificLocalTime(NULL, &utcTime, &localTime))
{
return timeString;
}
HRESULT hr = StringCchPrintfW((LPWSTR) &buffer[0],
buffer.size(),
L"%4.4hd-%2.2hd-%2.2hdT%2.2hd:%2.2hd:%2.2hd.%3.3hdZ",
localTime.wYear,
localTime.wMonth,
localTime.wDay,
localTime.wHour,
localTime.wMinute,
localTime.wSecond,
localTime.wMilliseconds);
if (FAILED(hr))
{
return timeString;
}
timeString = (LPWSTR) &buffer[0];
return timeString;
}
相關主題