Существует еще одно пространство имен .NET под названием System.Diagnostics.Eventing.Reader
, которое содержит намного больше классов .NET, которые позволяют получать информацию о поставщиках трассировки событий для Windows (ETW) и журналах событий, зарегистрированных в операционной системе Windows. Большинство этих типов определены в System.Core.dll
.NET Assembly в .NET Глобальный кэш сборок (GAC).
Например, вы можете выполнять следующие действия (и не только):
- Узнайте имена поставщиков ETW, установленных на компьютере
- Откройте для себя полный список имен журналов ETW, присутствующих на компьютере
- Перечислить метаданные, связанные с поставщиками ETW
- Экспорт данных журнала событий
Имена поставщиков ETW
Одна из основных функций ETW - получение списка поставщиков ETW, установленных в данной системе. Вы можете легко получить эту информацию с помощью типов .NET Framework в пространстве имен System.Diagnostics.Eventing.Reader
. Так уж случилось, что есть класс .NET с именем EventLogSession
, и в этом классе есть статическое свойство с именем GlobalSession
, которое автоматически извлекает сеанс / соединение со службой журнала событий на локальном компьютере. При необходимости вы также можете подключиться к удаленному компьютеру с помощью одного из конструкторов класса EventLogSession
.
После получения экземпляра класса EventLogSession
можно вызвать метод GetProviderNames()
, чтобы получить коллекцию объектов String
, представляющих имена установленных на компьютере поставщиков трассировки событий Windows.
Вот пример получения имен провайдеров с локального компьютера:
$EventSession = [System.Diagnostics.Eventing.Reader.EventLogSession]::GlobalSession;
$EventProviderNames = $EventSession.GetProviderNames();
$EventProviderNames;
Вот пример получения имен поставщиков ETW с удаленного компьютера с помощью альтернативный конструктор:
$EventSession = New-Object -TypeName System.Diagnostics.Eventing.Reader.EventLogSession -ArgumentList server01.contoso.com;
$EventProviderNames = $EventSession.GetProviderNames();
$EventProviderNames;
Вы можете использовать другой конструктор класса EventLogSession
, чтобы указать альтернативные учетные данные для удаленного компьютера. альтернативный конструктор для класса EventLogSession
требуются следующие параметры:
- Имя компьютера
- Доменное имя
- Имя пользователя
- Пароль (как
SecureString
)
System.Diagnostics.Eventing.Reader.SessionAuthentication
тип
Вот пример того, как этого добиться:
$ComputerName = 'server01.contoso.com';
$Credential = Get-Credential;
$ArgumentList = $ComputerName, $Credential.UserName.Split('\')[0], $Credential.UserName.Split('\')[1], $Credential.Password, [System.Diagnostics.Eventing.Reader.SessionAuthentication]::Default;
$EventSession = New-Object -TypeName System.Diagnostics.Eventing.Reader.EventLogSession -ArgumentList $ArgumentList;
Имена журналов ETW
После того, как вы обнаружите все поставщики трассировки событий Windows, установленные на компьютере, вы также можете изучить полный список журналов трассировки событий Windows, доступных на компьютере. Класс EventLogSession
также имеет метод GetLogNames()
, который возвращает коллекцию из String
объектов, представляющих журналы трассировки событий Windows, доступные в целевой системе. Подобно методу GetProviderNames()
, вы можете вызвать GetLogNames()
на локальном или удаленном компьютере.
Вот пример получения имен журналов трассировки событий Windows с локального компьютера:
$EventSession = [System.Diagnostics.Eventing.Reader.EventLogSession]::GlobalSession;
$EventLogNames = $EventSession.GetLogNames();
$EventLogNames;
Вот пример получения имен журналов трассировки событий Windows с удаленного компьютера:
$EventSession = New-Object -TypeName System.Diagnostics.Eventing.Reader.EventLogSession -ArgumentList server01.contoso.com;
$EventLogNames = $EventSession.GetLogNames();
$EventLogNames;
Метаданные поставщика ETW
Помимо получения имен поставщиков ETW, вы также можете получить более подробную информацию о них. Это можно сделать с помощью класса ProviderMetadata
в классе System.Diagnostics.Eventing.Reader
.NET. Информация, предоставляемая классом ProviderMetadata
, включает:
- Отображаемое имя провайдера
- Ссылка на справку (URL)
- Ключевые слова для провайдера
- Идентификатор поставщика ETW (GUID)
- Путь к файлу сообщения
- Путь к файлу ресурсов
- Путь к файлу параметров
- Задачи, предоставляемые провайдером
- Метаданные событий для каждого события, объявленного поставщиком
Подобно именам поставщиков ETW и журналов ETW, вы можете получать метаданные поставщика из локальной или удаленной системы. В последнем случае вы должны установить экземпляр EventLogSession
, прежде чем пытаться создать экземпляр класса ProviderMetadata
.
Вот пример получения метаданных поставщика ETW из локальной системы:
# Get the EventLogSession object
$EventSession = [System.Diagnostics.Eventing.Reader.EventLogSession]::GlobalSession;
# Get the ETW provider names
$EventProviderNames = $EventSession.GetProviderNames();
# Create an empty array to hold the ProviderMetadata instances
$ProviderMetadataList = @();
# For each ETW provider name ...
foreach ($EventProvider in $EventProviderNames) {
# Add each ProviderMetadata instance to the array
$ProviderMetadataList += New-Object -TypeName System.Diagnostics.Eventing.Reader.ProviderMetadata -ArgumentList $EventProvider;
}
# Explore the 16th item from the ProviderMetadata array
$ProviderMetadataList[15];
Чтобы получить метаданные поставщика ETW из удаленной системы, создайте объект EventLogSession
перед созданием экземпляра класса ProviderMetadata
, а когда вы действительно создаете экземпляр ProviderMetadata
, убедитесь, что вы передали следующие параметры в constructor:
- Имя поставщика ETW
EventLogSession
экземпляр
CultureInfo
объект
...
$ComputerName = 'server01.contoso.com';
$Credential = Get-Credential;
$SessionArgumentList = $ComputerName, $Credential.UserName.Split('\')[0], $Credential.UserName.Split('\')[1], $Credential.Password, [System.Diagnostics.Eventing.Reader.SessionAuthentication]::Kerberos;
$EventSession = New-Object -TypeName System.Diagnostics.Eventing.Reader.EventLogSession -ArgumentList $SessionArgumentList;
$EventProviderNames = $EventSession.GetProviderNames();
# Create an empty array to hold the ProviderMetadata instances
$ProviderMetadataList = @();
foreach ($EventProvider in $EventProviderNames) {
# Build the Arguments for the ProviderMetadata constructor
$ProviderMetadataArgumentList = $EventProvider, $EventSession, [CultureInfo]::CurrentCulture;
# Add each ProviderMetadata instance to the array
$ProviderMetadataList += New-Object -TypeName System.Diagnostics.Eventing.Reader.ProviderMetadata -ArgumentList $ProviderMetadataArgumentList;
}
# Explore the 111th item from the array
$ProviderMetadataList[110];
Примечание. При создании экземпляров ProviderMetadata
объектов через аутентифицированные соединения могут возникнуть некоторые исключения:
New-Object: исключение, вызывающее «.ctor» с аргументом (ами) «3»: «Попытка выполнить несанкционированную операцию».
Чтение журналов событий ETW
Поскольку вы упомянули, что хотите также читать события из журналов событий ETW, это легко сделать и с типами в пространстве имен System.Diagnostics.Eventing.Reader
.NET. Класс EventLogReader
содержит метод с именем ReadEvent()
, который постоянно считывает следующие события из журнала событий, указанного при создании экземпляра EventLogReader
.
Вот простой пример чтения событий из журнала системных событий:
# Instantiate the EventLogReader .NET class
$EventLogReader = New-Object -TypeName System.Diagnostics.Eventing.Reader.EventLogReader -ArgumentList 'System';
# Read the first 5 events from the event log
1..5 | % { $EventLogReader.ReadEvent(); };
Конфигурация журнала событий ETW
Подобно метаданным поставщика, полученным ранее, вы можете получить информацию о конфигурации конкретного журнала событий трассировки событий Windows. Для этого вы создаете экземпляр _ 42_ класс, передав имя журнала событий ETW. Будет возвращена разнообразная информация о журнале событий, в том числе:
- Имя журнала
- Максимальный размер (в байтах)
- Имя (а) провайдера
- Тип журнала
- Дескриптор безопасности
- Размер буфера
- Журнал включен?
Вот пример того, как получить эту информацию:
$EventSession = [System.Diagnostics.Eventing.Reader.EventLogSession]::GlobalSession;
$EventLogNames = $EventSession.GetLogNames();
$EventLogConfigurationList = @();
foreach ($EventLogName in $EventLogNames) {
$EventLogConfigurationList += New-Object -TypeName System.Diagnostics.Eventing.Reader.EventLogConfiguration -ArgumentList $EventLogName;
}
$EventLogConfigurationList[5];
person
Trevor Sullivan
schedule
09.01.2014