Использование API ведения журнала для родительского контроля
Отчеты о действиях (ведение журнала)
Файл заголовка WpcEvent.h содержит определения полей для каждого предопределенного типа события действия и настраиваемого типа. В этом примере кода показаны шаги для ведения журнала события приглашения на беседу с мгновенными сообщениями с помощью API публикации etw:
#include <windows.h>
#include <evntprov.h>
#include <wpcevent.h>
#pragma comment(lib, "advapi32.lib")
#define BYTELEN(x) ((wcslen(x) + 1) * sizeof(WCHAR))
void main()
{
REGHANDLE hWpc = 0;
// Register
ULONG res = EventRegister(&WPCPROV, NULL, NULL, &hWpc);
// Log an event
PCWSTR pcszAppName = L"SuperIM";
PCWSTR pcszAppVersion = L"7.0";
PCWSTR pcszAccountName = L"Kate";
PCWSTR pcszConvID = L"102";
PCWSTR pcszRequestingIP = L"192.168.2.100";
PCWSTR pcszSender = L"imperson@isp.com";
const DWORD dwReason = WPCFLAG_ISBLOCKED_NOTBLOCKED;
const DWORD dwRecipCount = 1;
PCWSTR pcszRecipient = L"otherim@isp.com";
EVENT_DATA_DESCRIPTOR eventData[WPC_ARGS_CONVERSATIONINITEVENT_CARGS];
EventDataDescCreate(&eventData[WPC_ARGS_CONVERSATIONINITEVENT_APPNAME],
(const PVOID)pcszAppName, (ULONG)BYTELEN(pcszAppName));
EventDataDescCreate(&eventData[WPC_ARGS_CONVERSATIONINITEVENT_APPVERSION],
(const PVOID)pcszAppVersion,(ULONG)BYTELEN(pcszAppVersion));
EventDataDescCreate(
&eventData[WPC_ARGS_CONVERSATIONINITEVENT_ACCOUNTNAME],
(const PVOID)pcszAccountName, (ULONG)BYTELEN(pcszAccountName));
EventDataDescCreate(&eventData[WPC_ARGS_CONVERSATIONINITEVENT_CONVID],
(const PVOID)pcszConvID, (ULONG)BYTELEN(pcszConvID));
EventDataDescCreate(
&eventData[WPC_ARGS_CONVERSATIONINITEVENT_REQUESTINGIP],
(const PVOID)pcszRequestingIP, (ULONG)BYTELEN(pcszRequestingIP));
EventDataDescCreate(&eventData[WPC_ARGS_CONVERSATIONINITEVENT_SENDER],
(const PVOID)pcszSender, (ULONG)BYTELEN(pcszSender));
EventDataDescCreate(&eventData[WPC_ARGS_CONVERSATIONINITEVENT_REASON],
(const PVOID)&dwReason, sizeof(dwReason));
EventDataDescCreate(&eventData[WPC_ARGS_CONVERSATIONINITEVENT_RECIPCOUNT],
(const PVOID)&dwRecipCount, sizeof(dwRecipCount));
EventDataDescCreate(&eventData[WPC_ARGS_CONVERSATIONINITEVENT_RECIPIENT],
(const PVOID)pcszRecipient, (ULONG)BYTELEN(pcszRecipient));
ULONG lRet = EventWrite(hWpc, &WPCEVENT_IM_INVITATION, ARRAYSIZE(eventData), eventData);
// Unregister
EventUnregister(hWpc);
}
Настраиваемое ведение журнала
Чтобы приложение расширило регистрированные события за пределами набора предопределенных событий или одного настраиваемого типа, необходимо определить для этого поставщика в манифесте приложения. Затем можно импортировать канал WPC по умолчанию и заносить в журнал события, определяемые приложением.
Права ведения журнала
Канал ведения журнала WPC управляется списком управления доступом (ACL), чтобы предоставить полный доступ только администраторам. Учетные записи, не являющиеся администраторами, могут выполнять запись в канал, но не имеют доступа для чтения или удаления. Доступ к каналу осуществляется с помощью API трассировки событий Windows.
Сведения о поставщике ведения журнала родительского контроля
Поставщик WPC называется Microsoft.com/Windows/ParentalControls с GUID {01090065-B467-4503-9B28-533766761087}. Локальный канал ведения журнала по умолчанию — Microsoft.com/Windows/ParentalControls/LocalEvents.
Файлы журналов хранятся в папке Windows\System32\Wpc\Logs.
Уведомление о предстоящем выходе из системы ограничения времени
Система родительского контроля будет запускать предупреждение через 15 минут и снова через 1 минуту перед выходом контролируемого пользователя в зависимости от ограничений по времени. Приложения могут подписываться на эти события, особенно если они выполняются в полноэкранном режиме DirectX, где не отображаются стандартные уведомления Windows. Предоставляется пример кода, показывающий, как подписаться на события, зарегистрировать функцию обратного вызова и получить события.
Связанные темы