Gebeurtenissen voor beleidswijziging ontvangen
De LSA biedt functies die u kunt gebruiken om meldingen te ontvangen wanneer er een wijziging in het beleid op het lokale systeem is.
Als u een melding wilt ontvangen, maakt u een nieuw gebeurtenisobject door de functie CreateEvent aan te roepen en vervolgens de functie LsaRegisterPolicyChangeNotification aan te roepen. Uw toepassing kan vervolgens een wachtfunctie aanroepen, zoals WaitForSingleObject, WaitForSingleObjectExof RegisterWaitForSingleObject wachten tot de gebeurtenis is opgetreden. De wachtfunctie retourneert wanneer de gebeurtenis plaatsvindt of wanneer de time-outperiode verloopt. Normaal gesproken worden meldingsgebeurtenissen gebruikt in toepassingen met meerdere threads, waarbij één thread wacht op een gebeurtenis, terwijl andere threads doorgaan met verwerken.
Wanneer uw toepassing geen meldingen meer hoeft te ontvangen, moet deze LsaUnregisterPolicyChangeNotification- aanroepen en vervolgens CloseHandle- aanroepen om de gebeurtenisobjectingang vrij te maken.
In het volgende voorbeeld ziet u hoe een toepassing met één thread meldingsgebeurtenissen kan ontvangen wanneer het controlebeleid van het systeem verandert.
#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);
}
Zie Gebeurtenisobjecten gebruikenvoor meer informatie over gebeurtenisobjecten, wachtfuncties en synchronisatie.