Delen via


Gebeurtenissen voor beleidswijziging ontvangen

De LSA biedt functies die u kunt gebruiken om meldingen te ontvangen wanneer er een wijziging in het beleid op het lokale systeem is.

Als u een melding wilt ontvangen, maakt u een nieuw gebeurtenisobject door de functie CreateEvent aan te roepen en vervolgens de functie LsaRegisterPolicyChangeNotification aan te roepen. Uw toepassing kan vervolgens een wachtfunctie aanroepen, zoals WaitForSingleObject, WaitForSingleObjectExof RegisterWaitForSingleObject wachten tot de gebeurtenis is opgetreden. De wachtfunctie retourneert wanneer de gebeurtenis plaatsvindt of wanneer de time-outperiode verloopt. Normaal gesproken worden meldingsgebeurtenissen gebruikt in toepassingen met meerdere threads, waarbij één thread wacht op een gebeurtenis, terwijl andere threads doorgaan met verwerken.

Wanneer uw toepassing geen meldingen meer hoeft te ontvangen, moet deze LsaUnregisterPolicyChangeNotification- aanroepen en vervolgens CloseHandle- aanroepen om de gebeurtenisobjectingang vrij te maken.

In het volgende voorbeeld ziet u hoe een toepassing met één thread meldingsgebeurtenissen kan ontvangen wanneer het controlebeleid van het systeem verandert.

#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);
}

Zie Gebeurtenisobjecten gebruikenvoor meer informatie over gebeurtenisobjecten, wachtfuncties en synchronisatie.