Freigeben über


Empfangen von Richtlinienänderungsereignissen

Die LSA stellt Funktionen bereit, die Sie verwenden können, um Benachrichtigungen zu erhalten, wenn eine Änderung der Richtlinie auf dem lokalen System erfolgt.

Um Benachrichtigungen zu erhalten, erstellen Sie ein neues Ereignisobjekt, indem Sie die CreateEvent-Funktion aufrufen, und rufen Sie dann die LsaRegisterPolicyChangeNotification-Funktion auf. Ihre Anwendung kann dann eine Wartefunktion wie WaitForSingleObject, WaitForSingleObjectEx oder RegisterWaitForSingleObject aufrufen, um auf das Eintreten des Ereignisses zu warten. Die Wartefunktion gibt zurück, wenn das Ereignis auftritt oder wenn der Timeoutzeitraum abläuft. In der Regel werden Benachrichtigungsereignisse in Multithreadanwendungen verwendet, in denen ein Thread auf ein Ereignis wartet, während andere Threads die Verarbeitung fortsetzen.

Wenn Ihre Anwendung keine Benachrichtigungen mehr empfangen muss, sollte sie LsaUnregisterPolicyChangeNotification und dann CloseHandle aufrufen, um das Ereignisobjekthandle frei zu geben.

Das folgende Beispiel zeigt, wie eine Singlethreadanwendung Benachrichtigungsereignisse empfangen kann, wenn sich die Überwachungsrichtlinie des Systems ändert.

#include <windows.h>
#include <stdio.h>

void WaitForPolicyChanges()
{
  HANDLE hEvent;
  NTSTATUS ntsResult;
  DWORD dwResult;

  // Create an event object.
  hEvent = CreateEvent( 
    NULL,  // child processes cannot inherit 
    FALSE, // automatically reset event
    FALSE, // start as a nonsignaled event
    NULL   // do not need a name
  );

  // Check that the event was created.
  if (hEvent == NULL) 
  {
    wprintf(L"Event object creation failed: %d\n",GetLastError());
    return;
  }
  // Register to receive auditing policy change notifications.
  ntsResult = LsaRegisterPolicyChangeNotification(
    PolicyNotifyAuditEventsInformation,
    hEvent
  );
  if (STATUS_SUCCESS != ntsResult)
  {
    wprintf(L"LsaRegisterPolicyChangeNotification failed.\n");
    CloseHandle(hEvent);
    return;
  }

  // Wait for the event to be triggered.
  dwResult = WaitForSingleObject( 
    hEvent, // handle to the event object
    300000  // time-out interval, in milliseconds
  );

  // The wait function returned.
  if (dwResult == WAIT_OBJECT_0)
  {  // received the notification signal
    wprintf(L"Notification received.\n");
  } 
  else 
  {  // received a time-out or error
    wprintf(L"Notification was not received.\n");
  }
  // Unregister for notification.
  LsaUnregisterPolicyChangeNotification(
    PolicyNotifyAuditEventsInformation,
    hEvent
  );

  // Free the event handle.
  CloseHandle(hEvent);
}

Weitere Informationen zu Ereignisobjekten, Wartefunktionen und Synchronisierung finden Sie unter Verwenden von Ereignisobjekten.