Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Interfejs API dziennika zdarzeń systemu Windows umożliwia dostęp do danych na komputerze lokalnym lub na komputerze zdalnym. Aby uzyskać dostęp do danych na komputerze zdalnym, należy wywołać funkcję EvtOpenSession, aby utworzyć kontekst sesji zdalnej. Po wywołaniu tej funkcji należy określić nazwę komputera zdalnego, z którym chcesz nawiązać połączenie, poświadczenia użytkownika używane do nawiązywania połączenia oraz typ uwierzytelniania używanego do uwierzytelniania użytkownika. Aby określić bieżącego użytkownika, ustaw elementy członkowskie Domena, Użytkownik i Hasło na wartość NULL.
Podczas wywoływania interfejsu API dziennika zdarzeń systemu Windows należy przekazać dojście do kontekstu sesji zdalnej, który zostanie zwrócony przez funkcję EvtOpenSession. (Aby uzyskać dostęp do danych na komputerze lokalnym, przekaż o wartości NULL, aby określić sesję domyślną). Aby uzyskać dostęp do danych na komputerze zdalnym, komputer zdalny musi włączyć wyjątek Zapory systemu Windows "Zdalne zarządzanie dziennikami zdarzeń"; w przeciwnym razie podczas próby użycia dojścia sesji wywołanie spowoduje błąd z RPC_S_SERVER_UNAVAILABLE. Komputer, z którym się łączysz, musi działać pod kontrolą systemu Windows Vista lub nowszego.
W poniższym przykładzie pokazano, jak nawiązać połączenie z komputerem zdalnym.
#include <windows.h>
#include <stdio.h>
#include <winevt.h>
#pragma comment(lib, "wevtapi.lib")
EVT_HANDLE ConnectToRemote(LPWSTR lpwszRemote);
void EnumProviders(EVT_HANDLE hRemote);
void main(void)
{
EVT_HANDLE hRemote = NULL;
LPWSTR pwsComputerName = L"<name of the remote computer goes here>";
// Enumerate the registered providers on the local computer.
wprintf(L"Registered providers on the local computer\n\n");
EnumProviders(hRemote);
hRemote = ConnectToRemote(pwsComputerName);
if (NULL == hRemote)
{
wprintf(L"Failed to connect to remote computer. Error code is %d.\n", GetLastError());
goto cleanup;
}
// Enumerate the registered providers on the remote computer.
// To access a remote computer, the remote computer must enable
// Remote Event Log Management as an exception in the firewall;
// otherwise, the remote call fails with RPC_S_SERVER_UNAVAILABLE.
wprintf(L"\n\nRegistered providers on the remote computer\n\n");
EnumProviders(hRemote);
cleanup:
if (hRemote)
EvtClose(hRemote);
}
// Create a session context for the remote computer. Set the
// Domain, User, and Password member to NULL to specify
// the current user.
EVT_HANDLE ConnectToRemote(LPWSTR lpwszRemote)
{
EVT_HANDLE hRemote = NULL;
EVT_RPC_LOGIN Credentials;
RtlZeroMemory(&Credentials, sizeof(EVT_RPC_LOGIN));
Credentials.Server = lpwszRemote;
Credentials.Domain = NULL;
Credentials.User = NULL;
Credentials.Password = NULL;
Credentials.Flags = EvtRpcLoginAuthNegotiate;
// This call creates a remote session context; it does not actually
// create a connection to the remote computer. The connection to
// the remote computer happens when you use the context.
hRemote = EvtOpenSession(EvtRpcLogin, &Credentials, 0, 0);
SecureZeroMemory(&Credentials, sizeof(EVT_RPC_LOGIN));
return hRemote;
}
// Enumerate the registered providers on the computer.
void EnumProviders(EVT_HANDLE hRemote)
{
EVT_HANDLE hPublishers = NULL;
WCHAR wszPublisherName[255 + 1];
DWORD dwBufferUsed = 0;
DWORD status = ERROR_SUCCESS;
hPublishers = EvtOpenPublisherEnum(hRemote, 0);
if (NULL == hPublishers)
{
wprintf(L"EvtOpenPublisherEnum failed with %d\n", GetLastError());
goto cleanup;
}
while (true)
{
if (EvtNextPublisherId(hPublishers, sizeof(wszPublisherName)/sizeof(WCHAR), wszPublisherName, &dwBufferUsed))
{
wprintf(L"%s\n", wszPublisherName);
}
else
{
status = GetLastError();
if (ERROR_NO_MORE_ITEMS == status)
{
break;
}
else
{
wprintf(L"EvtNextPublisherId failed with 0x%ud\n", GetLastError());
}
}
}
cleanup:
if (hPublishers)
EvtClose(hPublishers);
}