Сообщения о событиях
октября 12 2009 by admin in АдминистрированиеПроцесс передачи сообщений о событиях довольно прост, однако вы должны понять все в целом, прежде чем начать использовать регистрацию событий. Собирая мозаику, мы первым делом выбираем самую простую ее часть, точно так же мы поступим и сейчас — начнем с процесса передачи сообщений. Если ваш процесс хочет передать в регистрационный файл сообщение о событии, он должен зарегистрировать источник события с помощью функции:
HANDLE RegisterEventSource( PCTSTR pszMachineName, PCTSTR pszSourceName);
Параметр pszMachineName определяет систему, хранящую регистрационные файлы, в которые должны быть добавлены записи о событиях. Если передать в него NULL, будет открыт файл на локальном компьютере. Сведения о событиях сохраняются в регистрационных файлах удаленных компьютеров очень редко.
Параметр pszSourceName — это название источника события. Текст, содержащийся в нем, показывается в колонке источника модульного компонента Event Viewer. Это название не всегда, но часто совпадает с именем программы, сгенерировавшей событие.
В случае успешного выполнения RegisterEventSource возвращает описатель, с помощью которого ваше приложение сможет сообщать о событиях. Не забывайте: система должна быть уведомлена об окончании работы с таким описателем (точно так же, как и с любым другим). Для этого служит функция DeregisterEventSource:
BOOL DeregisterEventSource(HANDLE hEventLog);
Пока все хорошо, не так ли? Передача сообщения о событии тоже очень простая задача. Выполняется она с помощью функции:
BOOL ReportEvent( HANDLE hEventLog, WORD wType, WORD wCategory, DWORD dwEventID, PSID psidUser, WORD wNumStrings, DWORD dwDataSize, PCTSTR* ppszStrings, PVOID pvRawData);
Параметр hEventLog — это описатель, возвращаемый RegisterEventSource. Параметр iv'Type — один из пяти предопределенных типов событий. wCategory1 и dwEventID — выбранные вами произвольные значения. Параметр dwEventID является идентификатором, однозначно определяющим события вашего источника. Такими идентификаторами могут быть любые произвольные числа, расположенные в любом порядке. Однако категория события, поназывающая определяемую источником группу событий, может быть только числом больше I. 0 зарезервирован для указания отсутствия категории. Параметр psidUser идентифицирует пользователя, но не служит для введения защитных ограничений. Для указания событий, не связанных с пользователем, в этот параметр передается NULL.
Параметр ppszSlrings указывает на массив текстовых строк, которые будут связаны с событием, в wNumStrings помещают количество этих строк. (Параметр ppszStrings описан ниже в разделе «Создание DLL- и ЕХЕ-файлов сообщений».) И, наконец, параметр pvRawData указывает на блок двоичных данных, связываемых с событием. В dwDataSize заносится размер этого блока в байтах. Передаваемая информация определяется приложением, сообщающим о событии, это могут быть любые сведения, которые, по вашему мнению, будут полезны администратору или пользователю. Например, сетевые драйверы помещают в некоторые события необработанные данные пакетов.
Согласно документации, для регистрации событий достаточно вышеописанных функций. Технически это так, но при этом упускаются некоторые ключевые моменты. Сравнив информацию, передаваемую нами службе Event Log с помощью функции ReportEvent, с отображаемой компонентом Event Viewer, вы увидите, что некоторых данных нет. Например, мы передаем номер категории, a Event Viewer показывает текстовую строку. Кроме того, ни в Register-EventSource, ни в ReportEvent нельзя указать, в каком регистрационном файле сохранять события (в Application, System или Security). И, наконец, вы наверняка уже заметили, что ReportEvent не хватает параметров для передачи подробного сообщения о событии.
По умолчанию все эти функции помещают события в регистрационный файл Application. В него включается характерное для события подробное описание, после чего добавляется переданная вами информация. Мы бы могли остановиться на этом, но ваши пользователи будут вам благодарны, если вы пойдете дальше и реализуете собственные описания и категории событий. Чтобы все это сделать, нужно разобраться в целях регистрации событий.