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.