Zugreifen auf Remotecomputer
Sie können die Windows-Ereignisprotokoll-API verwenden, um auf Daten auf dem lokalen Computer oder auf einem Remotecomputer zuzugreifen. Um auf Daten auf einem Remotecomputer zuzugreifen, müssen Sie die EvtOpenSession-Funktion aufrufen, um einen Remotesitzungskontext zu erstellen. Wenn Sie diese Funktion aufrufen, geben Sie den Namen des Remotecomputers an, mit dem Sie eine Verbindung herstellen möchten, die Benutzeranmeldeinformationen, die zum Herstellen der Verbindung verwendet werden sollen, und den Authentifizierungstyp, der zum Authentifizieren des Benutzers verwendet werden soll. Um den aktuellen Benutzer anzugeben, legen Sie die Elemente Domäne, Benutzer und Kennwort auf NULL fest.
Wenn Sie die Windows-Ereignisprotokoll-API aufrufen, übergeben Sie das Handle an den Remotesitzungskontext, den die EvtOpenSession-Funktion zurückgibt. (Um auf Daten auf dem lokalen Computer zuzugreifen, übergeben Sie NULL , um die Standardsitzung anzugeben.) Für den Zugriff auf Daten auf dem Remotecomputer muss der Remotecomputer die Windows-Firewall-Ausnahme "Remoteereignisprotokollverwaltung" aktivieren. Andernfalls wird beim Versuch, das Sitzungshandle zu verwenden, beim Aufruf ein Fehler mit RPC_S_SERVER_UNAVAILABLE ausgegeben. Auf dem Computer, mit dem Sie eine Verbindung herstellen, muss Windows Vista oder höher ausgeführt werden.
Das folgende Beispiel zeigt, wie Sie eine Verbindung mit einem Remotecomputer herstellen.
#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);
}