Udostępnij za pośrednictwem


Odbieranie zdarzeń zmiany zasad

LSA udostępnia funkcje, których można użyć do odbierania powiadomień w przypadku zmiany zasad w systemie lokalnym.

Aby otrzymywać powiadomienie, utwórz nowy obiekt zdarzenia, wywołując funkcję CreateEvent, a następnie wywołaj funkcję LsaRegisterPolicyChangeNotification. Następnie aplikacja może wywołać funkcję oczekiwania, taką jak WaitForSingleObject, WaitForSingleObjectExlub RegisterWaitForSingleObject, aby czekać na wystąpienie zdarzenia. Funkcja wait zwraca wartość, gdy wystąpi zdarzenie lub kiedy wygasa limit czasu. Zazwyczaj zdarzenia powiadomień są używane w aplikacjach wielowątkowych, w których jeden wątek czeka na zdarzenie, podczas gdy inne wątki kontynuują przetwarzanie.

Gdy aplikacja nie musi już otrzymywać powiadomień, powinna wywołać LsaUnregisterPolicyChangeNotification, a następnie wywołać CloseHandle, aby zwolnić uchwyt dla obiektu zdarzenia.

W poniższym przykładzie pokazano, jak aplikacja jednowątkowa może odbierać zdarzenia powiadomienia po zmianie polityki audytu systemu.

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

Aby uzyskać więcej informacji na temat obiektów zdarzeń, funkcji oczekiwania i synchronizacji, zobacz Using Event Objects.