Получить информацию о поставщике событий Windows

Я хотел бы получить информацию о поставщиках событий с помощью Windows PowerShell? Я использую Windows 8.1 с PowerShell версии 4.0 и заметил, что в _ 1_ namespace, которые предлагают некоторые функции, связанные с обработкой событий Windows.

Я могу создать экземпляр EventProvider, вызвав его конструктор по умолчанию, однако это не позволяет мне получить какую-либо информацию об установленных в системе поставщиках событий.

$EventProvider = New-Object -TypeName System.Diagnostics.Eventing.EventProvider -ArgumentList ([System.Guid]'{00000000-0000-0000-0000-000000000000}');

Как получить дополнительные сведения о поставщиках трассировки событий Windows (ETW), установленных в системе и взаимодействующих с журналами событий Windows с помощью Windows PowerShell?

Я уже знаю, что могу использовать команду logman.exe query providers, как описано здесь, для получения поставщика ETW list и запрашивать журналы событий Windows, но это не очень удобно для PowerShell.


person Trevor Sullivan    schedule 09.01.2014    source источник


Ответы (1)


Существует еще одно пространство имен .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
comment
Я думаю, это для пост-перспективы. попробовал в xp, получая исключение не поддерживаемое. - person Mohan Kumar; 14.06.2018