Partager via


Réception d’événements de modification de stratégie

Le LSA fournit des fonctions que vous pouvez utiliser pour recevoir une notification en cas de modification de stratégie sur le système local.

Pour recevoir une notification, créez un objet d’événement en appelant la fonction CreateEvent , puis appelez la fonction LsaRegisterPolicyChangeNotification . Votre application peut ensuite appeler une fonction d’attente telle que WaitForSingleObject, WaitForSingleObjectEx ou RegisterWaitForSingleObject pour attendre que l’événement se produise. La fonction wait retourne lorsque l’événement se produit ou lorsque le délai d’expiration expire. En règle générale, les événements de notification sont utilisés dans les applications multithread, dans lesquelles un thread attend un événement, tandis que d’autres threads continuent de traiter.

Lorsque votre application n’a plus besoin de recevoir de notifications, elle doit appeler LsaUnregisterPolicyChangeNotification , puis appeler CloseHandle pour libérer le handle d’objet d’événement.

L’exemple suivant montre comment une application à thread unique peut recevoir des événements de notification lorsque la stratégie d’audit du système change.

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

Pour plus d’informations sur les objets d’événement, les fonctions d’attente et la synchronisation, consultez Utilisation d’objets d’événements.