Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A Windows Eseménynapló API-val elérheti a helyi számítógépen vagy egy távoli számítógépen tárolt adatokat. Távoli számítógépen lévő adatok eléréséhez meg kell hívnia az EvtOpenSession függvényt egy távoli munkamenet-környezet létrehozásához. Amikor meghívja ezt a függvényt, meg kell adnia annak a távoli számítógépnek a nevét, amelyhez csatlakozni szeretne, a kapcsolat létrehozásához használandó felhasználói hitelesítő adatokat, valamint a felhasználó hitelesítéséhez használandó hitelesítés típusát. Az aktuális felhasználó megadásához állítsa be a tartomány, felhasználó és jelszó elemeket NULLértékre.
Amikor meghívja a Windows Eseménynapló API-t, átadja a leírót annak a távoli munkamenet-környezetnek, amelyet a EvtOpenSession függvény ad vissza. (A helyi számítógépen lévő adatok eléréséhez adja meg NULL az alapértelmezett munkamenet megadásához.) A távoli számítógépen lévő adatok eléréséhez a távoli számítógépnek engedélyeznie kell a "Távoli eseménynapló-kezelés" Windows tűzfalkivételt; ellenkező esetben a munkamenet-leíró használatakor a hívás RPC_S_SERVER_UNAVAILABLE hibát fog eredményezni. A számítógépnek, amelyhez csatlakozik, Windows Vista vagy újabb rendszerűnek kell lennie.
Az alábbi példa bemutatja, hogyan csatlakozhat távoli számítógéphez.
#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);
}