Ricezione di eventi di modifica dei criteri
LSA fornisce funzioni che è possibile usare per ricevere notifiche quando si verifica una modifica dei criteri nel sistema locale.
Per ricevere la notifica, creare un nuovo oggetto evento chiamando la funzione CreateEvent e quindi chiamare la funzione LsaRegisterPolicyChangeNotification . L'applicazione può quindi chiamare una funzione di attesa, ad esempio WaitForSingleObject, WaitForSingleObjectEx o RegisterWaitForSingleObject per attendere che si verifichi l'evento. La funzione wait restituisce quando si verifica l'evento o quando scade il periodo di timeout. In genere, gli eventi di notifica vengono usati nelle applicazioni multithreading, in cui un thread attende un evento, mentre altri thread continuano l'elaborazione.
Quando l'applicazione non deve più ricevere notifiche, deve chiamare LsaUnregisterPolicyChangeNotification e quindi chiamare CloseHandle per liberare l'handle dell'oggetto evento.
Nell'esempio seguente viene illustrato come un'applicazione a thread singolo può ricevere eventi di notifica quando cambiano i criteri di controllo del sistema.
#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);
}
Per altre informazioni su oggetti evento, funzioni di attesa e sincronizzazione, vedere Uso di oggetti evento.