Ta emot policyändringshändelser
LSA tillhandahåller funktioner som du kan använda för att ta emot meddelanden när det sker en ändring i principen i det lokala systemet.
Om du vill ta emot meddelanden skapar du ett nytt händelseobjekt genom att anropa funktionen CreateEvent och anropa sedan funktionen LsaRegisterPolicyChangeNotification. Ditt program kan sedan anropa en väntefunktion som WaitForSingleObject, WaitForSingleObjectExeller RegisterWaitForSingleObject vänta tills händelsen inträffar. Väntefunktionen returnerar när händelsen inträffar eller när tidsgränsen upphör att gälla. Vanligtvis används meddelandehändelser i flertrådade program, där en tråd väntar på en händelse, medan andra trådar fortsätter bearbetningen.
När programmet inte längre behöver ta emot meddelanden bör det anropa LsaUnregisterPolicyChangeNotification och sedan anropa CloseHandle- för att frigöra händelseobjekthandtaget.
I följande exempel visas hur ett entrådat program kan ta emot meddelandehändelser när systemets granskningsprincip ändras.
#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);
}
Mer information om händelseobjekt, väntefunktioner och synkronisering finns i Använda händelseobjekt.