Dela via


Ta emot policyändringshändelser

LSA tillhandahåller funktioner som du kan använda för att ta emot meddelanden när det sker en ändring i principen i det lokala systemet.

Om du vill ta emot meddelanden skapar du ett nytt händelseobjekt genom att anropa funktionen CreateEvent och anropa sedan funktionen LsaRegisterPolicyChangeNotification. Ditt program kan sedan anropa en väntefunktion som WaitForSingleObject, WaitForSingleObjectExeller RegisterWaitForSingleObject vänta tills händelsen inträffar. Väntefunktionen returnerar när händelsen inträffar eller när tidsgränsen upphör att gälla. Vanligtvis används meddelandehändelser i flertrådade program, där en tråd väntar på en händelse, medan andra trådar fortsätter bearbetningen.

När programmet inte längre behöver ta emot meddelanden bör det anropa LsaUnregisterPolicyChangeNotification och sedan anropa CloseHandle- för att frigöra händelseobjekthandtaget.

I följande exempel visas hur ett entrådat program kan ta emot meddelandehändelser när systemets granskningsprincip ändras.

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

Mer information om händelseobjekt, väntefunktioner och synkronisering finns i Använda händelseobjekt.