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 Typ der Authentifizierung für die Authentifizierung des Benutzers. 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. Um auf Daten auf dem Remotecomputer zuzugreifen, muss der Remotecomputer die Windows-Firewall-Ausnahme "Remote Event Log Management" aktivieren. Andernfalls wird beim Versuch, das Sitzungshandle zu verwenden, der Aufruf mit einem RPC_S_SERVER_UNAVAILABLE-Fehler fehlschlagen. Der Computer, mit dem Sie eine Verbindung herstellen, muss Windows Vista oder höher ausführen.
Das folgende Beispiel zeigt, wie eine Verbindung mit einem Remotecomputer hergestellt wird.
#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);
}