Compartilhar via


Recebendo eventos de alteração de política

A LSA fornece funções que você pode usar para receber notificação quando houver uma alteração na política no sistema local.

Para receber notificação, crie um novo objeto de evento chamando a função CreateEvent e chame a função LsaRegisterPolicyChangeNotification . Em seguida, seu aplicativo pode chamar uma função de espera como WaitForSingleObject, WaitForSingleObjectEx ou RegisterWaitForSingleObject para aguardar a ocorrência do evento. A função de espera retorna quando o evento ocorre ou quando o período de tempo limite expira. Normalmente, os eventos de notificação são usados em aplicativos multithread, nos quais um thread aguarda por um evento, enquanto outros threads continuam processando.

Quando o aplicativo não precisar mais receber notificações, ele deverá chamar LsaUnregisterPolicyChangeNotification e, em seguida, chamar CloseHandle para liberar o identificador do objeto de evento.

O exemplo a seguir mostra como um aplicativo de thread único pode receber eventos de notificação quando a política de auditoria do sistema é alterada.

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

Para obter mais informações sobre objetos de evento, funções de espera e sincronização, consulte Usando objetos de evento.